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

一、概要

1、原始DAO开发中存在的问题:
(1)DAO实现方法体中存在很多过程性代码。
(2)调用SqlSession的方法(select/insert/update)需要指定Statement的id,存在硬编码,不利于代码维护。

2、Mapper动态代理方法:程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现类代理对象。

3、目标:通过一些规则让mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。

二、开发规范

1、在XXXmapper.xml中namespace等于mapper接口地址(即mapper.xml文件中的namespace与mapper.java接口的类路径相同)。


2、XXXmapper.java接口中的方法和mapper.xml中的statement的Id一致。
3、mapper.java接口中的方法输入参数和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法的返回值类型和mapper.xml中statement的resultType指定的类型一致。

注:以上的开发规范主要是对下面的代码进行统一生成

SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id); 
......

 三、UserMapper.java类代码(接口文件)

package com.mybatis.mapper;import java.util.List;import com.mybatis.entity.User;/*** 用户管理mapper接口* @author lxx**/
public interface UserMapper {/** 根据ID查询用户信息 */public User findUserById(int id);/** 根据用户名称模糊查询用户信息 */public List<User> findUserByName(String username);/** 添加用户 */public void insertUser(User user);/** 根据ID删除用户 */public void deleteUser(Integer id);/** 根据ID更新用户 */public void updateUser(User user);}

四、将原来的User.xml拷贝并修改名称为UserMapper.xml,再将UserMapper.xml文件中的namespace改为mapper接口地址

 <!-- namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离注意:使用mapper代理开发时,namespace有特殊作用-->
<mapper namespace="com.mybatis.mapper.UserMapper">

注:namespace=mapper接口地址
五、在SqlMapConfig.xml中加载UserMapper.xml

<!-- 加载映射文件 --><mappers><mapper resource="com/mybatis/mapping/User.xml"/><mapper resource="com/mybatis/mapping/UserMapper.xml"/></mappers>

六、JUnit测试UserMapperTest.java

package com.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 com.mybatis.entity.User;
import com.mybatis.mapper.UserMapper;public class UserMapperTest {private SqlSessionFactory sqlSessionFactory;// 此方法是在执行@Test标注的方法之前执行
    @Beforepublic void setUp() throws Exception {String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建SqlSessionFcatorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建Usermapper对象,mybatis自动生成mapper代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.findUserById(1);System.out.println(user);sqlSession.close();}@Testpublic void testFindUserByName() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建Usermapper对象,mybatis自动生成mapper代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> list = mapper.findUserByName("小");System.out.println(list);sqlSession.close();}@Testpublic void testInsertUser() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建Usermapper对象,mybatis自动生成mapper代理对象User user = new User();user.setUsername("小东");user.setSex("1");user.setAddress("天津");user.setBirthday(new Date());UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.insertUser(user);sqlSession.commit();sqlSession.close();}@Testpublic void testUpdateUser() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建Usermapper对象,mybatis自动生成mapper代理对象User user = new User();user.setId(2);//必须设置Iduser.setUsername("小刘");user.setSex("1");user.setAddress("北京海淀");user.setBirthday(new Date());UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.updateUser(user);sqlSession.commit();sqlSession.close();}@Testpublic void testDeleteUser() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建Usermapper对象,mybatis自动生成mapper代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);mapper.deleteUser(3);sqlSession.commit();sqlSession.close();}}

     原来这个sqlSession可以自动创建一个mapper接口的代理对象!我们只需要把刚刚写好的mapper接口类的字节码对象传给getMapper方法,即可得到一个该接口对应的代理对象,然后我们就可以使用这个代理对象来操作接口中具体的方法了。
  到这里,使用mapper代理的方式开发dao就总结完了,但是有个小细节,由于mapper接口中方法的参数要根据映射文件中的parameterType来指定,而parameterType只有一个,所以mapper接口中所有方法的参数都只有一个!那如果我们要传入两个或多个参数该咋整?这没办法,想要传多个参数还是死了这条心了吧,但是可以解决这个问题,就是对传入的对象进行增强,让传进去的对象包含我们需要的参数即可。这算是个小弊端吧,但是不会影响我们开发。

七、小结

1、用mapper代理开发时只要写2个:

(1)mapper.xml

(2)mapper接口

2、Mapper接口开发需要遵循以下规范:

(1)Mapper.xml文件中的namespace与mapper接口的类路径相同。
(2)Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。 
(3)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
(4)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

3、代理对象内部调用selectOne()和selectList():

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

4、mapper接口中的方法参数只能有一个是否影响系统开发,mapper接口方法参数只能有一个,系统是否不利于维护?
回答:系统框架中,dao层的代码是被业务层公用的。mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

 

转载于:https://www.cnblogs.com/xiaoxi/p/6173534.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统

一、前言这里说的是自己从 wordpress 源码开始搭建一个个人博客系统。当然&#xff0c;很多云端已经直接提供了在线安装的方式&#xff0c;这个就不在本文的讨论范围之内了。二、关于 wordpresswordpress是一款个人博客系统&#xff0c;并逐步演化成一款内容管理系统软件&#…

TypeError: db.addUser is not a function : @(shell):1:1 ——mongoDB创建新用户名密码的方法...

不多说&#xff0c;旧版本使用 db.addUser("root","root") 新版本使用这句会出现这个错误提示 TypeError: db.addUser is not a function : (shell):1:1 新版本用的是 db.createUser({user: "test",pwd: "test",roles: [ { role: &quo…

java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

零基础学Java开发技术有哪些优势和好处&#xff1f;Java开发技术有下列优势&#xff1a;Java编程语言简单、面向对象集中于对象及其接口、分布式处理TCP/IP协议、鲁棒性、安全性、体系结构中立性、可移植性、解释执行、高性能、多线程以及动态性等。零基础学Java开发技术的优势…

C#-WebForm-★★★JQuery知识——基础知识、选择器、事件★★★

JQuery 与 JS 之间的转换 将JQuery转换为JS —— get(0)  例如&#xff1a;alert( $("#d1").get(0).offsetwidth ); 将JS 转换为JQuery —— $(" ")  例如&#xff1a;$("#d1").click(function(){}); 1、什么是JQuery&#xff1f;   它就是…

事件对象及其属性

$(function(){$(input).bind(click,function(e){alert(e); //获取对象//event对象的属性alert(e.type);alert(e.target);alert(e.currentTarget);//得到监听元素的DOM&#xff0c;target是点的那个的DOM});$(input).bind(mouseover,function(e){alert(e.relatedTarget);});$(in…

php上传同一张图片,两种php实现图片上传的方法_PHP

图片上传在项目中经常用到&#xff0c;几乎没有任何一个项目可以脱离图片或者是文件上传。本篇我在这向大家介绍两种常规的上传方式。(注&#xff1a;在这里我们仅仅是对功能的实现&#xff0c;不去做过多的前端的样式)一、利用form表单上传此种方式是最原始的上传方式&#xf…

java位运算求幂,程序员必学:快速幂算法

前阵子&#xff0c;有小伙伴在我B站的算法教程底下留言小伙伴们有任何疑问或者希望我解说任何内容&#xff0c;都可以在我的小我私家B站或民众号(xmg_mj)留言哦&#xff0c;我会尽我最大能力、只管抽时间去写文章\录视频来回应人人。关于快速幂实在快速幂相关的问题&#xff0c…

java过滤器

过滤器 1、Filter工作原理&#xff08;执行流程&#xff09; 当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头…

假设检验

假设检验分参数假设和非参数假设。 假设 先假设原假设H0&#xff0c;对应的反面叫做备择假设H1。SAS一般沿用的规则是NEYMAN和PEARSON提出的&#xff1a;在控制犯第一类错误的原则下&#xff0c;是犯第二类错误的概率尽量小&#xff08;即&#xff0c;原假设受到保护&#xff0…

jeesite在eclipse中部署

1&#xff1a;下载下来最新版本的jeesite&#xff0c;首先要在本地安装好maven运行环境 2&#xff1a;运行 bin/eclipse.bat 生成工程文件并下载jar依赖包 如果需要修改默认项目名&#xff0c;请打开pom.xml修改第7行artifactId&#xff0c;然后再执行eclipse.bat文件 3&…

php抖音关注列表,网页PHP抖音批量取消关注JS代码

在很多时候我们抖音关注的人太多&#xff0c;想要批量取消但是一个一个点击太麻烦了&#xff0c;如何解放双手批量取消关注呢&#xff1f;今天分享一段JS代码&#xff0c;可在线批量取消关注&#xff0c;需电脑才能操作。首先打开抖音创作服务平台登录&#xff1a;https://crea…

python 灰度改二值,Python Image 对验证码进行灰度和二值法处理 去掉边框

def binarizing(img, threashold):img img.convert("L") # 转灰度pixdata img.load()w, h img.sizefor y in range(h):for x in range(w):if pixdata[x, y] < threashold:pixdata[x, y] 0else:pixdata[x, y] 255return imgdef removeFrame(img, width)::para…

前端js模糊搜索(模糊查询)

1.html结构&#xff1a; <label for"searchShop" class"clear pos-a" style"top:17px;"> <input type"text" id"searchShop" placeholder"场所搜索"> <input type"but…

php代码审计思路,代码审计思路讨论

原标题&#xff1a;代码审计思路讨论前言首先感谢手电筒的建议&#xff0c;建议我从Bluecms来开始学习代码审计。感谢桑桑格&#xff0c;风哥的问题解答。文章主要是写下我自己在代码审计的时候所思所想。当然并不是太过严谨&#xff0c;也有可能存在错误。这里主要是写出了审计…

Dubbo源码分析:ThreadPool

定义了通过URL对象作为参数获取Executor对象的get&#xff25;xecutor方法。所有实现ThreadPool接口的类都是基于ThreadPoolExecuotr对象来实现的。 类图 转载于:https://www.cnblogs.com/wspgbw/p/6409933.html

MySQL存储过程及触发器

一、存储过程 存储过程的基本格式如下&#xff1a; -- 声明结束符 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程名称(参数列表) BEGIN-- 可以写多个sql语句; -- sql语句流程控制SELECT * FROM employee; END $ -- 结…

destoon 短信发送函数及短信接口修改

// $DT在common.inc.php中定义&#xff0c; $CACHE cache_read(module.php); $DT $CACHE[dt]; 从缓存里读取网站配置信息。 //$db 数据库类&#xff0c;$DT 全局配置&#xff0c;$DT[sms] 开启手机短信&#xff0c;$DT_TIME系统时间&#xff0c;$DT_IP 当前ip地址&#xff0…

安卓界面组件-文本框

前面三篇文章本质上是围绕着View类进行的。View是安卓UI的基础类&#xff0c;我们的安卓开发“千里之行”是从View开始的。 安卓界面UI有大量的组件&#xff0c;组件的继承和间接继承于View。有一类组件很基本&#xff0c;这就是TextView文本框&#xff0c;作用是显示文本。在T…

redis linux 运行依赖,在Ubuntu系统下安装Redis Desktop Manager的方法

以下为你介绍在Ubuntu16.04系统下安装Redis可视化工具Redis Desktop Manager。不管是哪个Redis Desktop Manager版本&#xff0c;都可以采用下面的安装方式进行。Redis Desktop Manager安装方法1.首先在终端中启动redis服务执行命令&#xff1a;sudo service redis start 与 ps…

bzoj4631

4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 260 Solved: 133[Submit][Status][Discuss]Description 六一儿童节到了&#xff0c; SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏&#xff1a;有N个盒子从左到右排成一排&#xff0c;第i个盒子里装着Ai个气球。SH…