通过SqlSessionFactoryBuilder创建会话工SqlSessionFactory 将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder 在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可 通过SqlSessionFactory创建SqlSession,使用单例模式管理(工厂一旦创建,使用一个实例)。 将mybatis和spring整合后,使用单例模式管理SqlSessionFactory
SqlSession:
SqlSession是一个面向用户(程序员)的接口。 SqlSession中提供了很多操作数据库的方法,如:selectOne(返回单个对象),selectList(返回单个或多个对象) SqlSession是线程不安全,在SqlSession实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性
SqlSession最佳应用场合在方法体内,定义成局部变量。
(1) 程序员需要写dao接口和dao实现类 (2) 需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
项目右键-new resrouce folder-创建test 在UserDaoImpl中选择一个方法进行测试
public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; /** * Test method for {@link edu.tjut.dao.UserDaoImpl#findUser(int)}. * @throws IOException */ //此方法是在执行testFindUser()之前执行 @Before public void setUp() throws IOException { //创建sqlSessionFactory //mybatis配置文件 String resource = "SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUser() { //创建UserDao的对象 UserDao userDao = new UserDaoImpl(sqlSessionFactory); //调用UserDao的方法 User user = userDao.findUser(1); System.out.println(user); } }1)dao接口实现类方法中存在大量的模板方法,设想是否将这些代码提取出来,大大减轻程序员的工作量。 2)调用sqlSession方法时将statement的id硬编码了 3)调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发
(1) dao接口实现类方法中存在大量模板方法。设想能否将这些代码
(2)调用SqlSession方法时将statement的id硬编码了。
(3)调用SqlSession方法时传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
3.1.1 程序员只需要编写mapper.xml映射文件
3.1.2 程序员只需要编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范: 1、在mapper.xml中namespace等于mapper接口地址 namespace命名空间,作用就是对SQL进行分类话管理,理解成SQL隔离 注意:使用mapper代理方法开发,namespace有特殊的重要作用,namespace等于mapper接口地址
<mapper namespace="edu.tjut.mapper.UserMapper"> 2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入的参数类型和mapper.xml中statement的parameterType指定的类型一致 4、mapper.java接口中的方法返回值的类型和mapper.xml中statement的resultType指定的类型一致。
以上开发规范主要是对下面的代码进行统一生成 User user = sqlSession.selectOne(“test.findUserById”,id); sqlSession.insert(“test.insertUser”, user); ……
其实,就是通过上述的规范代码生成mapper接口实现类的代理对象(也就是UserDaoImpl的内容)
注意SqlMapConfig中加载映射文件:
<!-- 加载映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> <mapper resource="mapper/UserMapper.xml"/> </mappers>测试代码:
@Test public void testFindUserById() { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 User user = userMapper.findUserById(7); System.out.println(user); } 如果mapper方法返回单个的pojo对象,代理对象内部通过selectOne查询数据库。 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库
系统框架中,dao层的代码是被业务层公用的 即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求
注意:持久层方法的参数可以包装类型、map…,service方法中建议不要使用包装类型(不利于业务层的可扩展性)
