1、第10章 MyBatis DAO开发10.1 SqlSession的使用范围10.2 原始DAO开发方法10.3 Mapper接口开发方法第10章 MyBatis DAO开发10.1 SqlSession的使用范围第10章 MyBatis DAO开发10.1.1 SqlSessionFactoryBuilderSqlSessionFactoryBuilder用于创建SqlSessionFacoty,一旦SqlSessionFacoty创建完成就不需要SqlSessionFactoryBuilder了。此处可将SqlSessionFactoryBuilder当成一个工具类使用,其最佳使用范围是方
2、法范围即方法体内局部变量。10.1.2 SqlSessionFactorySqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。10.1.3 SqlSessionSqlSession是一个面向用户的接口,定义了数据库操作,默认使用DefaultSqlSession实现类。执行过程如下:加载数据源等配置信息。Environment environment=configuration.getEnvironment
3、();创建数据库链接。第10章 MyBatis DAO开发 创建事务对象。创建Executor,SqlSession所有操作都是通过Executor完成。MyBatis源码如下:if(ExecutorType.BATCH=executorType)executor=newBatchExecutor(this,transaction);elseif(ExecutorType.REUSE=executorType)executor=new ReuseExecutor(this,transaction);else executor=new SimpleExecutor(this,transactio
4、n);if(cacheEnabled)executor=new CachingExecutor(executor,autoCommit);SqlSession的实现类即DefaultSqlSession,此对象中对操作数据库实质上用的是Executor。第10章 MyBatis DAO开发结论:每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finall
5、y 块中以确保每次都能执行关闭。如下:SqlSession session=sqlSessionFactory.openSession();try /do work finally session.close();第10章 MyBatis DAO开发10.2 原始DAO开发方法第10章 MyBatis DAO开发10.2.1 映射文件select*from user where id=#id第10章 MyBatis DAO开发 select LAST_INSERT_ID()insert into user(username,birthday,sex,address)values(#userna
6、me,#birthday,#sex,#address)10.2.2 DAO接口Public interface UserDao public User getUserById(int id)throws Exception;public void insertUser(User user)throws Exception;Public class UserDaoImpl implements UserDao 第10章 MyBatis DAO开发 /注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory
7、)this.setSqlSessionFactory(sqlSessionFactory);private SqlSessionFactory sqlSessionFactory;Override public User getUserById(int id)throws Exception SqlSession session=sqlSessionFactory.openSession();User user=null;try /通过SqlSession调用selectOne方法获取一条结果集 /参数1:指定定义的statement的id,参数2:指定向statement中传递的参数 第10
8、章 MyBatis DAO开发 user=session.selectOne(test.findUserById,1);System.out.println(user);finally session.close();return user;Override Public void insertUser(User user)throws Exception SqlSession sqlSession=sqlSessionFactory.openSession();try sqlSession.insert(insertUser,user);第10章 MyBatis DAO开发 sqlSmit(
9、);finally session.close();第10章 MyBatis DAO开发10.3 Mapper接口开发方法第10章 MyBatis DAO开发10.3.1 实现原理Mapper接口开发方法只需要程序员编写Mapper接口(相当于DAO接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边DAO接口实现类方法。Mapper接口开发需要遵循以下规范:(1)Mapper.xml文件中的namespace与mapper接口的类路径相同。(2)Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。(3)Mapper接口方法的
10、输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同。(4)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。10.3.2 Mapper.xml(映射文件)定义Mapper映射文件UserMapper.xml(内容同Users.xml),需要将namespace的值修改为UserMapper接口路径。将UserMapper.xml放在classpath的mapper目录下。select*from user where id=#id select*from user where username li
11、ke%$value%第10章 MyBatis DAO开发 select LAST_INSERT_ID()insert into user(username,birthday,sex,address)values(#username,#birthday,#sex,#address)10.3.3 Mapper.java(接口)/*用户管理Mapper*/第10章 MyBatis DAO开发Public interface UserMapper /根据用户id查询用户信息 public User findUserById(int id)throws Exception;/查询用户列表 public
12、List findUserByUsername(String username)throws Exception;/添加用户信息 public void insertUser(User user)throws Exception;接口定义有如下特点:(1)Mapper接口方法名和Mapper.xml中定义的statement的id相同。(2)Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同。(3)Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同。第10章 M
13、yBatis DAO开发10.3.4 加载UserMapper.xml文件修改SqlMapConfig.xml文件:10.3.5 测试Public class UserMapperTest extends TestCase private SqlSessionFactory sqlSessionFactory;protected void setUp()throws Exception /MyBatis配置文件 String resource=sqlMapConfig.xml;第10章 MyBatis DAO开发 InputStream inputStream=Resources.getRes
14、ourceAsStream(resource);/使用SqlSessionFactoryBuilder创建sessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);Public void testFindUserById()throws Exception /获取session SqlSession session=sqlSessionFactory.openSession();/获取Mapper接口的代理对象 UserMapper userMapper=session.getMappe
15、r(UserMapper.class);/调用代理对象方法 User user=userMapper.findUserById(1);System.out.println(user);第10章 MyBatis DAO开发 /关闭session session.close();Test public void testFindUserByUsername()throws Exception SqlSession sqlSession=sqlSessionFactory.openSession();UserMapper userMapper=sqlSession.getMapper(UserMap
16、per.class);List list=userMapper.findUserByUsername(张);System.out.println(list.size();Public void testInsertUser()throws Exception /获取session SqlSession session=sqlSessionFactory.openSession();第10章 MyBatis DAO开发 /获取Mapper接口的代理对象 UserMapper userMapper=session.getMapper(UserMapper.class);/要添加的数据 User user=new User();user.setUsername(张三);user.setBirthday(new Date();user.setSex(1);user.setAddress(北京市);/通过Mapper接口添加用户 userMapper.insertUser(user);/提交 mit();/关闭session session.close();