MyBatis之Mapper动态代理开发

MyBatis之Mapper动态代理开发

1.SqlSession的使用范围

1.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是以工具类的方式来使用:需要创建sqlSessionFactory时就new一个 SqlSessionFactoryBuilder

2.sqlSessionFactory
正常开发时,以单例方式管理sqlSessionFactory,整个系统运行过程中sqlSessionFactory只有一个实例,将来和Spring整合后由Spring以单例方式管理sqlSessionFactory

3.SqlSession
SqlSession是一个面向用户(程序员)的接口,程序员调用 SqlSession接口的方法进行操作数据库。那么我们会思考:SqlSession能否以单例方式使用???由于 SqlSession是线程不安全的,所以 SqlSession最佳应用范围在方法体内。也就是说在方法体内定义局部变量 SqlSession的对象来使用。

2.MyBatis开发DAO的方式

我们先来看看MyBatis原始开发dao的开发方式,发现原始开发的问题,然后再来看看MyBatis使用mapper动态代理开发dao的方式(也是MyBatis目前使用的开发dao的方式)。

2.1原始dao的开发方式

程序员需要编写dao接口:


和dao接口的实现类:


然后就能在测试类中使用。测试类代码如下:


我们来看看这种方式开发有什么问题?

  • 1.dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(都是先创建sqlSession、调用sqlSession的方法、关闭sqlSession)。
  • 2.dao的实现类中存在硬编码,调用sqlSession方法时将statement的id硬编码。

下面我们看看mapper动态代理的方式。

2.2mapper动态代理的方式

这种方式下程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象。因为本身dao在三层架构中就是一个通用的接口。

2.2.1mapper开发规范

要想让mybatis自动创建dao接口实现类的代理对象,必须要遵循一些规则:

  • 1.mapper.xml中 namespace指定为mapper接口的全限定名。此步骤的目的:将mapper.xml和mapper.java关联。
  • 2.mapper.xml中statement的id就是mapper.java中的方法名。
  • 3.mapper.xml中statement的parameterType和mapper.java中方法输入参数一致。
  • 4.mapper.xml中statement的resultType和mapper.java中方法的返回值类型一致。

采用这种方式后,我们便可将第一篇文章中提到的User.xml改为UserMapper.xml。文件目录如下:



其中有些类我们会在后面用到。

2.2.2mapper.xml(映射文件)

mapper映射文件的命名方式建议表名加Mapper.xml,namespace指定为mapper接口的全限定名。


2.2.3mapper.java接口

mybatis提出了mapper接口,相当于dao接口,mapper接口的命名方式建议为表名加Mapper.

2.3.4将mapper.xml在SqlMapConfing.xml中进行注册


2.3.5mapper接口返回单个对象和集合对象

在UserMapper.java中添加如下两个方法:



对于UserMapper.xml,不管查询记录是单条还是多条,在statement(即UserMapper.xml)中的resultType都定义一致,都是单条记录映射的pojo类型。

而对于UserMapper.java接口方法中的返回值,如果返回的是单个对象,返回值类型是pojo,生成的代理对象内部会自动通过selectOne获取记录,如果返回值类型是多条对象,生成的代理对象内部会自动通过selectList获取记录。

测试代码如下:



使用Mapper代理方式进行开发,使程序员只需要关注UserMapper.java接口中的方法,它的实现类由Mapper自动为我们生成,带来了很大的方便。但这种方式也有它的弊端。

2.3.6mapper代理开发的问题

  • 1.返回值的问题:如果方法(即UserMapper.java接口中的方法)调用的statement中返回是多条记录,而mapper.java方法的返回值为pojo,此时代理对象通过selectOne调用,但由于返回的是多条记录所以会报错:Expected one result (for null ) to be returned by selectOne() but found 4;
  • 2.输入参数的问题:使用mapper代理的方式开发,mapper接口方法的输入参数只有一个,可扩展性是否很差?答:可扩展性没有问题,因为dao层就是通用的,可以通过扩展pojo(定义pojo包装类型,后面第四篇文章–MyBatis输入输出映射会讲扩展pojo的知识)来将不同的参数(可以是pojo也可以是简单类型)传入进去。


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

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

相关文章

MyBatis之输入(parameterType)与输出(resultType、resultMap)映射

MyBatis之输入(parameterType)与输出(resultType、resultMap)映射 2017/9/30在MyBatis中,我们通过parameterType完成输入映射(指将值映射到sql语句的占位符中,值的类型与dao层响应方法的参数类型一致),通过resultType完成输出映射(从数据库中…

MyBatis之优化MyBatis配置文件中的配置

MyBatis之优化MyBatis配置文件中的配置 2017/9/30MyBatis配置文件很重要&#xff0c;首先我们来看看MyBatis配置文件中的内容和顺序: 文件目录结构如下: 1.<properties>属性定义 可以把一些通用的属性值配置在属性文件中&#xff0c;加载到mybatis运行环境内。例如创建d…

【转载保存】在python中如何用word2vec来计算句子的相似度

在python中&#xff0c;如何使用word2vec来计算句子的相似度呢&#xff1f; 第一种解决方法 如果使用word2vec&#xff0c;需要计算每个句子/文档中所有单词的平均向量&#xff0c;并使用向量之间的余弦相似度来计算句子相似度&#xff0c;代码示例如下&#xff1a; import …

Spark介绍

Spark Spark 是什么? Apache Spark?是用于大规模数据处理的快速和通用引擎. 速度:在内存中,运行程序比Hadoop MapReduce快100倍&#xff0c;在磁盘上则要快10倍. Apache Spark具有支持非循环数据流和内存计算的高级DAG执行引擎. 易用:可以使用Java&#xff0c;Scala&#…

MyBatis之使用resultMap实现高级映射

MyBatis之使用resultMap实现高级映射 2017/09/30对于数据库中对表的增删改查操作&#xff0c;我们知道增删改都涉及的是单表&#xff0c;而只有查询操作既可以设计到单表操作又可以涉及到多表操作&#xff0c;所以对于输入映射parameterType而言是没有所谓的高级映射的&#xf…

MyBatis之查询缓存

MyBatis之查询缓存 2017/09/30正如大多数持久层框架一样&#xff0c;MyBatis同样也提供了对查询数据的缓存支持。今后我们要学习的SpringMVC框架属于系统控制层&#xff0c;它也有它的缓存区域&#xff0c;对响应的jsp页面进行缓存&#xff1b;Spring属于系统业务层&#xff0c…

MyBatis3.x和Spring3.x的整合

MyBatis3.x和Spring3.x的整合 2017/10/021.mybatis和spring整合的思路 1.让spring管理SqlSessionFactory 2.让spring管理mapper对象和dao 使用spring和mybatis整合开发mapper代理及原始dao接口。 自动开启事务&#xff0c;自动管理sqlsession 3.让spring管理数据源(即数据库连接…

特征选择

特征选择是特征工程中的重要问题&#xff08;另一个重要的问题是特征提取&#xff09;&#xff0c;坊间常说&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程尤其是特征选择在机器学习中占有相当重要的…

交叉验证

sklearn中的交叉验证&#xff08;Cross-Validation&#xff09; sklearn是利用python进行机器学习中一个非常全面和好用的第三方库&#xff0c;用过的都说好。今天主要记录一下sklearn中关于交叉验证的各种用法&#xff0c;主要是对sklearn官方文档 Cross-validation: evaluati…

机器学习名词解释

1. 损失函数 损失函数是用来估量你模型的预测值f(x)与真实值Y的不一致程度&#xff0c;它是一个非负实值函数,通常使用L(Y, f(x))来表示&#xff0c;损失函数越小&#xff0c;模型的鲁棒性就越好。损失函数是经验风险函数的核心部分&#xff0c;也是结构风险函数重要组成部分。…

【转载保存】推荐ApacheCN开源的一个机器学习路线图

转载&#xff1a;https://mp.weixin.qq.com/s/EMWFFPsaKaGc8FO1g-htzg 推荐ApacheCN开源的一个机器学习路线图 原创&#xff1a; 机器学习初学者 机器学习初学者 今天 推荐一个ApacheCN开源的一个机器学习路线图&#xff1a; https://github.com/apachecn/AiLearning 注意…

CNN(Convolutional Neural Network) 的基础

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受到生物思考方式启发的ML…

语音识别学习日志 2019-7-14 语音识别基础知识准备2 {EM算法与混合高斯模型(Gaussian mixture model, GMM)}

https://blog.csdn.net/lin_limin/article/details/81048411会对GMM和EM做详细介绍 本文参考&#xff1a; http://www.ituring.com.cn/article/497545(GMM模型) https://blog.csdn.net/xmu_jupiter/article/details/50889023(GMM模型) http://www.cnblogs.com/wjy-lulu/p/7…

【爬虫】爬取带有cookie才能获取网页内容的新闻网站

工作任务&#xff1a; 今天老大让我跑取一个新闻网站&#xff1a;https://www.yidaiyilu.gov.cn/ 采坑记录&#xff1a; https协议&#xff0c;如果利用http协议去请求会报出如下信息&#xff1a; 错误&#xff1a;SSLHandshake错误就知道了&#xff0c;客户端与服务端进行连…

语音识别学习日志 2019-7-14 语音识别基础知识准备3 {Kmean算法分析与HMM(Hidden Markov Model)模型}

Kmean算法 聚类算法 对于"监督学习"(supervised learning)&#xff0c;其训练样本是带有标记信息的&#xff0c;并且监督学习的目的是&#xff1a;对带有标记的数据集进行模型学习&#xff0c;从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learni…

语音识别学习日志 2019-7-15 语音识别基础知识准备4 {Baun-Welch算法}

HMM 前向算法(Forward Algorithm)详细解释参考: http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-1 http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-2 http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-3…

【转载保存】B+树索引原理以及应用案例

地址&#xff1a;https://www.jianshu.com/p/486a514b0ded 利用c/c实现基于b树小型关系型数据库&#xff1a;https://github.com/enpeizhao/duck_db 利用java实现的基于b树的数据库案例&#xff1a;https://github.com/liumengjun/BPlusTreeIndex 1.什么是索引&#xff1f; …

语音识别学习日志 2019-7-16 语音识别基础知识准备5 {决策树算法(ID3、 C4.5、 CART)}

决策树算法(ID3、 C4.5、 CART) 决策树的定义 决策树学习采用的是自顶向下的递归方法&#xff0c;其基本思想是以信息熵为度量构造一颗熵值下降最快的树&#xff0c;到叶子节点处&#xff0c;熵值为0。其具有可读性、分类速度快的优点&#xff0c;是一种有监督学习。 决策树呈…

语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}

HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-1 http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-2 http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-3 …

基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 包围盒构建 4.2 点云压缩 4.3 曲面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................…