【MyBatis学习04】mapper代理方法开发dao
来源:互联网 发布:java版的aes加密算法 编辑:程序博客网 时间:2024/06/05 19:47
上一篇博文总结了mybatis使用 原始dao的方法存在的一些弊端,我们肯定不会去用它,那么mybatis中该如何开发dao呢?如题所述,这篇博文主要来总结一下使用mapper代理的方法来开发dao的步骤。
使用mapper代理的方法来开发dao时,程序员只需要干两件事即可:
- 需要编写mapper.xml映射文件
- 需要编写mapper接口(相当于dao接口)
从做的工作来看,使用mybatis中使用mapper代理来开发dao会很方便,完全不需要我们去写具体的实现类,只需要写出接口即可,但是接口不能直接拿来用啊,那么我该如何产生它的实现类对象呢?这在下文会给出答案。
所谓的mapper.xml映射文件,内容其实是跟前面的User.xml文件是一样的,主要是跟定义一些跟User这个pojo之间的映射相关的东西,唯一不同的地方就在于namespace的赋值。在前面的User.xml文件中,我们设定了namespace为”test”,然后在Java方法调用的时候,我们会调用类似于sqlSession.insert("test.insertUser", user);
的方法,来定位需要执行的sql语句。但是在mapper.xml映射文件中,namespace要设定为我们接下来写的mapper接口的地址,即完全限定名。假设我们新建一个mapper包,在里面新建一个UserMapper.xml,如下:
定义好了mapper.xml映射文件后,接下来就要编写mapper接口了,编写mapper接口要遵循以下四个开发规范:
- 在mapper.xml中,使namespace等于mapper接口的地址(完全限定名)
- mapper.java接口中的方法名和mapper.xml中statement的id一致
- mapper.java接口中方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致
- mapper.java接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致
根据这四条开发规范,我们来完成mapper接口:UserMapper.java
//mapper接口,相当于dao接口public interface UserMapper { //根据id查询用户信息 public User findUserById(int id) throws Exception; //根据用户名模糊查询 public List<User> findUserByName(String name) throws Exception; //添加用户信息 public void insertUser(User user) throws Exception; //删除用户信息 public void deleteUser(int id) throws Exception; //更新用户信息 public void updateUser(User user) throws Exception;}
这里要注意一点就是findUserByName的方法,返回的是一个装有User的List,但是UserMapper.xml中对应的resultType类型是User,这里要注意,在前面的博文中也提到了,resultType指定的是单个返回结果的类型,也就是一条记录的类型,即User,但是这个findUserByName是返回很多User,所以返回值是List<User>
。mybatis会自动根据返回值类型去调用不同的方法,如下:
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne来查询数据库
如果mapper方法返回一个非集合对象,代理对象内部通过selectList来查询数据库
所以完全不用担心上面这个问题,mybatis已经帮我们解决好了。到这里还没完,还有一步就是别忘了在全局配置文件SqlMapConfig.xml中配置刚刚的UserMapper.xml,如下:
到现在为止,使用mapper代理的方式开发dao步骤基本上就搞定了。下面就开始写测试程序了。但是还遗留一个问题,就是文章开头提到的:现在只有mapper接口啊,那么你是如何产生实现类的对象呢?我们在测试程序中来看:
private SqlSessionFactory sqlSessionFactory; @Before //创建sqlSessionFactory public void setUp() throws Exception { String resource = "SqlMapConfig.xml"; //mybatis配置文件 //得到配置文件的流 InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂SqlSessionFactory,要传入mybaits的配置文件的流 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); System.out.println(user); } @Test public void testFindUserByName() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.findUserByName("倪升武"); sqlSession.close(); System.out.println(list); }}
原来这个sqlSession可以自动创建一个mapper接口的代理对象!我们只需要把刚刚写好的mapper接口类的字节码对象传给getMapper方法,即可得到一个该接口对应的代理对象,然后我们就可以使用这个代理对象来操作接口中具体的方法了。
到这里,使用mapper代理的方式开发dao就总结完了,但是有个小细节,由于mapper接口中方法的参数要根据映射文件中的parameterType来指定,而parameterType只有一个,所以mapper接口中所有方法的参数都只有一个!那如果我们要传入两个或多个参数该咋整?这没办法,想要传多个参数还是死了这条心了吧,但是可以解决这个问题,就是对传入的对象进行增强,让传进去的对象包含我们需要的参数即可。这算是个小弊端吧,但是不会影响我们开发。
本篇遗留了
<mapper resource="sqlmap/User.xml" />
<mapper resource="mybatis/mapper/UserMapper.xml"/> 这2个必要的
<mapper class="mybatis.dao.UserMapper"/> 这个不确定要不要 一直报错
<!-- <package name="mybatis.mapper"/> -->注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下;
一直报这个错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): mybatis.dao.UserMapper.findUserByName
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- Mybatis中mapper代理方法替换原始Dao开发方法
- Mybatis开发dao的方法--Mapper代理篇
- MyBatis学习记录(3):Mapper动态代理方式开发DAO
- Mybatis学习(05)-mapper代理方法开发dao && 输入映射和输出映射
- mybatis学习之原始开发DAO与mapper代理开发DAO的区别
- mapper代理方法开发mybatis
- 【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法
- 【Spring+SpringMVC+MyBatis深入学习及搭建】02.MyBatis原始Dao开发和mapper代理开发
- mybatis--开发Dao--原始dao方式和Mapper代理方式
- Mybatis之使用mapper代理方法开发dao(程序员只需要写mapper接口(dao接口))(12)
- Mybatis框架学习(二)—DAO开发方式和Mapper代理的开发方式
- 【mybatis】--mapper代理实现dao
- pwnable.kr [Toddler's Bottle]
- zookeeper.recipes.leader (C#)
- Hibernate框架中的事务(隔离等级设置、事务提交、事务回滚)
- Linux环境下配置搭建Redis分布式集群
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- linux shell dash&bash
- BZOJ P2241[sdoi2011]打地鼠
- Android 通过form表单上传文字,图片,视频等(通过key值)以及问题分析
- C++标准库之<iomanip>
- 在线免费生成IntelliJ IDEA 15.0(16.+)注册码
- 封装webview
- typeof返回值
- 火狐浏览器和谷歌浏览器主页被篡改恢复方法