一、引言
通过上一篇mybatis的入门学习,我们已经会使用mybatis实现简单的增删改查,但是我们也发现了用原始Dao开发的一些问题:
Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。
为了解决这些问题,我们采用Mapper动态代理方法来进行开发:程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
二、开发规范
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
三、改造
第一步:Mapper.xml(映射文件)
定义mapper映射文件UserMapper.xml,将UserMapper.xml放在config下mapper目录下,效果如下:
文件内容如下:
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
value(#{id},#{username},#{sex},#{birthday},#{address})
INSERT INTO `user`
(username,birthday,sex,address) VALUES
(#{username},#{birthday},#{sex},#{address})
其他地方未有改动,主要是namespace="com.yuanqinnan.mapper.UserMapper"的修改,现在我们实现这个接口
第二步:UserMapper(接口文件)
新建mapper包,新增接口UserMapper
内容:
publicinterface UserMapper {
//查询用户User queryUserById(int id);
//查询用户列表List selectUserAll();
//模糊查询List selectLikeUserName(String username);
//新增void saveUser(User user);
}
第三步:加载UserMapper.xml文件
测试:
publicclass MapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
publicvoidinit()throws Exception {
// 创建SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder =new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
// 创建SqlsessionFactorythis.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
publicvoid testQueryUserById() {
// 获取sqlSession,和spring整合后由spring管理SqlSession sqlSession =this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询方法User user = userMapper.queryUserById(1);
System.out.println(user);
// 和spring整合后由spring管理 sqlSession.close();
}
@Test
publicvoid testQueryUserByUsername() {
// 获取sqlSession,和spring整合后由spring管理SqlSession sqlSession =this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询方法List list = userMapper.selectLikeUserName("张");
for (User user : list) {
System.out.println(user);
}
// 和spring整合后由spring管理 sqlSession.close();
}
@Test
publicvoid testSaveUser() {
// 获取sqlSession,和spring整合后由spring管理SqlSession sqlSession =this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 创建保存对象User user =new User();
user.setUsername("刘备");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("蜀国");
// 执行查询方法 userMapper.saveUser(user);
System.out.println(user);
// 和spring整合后由spring管理 sqlSession.commit();
sqlSession.close();
}
}
测试结果与上一篇相同
四、总结
selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。