mybatis 基本开发
mybatis api
@Test
public void deleteUser() throws IOException {
// mybatis全局配置文件
String resource = "SqlMapConfig.xml";
// 构造全局配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构造SqlSessionFactory会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建会话
SqlSession session = factory.openSession();
// 删除用户
session.delete("test.deleteUser", 24);
// 提交事务
session.commit();
// 关闭会话
session.close();
}
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用.
最佳使用范围是方法范围即方法体内局部变量。
SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,默认使用DefaultSqlSessionFactory。SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用。
通常以单例模式管理SqlSessionFactory。
SqlSession
SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。
加载过程
// 创建会话,默认实现DefaultSqlSession
SqlSession session = factory.openSession();
- 加载数据源等配置信息
- 创建数据库连接
- 创建事务对象
- 创建Executor对象
- 操作数据库
每个线程都有一个SqlSession实例。SqlSession实例不能共享,它也是线程不安全的。因此需要把它作为局部变量或者参数传入。绝对不可以作为静态常量来使用。
打开SqlSession,需要进行关闭close。
原始dao的开发
所谓原始dao,就是开发人员自己手动编写dao接口和实现。
问题:
- dao方法有很多重复代码,需要开发者手动对SqlSession进行创建、调用、关闭
- 操作sql时,还要手动指定映射文件的id,存在硬编码,不利于开发
mapper动态代理
官方推荐
所谓mapper动态代理,就是开发人员只需要手动编写dao接口,而具体实现由mybatis框架来创建一个动态代理对象。
遵循的规范:
- mapper.xml文件中的namespace和mapper接口的类路径一致。
- mapper.xml中定义的每个statement的id和mapper接口中的方法名称一致。
- mapper.xml中定义的每个statement的parameterType和mapper接口中的方法的入参类型一致。
- mapper.xml中定义的每个statement的resultType和mapper接口中的方法的返回值类型一致。