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); } }