mybatis(7)--使用mapper代理开发代替原始的dao开发
来源:互联网 发布:python 垃圾回收 阈值 编辑:程序博客网 时间:2024/05/18 23:24
在原始的dao中我们发现了很多问题,而mapper代理开发则会帮我们解决这些问题。
具体思路:
1.需要编写映射文件mapper.xml
2.使用mapper接口来代替dao接口
3.mybatis会自动实现mapper接口的代理类对象
how?
mapper接口是有一定的编写规范,mybatis根据这些规范动态的使用反射获取方法名方法参数等,从而实现mapper的代理
首先来看mapper.xml,不难看出,它和之前的user.xml
几乎是一样的,只是这个namespace不一样,以前的是test,所以我们调用的时候便只能硬编码调用。那么现在,他把这个sql的调用写成一个类,里面的方法遵循一定的规范,根据这种规范,去实现其代理。
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><!-- mapper.xml的namespace需要和mapper的接口地址一致 --><mapper namespace="com.ddd.mybatis.mapper "> <select id="findUserById" parameterType="int" resultType="com.ddd.mybatis.pojo.User"> SELECT * FROM USER WHERE id=#{id} </select> <select id="findUserByName" parameterType="java.lang.String" resultType="com.ddd.mybatis.pojo.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <insert id="insertUser" parameterType="com.ddd.mybatis.pojo.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address}) </insert> <delete id="deleteUserById" parameterType="java.lang.Integer"> DELETE FROM USER WHERE id=#{id} </delete> <update id="updateUser" parameterType="com.ddd.mybatis.pojo.User"> UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id} </update></mapper>
再看mapper.java是怎么写的:
package com.ddd.mybatis.mapper;import java.util.List;import com.ddd.mybatis.pojo.User;/** * 使用mapper接口相当于dao接口 * * @author Dan * mapper.xml的namespace需要和mapper.java的接口地址一致 *mapper.java中的方法的方法名要和mapper.xml中的statement的id一致 *输入参数要和mapper.xml中的statement的parameterType指定类型一致 *方法的返回值要和mapper.xml中的statement的resultType指定类型一致 */public interface UserMapper { // 根据id查询一个user public User findUserById(int id); //根据名字查询user public List<User> findUserByName(String name); // 添加用户 public void insertUser(User u); // 删除用户 public void deleteUserById(int id); // 更新用户 public void updateUser(User u);}
根据这四个规范,我们可以看出,方法名字,sql的id名字,输入输出类型的限制,可以使用Method.class.getDeclaredMethod(name, parameterTypes)来获取到一个方法,在这方法的前后加入sqlSession的创建提交等,这很明显我们可以使用动态代理。
接下来测试:(记得要将userMapper.xml加入到sqlMapConfig.xml中)
package com.ddd.mybatis.mapperTest;import static org.junit.Assert.*;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import com.ddd.mybatis.mapper.UserMapper;import com.ddd.mybatis.pojo.User;public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws IOException{ String fileSource="SqlMapConfig.xml"; //获取文件流 InputStream inputStream=Resources.getResourceAsStream(fileSource); //根据加载的配置文件信息创建SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() { //由于之前是在UserDaoImpl中每次获取sqlSession,所以这里需要我们手动写 SqlSession sqlSession=sqlSessionFactory.openSession(); //mybatis自动生成mapper代理对象,代理对象内部调用selectOne或者selectList UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 User u=userMapper.findUserById(1); System.out.println(u); } @Test public void testFindUserByName() { //由于之前是在UserDaoImpl中每次获取sqlSession,所以这里需要我们手动写 SqlSession sqlSession=sqlSessionFactory.openSession(); //mybatis自动生成mapper代理对象,代理对象内部调用selectOne或者selectList UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //调用userMapper的方法,返回集合,但这里如果不小心用一个单个user来接收,那会报错 List<User> list=userMapper.findUserByName("小明"); System.out.println(list); }}
问题总结:
mapper的方法是依据parameterType来写,而它只能有一个,这是否会影响我们扩展维护呢?
在我们的系统框架中,dao层的代码是被业务层调用的,即使mapper接口的方法只有一个参数,可以使用包装类型的pojo满足不同的业务方法需求
ps:持久层方法中参数可以是包装类型,例如map等,但service中不建议使用包装类型,因为service是被各种各样的前台服务调用的,而前台并不知道你这个map中究竟有多少对象,这样不利于业务层的可扩展。
- mybatis(7)--使用mapper代理开发代替原始的dao开发
- mybatis 原始dao开发和mapper代理开发的比较
- mybatis--开发Dao--原始dao方式和Mapper代理方式
- mybatis学习之原始开发DAO与mapper代理开发DAO的区别
- 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发
- Spring + Mybatis - 原始dao开发整合 与 Mapper代理整合
- Mybatis中mapper代理方法替换原始Dao开发方法
- mybatis入门基础(二)----原始dao的开发和mapper代理开发------------转载
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- Mybatis入门基础(二)--原始dao的开发和mapper代理开发
- 深入浅出mybatis中原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- 深入浅出mybatis中原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- 【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法
- SimpleDateFormat非线程安全
- 私有网络(腾讯云)
- 【PAT】【Advanced Level】1022. Digital Library (30)
- 位运算
- 随机森林原理介绍
- mybatis(7)--使用mapper代理开发代替原始的dao开发
- h5页面转盘抽奖
- 在命令行中更新android-sdk
- 内部类详解
- MapReduce的过程
- C.Primer.Plus(第六版)第12章 编程练习
- Innodb存储引擎
- I2C设备地址(7位地址左移)
- C语言笔记-文件操作