原始 dao开发问题

1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

2、调用sqlsession方法时将statement的id硬编码了

3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误(传入的是泛型类),在编译阶段也不报错,不利于程序员开发。

mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

思路(mapper代理开发规范):

Mapper代理开发避免了原始的dao接口开发中实现类的很多重复代码,让程序员减轻了工作量

Sql语句的删除、更新、添加操作要进行会话的提交才会生效

程序员还需要编写mapper.xml映射文件

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

(使用mapper代理对象,mybatis会自动根据接口地址和命名空间去查找相对应的statement的id)

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

mapper接口方法参数只能有一个是否影响系统 开发

mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统 框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

eclipse项目的结构

UserMapper.xml

<?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"> <!-- namespace命名空间,作用就死对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法开发,namespace有特殊重要的作用(刚开始学还不能理解) --> <mapper namespace="ql.mybatis.mapper.UserMapper"> <!-- 在映射文件中配置很多sql语句--> <!-- 需求:通过id查询用户表的记录 --> <!-- 通过select 执行数据库的查询 id:标识映射文件的sql 将sql语句封装到mappedStatement对象中,所以将id称为statement的id parameterType:指定输入参数的类型,这里指定int型 #{}表示一个占位符 #{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入的参数是简单类型,#{}中的参数可以任意 resultType:指定sql输出的结果的所映射的java对象类型,select指定restultType表示将单条记录映射成java对象 --> <select id="findUserById" parameterType="int" resultType="ql.mybatis.pojo.User"> select * from User where id=#{id} </select> <select id="findUserById2" parameterType="ql.mybatis.pojo.User" resultType="ql.mybatis.pojo.User"> select * from User where sex=#{sex} and address=#{address} </select> <!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value --> <select id="findUserByName" parameterType="String" resultType="ql.mybatis.pojo.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <!-- 添加用户 parameterType:指定输入 参数类型是pojo(包括 用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 --> <insert id="insertUser" parameterType="ql.mybatis.pojo.User"> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> <!-- 删除用户 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 更新用户 必须指定id,否则将会将表的内容全部更新 --> <update id="updateUser" parameterType="ql.mybatis.pojo.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>

UserMapper接口:

package ql.mybatis.mapper;import java.util.List;import ql.mybatis.pojo.User; public interface UserMapper { public User findUserById(int id) throws Exception; public List<User> findUserByName(String name) throws Exception; public User findUserById2(User user) throws Exception; public void insertUser(User user) throws Exception; public void deleteUser(int id) throws Exception; }

单元测试类:

package ql.mybatis.test;import java.io.InputStream;
import java.util.Date; 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 ql.mybatis.mapper.UserMapper; import ql.mybatis.pojo.User; public class UserMapperTest { SqlSession sqlSession = null; @Before public void setUp() throws Exception { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); sqlSession = sqlSessionFactory.openSession(); } @Test public void testFindUserById() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(22); System.out.println(user); } @Test public void testFindUserByName() throws Exception { // 得到代理对象,接口回调 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.findUserByName("小明"); System.out.println(list); } @Test public void testInsertUser() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setSex("1"); user.setAddress("北京市"); user.setBirthday(new Date()); user.setUsername("王大东"); userMapper.insertUser(user); sqlSession.commit(); } @Test public void testDeleteUser() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUser(10); sqlSession.commit(); } @Test public void testFindUserById2() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user=new User(); user.setSex("1"); user.setAddress("福建福州"); User user2=userMapper.findUserById2(user); System.out.println(user2); } }

 还应在配置文件中SqlMapConfig.xml加上:

<mapper resource="mapper/UserMapper.xml"/>

可以看到并没有写UserMapper接口的实现类,mybatis帮我们生成了一个Mapper代理对象

转载于:https://www.cnblogs.com/ql211lin/p/4530354.html

mapper代理(十一)相关推荐

  1. java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)

    1.mapper代理 1.mybatis开发dao的方法----引入(为啥要使用mapper代理) 1.SqlSession使用范围 1.SqlSessionFactoryBuilder 通过SqlS ...

  2. MyBatis mapper代理方式

    3. mapper代理方式(程序员只需mapper接口(相当于Dao的接口)) 3.1   思路:1.程序员只需要写mapper接口(相当于Dao接口),mybatis可以自动生成mapper接口实现 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...

  4. Mybatis学习总结(二)——Mapper代理开发

    一.概要 1.原始DAO开发中存在的问题:(1)DAO实现方法体中存在很多过程性代码. (2)调用SqlSession的方法(select/insert/update)需要指定Statement的id ...

  5. Mybatis的Mapper代理

    Mybatis通过jdk所提供的代理方案根据给出的mapper接口以及mapper的xml来实现mapper的代理实现. 当Mybatis正在解析xml配置文件的时候,在解析mapper节点的时候会调 ...

  6. mybatis源码解析 - mapper代理对象的生成

    1.简单示例 先看一个简单纯粹的mybatis demo(不集成spring等其他框架),代码结构很简单,如下图: 完整代码地址:kingoe/boot-study:mapper层和我们平时说的dao ...

  7. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisS ...

  8. Mybatis mapper代理SqlMapConfig.xml配置详解

    SqlMapConfig.xml是mybatis的全局配置文件: 1.mapper映射配置 >配置mapper的另外一种方式: <mappers> <mapper resour ...

  9. Mybatis mapper代理Dao开发

    mapper代理的方式,将原始Dao开发中,Dao层接口的实现类中重复的代码提取出来,进一步封装. 使用mybatis实现mapper接口的代理,同样需要编写mapper.xml配置文件. 而且map ...

最新文章

  1. RabbitMQ分布式集群架构
  2. 好用的 php类,一个好用的php文件上传处理类
  3. awk学习实战-原创
  4. 信息安全与网络安全,你分清了吗?
  5. [转]C++学习:VC++动态链接库(DLL)编程深入浅出(zz)
  6. C语言矩阵M*N节省空间的算法(附完整源码)
  7. poj 3041 Asteroids
  8. 如何用excel筛选相似内容_excel如何筛选出相同内容,excel怎么用公式筛选
  9. PHP 二分查找(详细)
  10. 12.大数据架构详解:从数据获取到深度学习 --- 大数据技术开发文化
  11. 农田生产潜力数据集、耕地分布矢量数据、土地利用数据、作物分布数据、林地分布数据、绿地分布
  12. 并查集(ACWING三道题)
  13. 三种基本排序方法-冒泡排序,选择排序,插入排序
  14. 乌班图apt添加阿里source
  15. 力学现象演示——圆周运动与弹簧弹力
  16. ESP8266-Arduino编程实例-MLX90614红外测温传感器驱动
  17. javascript设置网页快捷键
  18. [转]PHP大型Web应用入门(一)
  19. 中国土地市场网信息爬取--requests+Selenium多线程爬取
  20. DFS BFS简单理解

热门文章

  1. hihocoder 1343 : Stable Members【拓扑排序】
  2. chrome开发总结(交互/权限/存储)-爬虫
  3. 【OpenCV入门教程之五】 分离颜色通道多通道图像混合(转)
  4. hdu1010深搜+奇偶剪枝
  5. SQLServer------聚集索引和非聚集索引的区别
  6. Chosen通用初始化
  7. 消息 245,级别 16,状态 1,第 1 行 在将 varchar 值 '2,8' 转换成数据类型 int 时失败。...
  8. 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
  9. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
  10. Could not find *.apk!解决办法