文章目录
1.配置文件标签解读
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
1.属性翻译
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
2.dataSource
配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/bobo?useSSL=false&useUnicode=true&characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource>
dataSource使用标准的JDBC数据源接口来配置JDBC,有三种数据源
POOLED(常用) |UNPOOLED | JNDI(不推荐)
POOLED:利用池的原理,使用完毕后会将数据返回池中
UNPOOLED:没有利用池,每一个数据库操作都会创建一个新的连接,用完就会关闭
JNDI:在服务器,spring容器中使用,容器集中或在外部配置数据源,然后放置一个JNDI上下文的引用
3.transactionManager
JDBC中通过Connection对象进行事务管理,不提交,数据不会真正的插入到数据库中
通过commit方法进行提交,rollback方法进行回滚
<transactionManager type="JDBC"></transactionManager>
4.environment
配置mybatis的多套运行环境,将sql映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default来指定)
<!-- 配置环境-->
<environments default="mysql">
<!-- 配置mysql的和环境-->
<environment id="mysql">
</environment>
</environments>
5.mappers
映射器:定义映射sql语句文件
通过映射器告诉mybatis到哪里找到映射文件
<!-- 配置映射文件的位置-->
<mappers>
//使用xml配置 用resource
<mapper resource="cn/bobo/IUserDao/IUserDao.xml"></mapper>
//使用注释设置 用class来设置
<!-- <mapper class="cn.bobo.IUserDao.IUserDao"></mapper>-->
</mappers>
6.namespace
namespace 的命名必须跟某个接口同名,接口中的方法与映射文件中的sql语句id应该一一对应,用来区别不同的mapper
命名规则: 包名+类名
<mapper namespace="cn.bobo.IUserDao.IUserDao"></mapper>
7.生命周期和作用域
流程图
**
SqlSessionFactoryBulider 的作用在于创建SqlSessionFactory,创建成功后,其就失去了作用
SQLSessionFactory作用是创建SqlSession接口对象,其生命周期等同于Mybatis的应用周期,
由于SqlSessopmFactory是一个对数据库的链接池。创建几个就会出现几个数据池,所以要避免这种情况的产生。
而此时,Sqlsession就相当于一个数据库连接,可以在一个书屋李执行多条sql,然后通过他的commit,rollback等方法,提价或者回滚事务,所以它应该存活于一个业务请求中,处理完毕整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory中,否则数据库资源就很快被耗费精光了。所以要使用try…catch finally 语句来保证其是否正确关闭。
2.CRUD增删改查实现
注意:其中增删改操作需要提交事务
1.创立实体类:
package cn.bobo.UserDao;
import java.io.Serializable;
public class user implements Serializable {
private Integer id;
private String name;
private String pw;
@Override
public String toString() {
return "user{" +
"id=" + id +
", name='" + name + '\'' +
", pw='" + pw + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
}
2.实现接口:
package cn.bobo.IUserDao;
import cn.bobo.UserDao.user;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface IUserDao {
//查询所有
List<user> findall();
//保存用户
void saveUser(user user);
//更新用户
void updateUser(user user);
//删除用户
void deleteUser(Integer userid);
//查询id
user findidUser(Integer id);
//模糊查询
List<user> findbyName(String username);
//查询总用户数
int countUser();
}
3.sql中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bobo.IUserDao.IUserDao">
<select id="findall" resultType="cn.bobo.UserDao.user">
select * from user;
</select>
<!-- 保存用户-->
<insert id="saveUser" parameterType="cn.bobo.UserDao.user">
insert into user(id, name, pwd)values(#{id},#{name},#{pw});
</insert>
<!-- 更新用户-->
<update id="updateUser" parameterType="cn.bobo.UserDao.user">
update user set id=#{id},name=#{name},pwd=#{pw} where id=#{id}
</update>
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{uid}
</delete>
<!-- 查询id-->
<select id="findidUser" parameterType="int" resultType="cn.bobo.UserDao.user">
select * from user where id =#{uid}
</select>
<!-- 模糊查询-->
<select id="findbyName" parameterType="String" resultType="cn.bobo.UserDao.user">
select * from user where user.name like #{name}
</select>
<!-- 获取用户记录总条数-->
<select id="countUser" resultType="int">
select count(id) from user;
</select>
</mapper>
4.测试类中实现:
package cn.bobo;
import cn.bobo.IUserDao.IUserDao;
import cn.bobo.UserDao.user;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class test1 {
public InputStream in;
public SqlSession sqlSession;
public IUserDao userDao;
public SqlSessionFactory factory;
@Before
public void init() throws IOException {
// 1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("mybatis.xml");
// 2. 获取SqlSwssionFactory
factory = new SqlSessionFactoryBuilder().build(in);
// 3.获取SqlSession对象
sqlSession = factory.openSession();
// 4. 获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
// 5.查询执行所有方法
}
@After
// 6. 释放资源
public void destroy() throws IOException {
// 提交事务
sqlSession.commit();
sqlSession.close();
in.close();
}
@Test
public void testfindall() throws IOException {
List<user> users = userDao.findall();
for (user user1 : users) {
System.out.println(user1);
}
}
@Test
public void testSave() {
user user1 = new user();
user1.setId(2);
user1.setName("luhua");
user1.setPw("asd");
// 保存方法
userDao.saveUser(user1);
}
@Test
public void testUpdate() {
user user1 = new user();
user1.setId(9);
user1.setName("wuhu");
user1.setPw("6513312");
// 执行更新方法
userDao.updateUser(user1);
}
@Test
public void testdelete() {
userDao.deleteUser(1);
}
@Test
public void testfindid(){
user user = userDao.findidUser(2);
System.out.println(user);
}
@Test
public void testfindname(){
List<user> users = userDao.findbyName("%小%");
for (user user : users){
System.out.println(user);
}
}
@Test
public void testfindCount(){
int count = userDao.countUser();
System.out.println(count);
}
}