深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

上篇《深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete》介绍了insert、update、delete的用法,本篇将介绍select、resultMap的用法。select无疑是我们最常用,也是最复杂的,mybatis通过resultMap能帮助我们很好地进行高级映射。下面就开始看看select 以及 resultMap的用法:

先看select的配置吧:

复制代码
<select<!--  1. id (必须配置)id是命名空间中的唯一标识符,可被用来代表这条语句。 一个命名空间(namespace) 对应一个dao接口, 这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致  -->id="selectPerson"<!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理)将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) -->parameterType="int"<!-- 3. resultType (resultType 与 resultMap 二选一配置)resultType用以指定返回类型,指定的类型可以是基本类型,可以是java容器,也可以是javabean -->resultType="hashmap"<!-- 4. resultMap (resultType 与 resultMap 二选一配置)resultMap用于引用我们通过 resultMap标签定义的映射类型,这也是mybatis组件高级复杂映射的关键 -->resultMap="personResultMap"<!-- 5. flushCache (可选配置)将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false -->flushCache="false"<!-- 6. useCache (可选配置)将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true -->useCache="true"<!-- 7. timeout (可选配置) 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)-->timeout="10000"<!-- 8. fetchSize (可选配置) 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)-->fetchSize="256"<!-- 9. statementType (可选配置) STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED-->statementType="PREPARED"<!-- 10. resultSetType (可选配置) FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)-->resultSetType="FORWARD_ONLY">
复制代码

配置看起来总是这么多,不过实际常用的配置也就那么几个, 根据自己的需要吧,上面都已注明是否必须配置。

下面还是上个demo及时练练手吧:

------------------------------------------------------------------------下面是针对select 的练手demo---------------------------------------------------------------------------------------

数据库:新增两张表(t_course, t_student)

t_course:

t_student:

其中,1个student可选择多个course进行学习。

我们还是拿上篇文章的demo, 继续写:

增加后,项目目录如下所示:

 

Course.java:

 View Code

Student.java:

 View Code

CourseDao.java:

 View Code

StudentDao.java:

 View Code

courseDao.xml:

复制代码
<mapper namespace="com.dy.dao.CourseDao"><!-- 1.此处直接将resultType 设置为course, 一看就知道我设置了别名吧,如果没有设置别名,那么resultType = com.dy.entity.Course。2.可能细心的你会发现:Course.java中的属性名与数据库字段名不一致,下面,我就在sql语句中用了as, 使之匹配,当然方法不止一种,在学习了resultMap之后,你能看到一种更直观优雅的方式去将javabean中的属性与数据库字段名保持一致3.findCourseById 与CourseDao中findCourseById方法对应, 那么传入的参数名称以及类型也应该保持对应关系。4.可以看到,在sql语句中,通过#{}表达式可以获取参数。5.下面这条sql语句,实际上的形式是怎么样的?还记得之前说过,mybatis默认为preparedStatement吧,那么,用我们jdbc代码来看,它其实就是:select course_id as id, course_name as name, course_delete_flg as deleteFlag from t_course where course_id=?--><select id="findCourseById"  resultType="course" >select course_id as id, course_name as name, course_delete_flg as deleteFlag from t_course where course_id=#{courseId}</select></mapper>
复制代码

CourseDaoTest.java:

 View Code

上面的示例,我们针对course, 简单演示了 select的用法, 不过有个问题值得思考: 一个student可以对应多个course,  那么,在mybatis中如何处理这种一对多, 甚至于多对多,一对一的关系呢?

这儿,就不得不提到 resultMap 这个东西, mybatis的resultMap功能可谓十分强大,能够处理复杂的关系映射, 那么resultMap 该怎么配置呢? 别急,这就来了:

resultMap的配置:

复制代码
<!-- 1.type 对应类型,可以是javabean, 也可以是其它2.id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id指定--><resultMap type="" id=""><!-- id, 唯一性,注意啦,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键) property属性对应javabean的属性名,column对应数据库表的列名(这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)--><id property="" column=""/><!-- result与id相比, 对应普通属性 -->    <result property="" column=""/><!-- constructor对应javabean中的构造方法--><constructor><!-- idArg 对应构造方法中的id参数 --><idArg column=""/><!-- arg 对应构造方法中的普通参数 --><arg column=""/></constructor><!-- collection,对应javabean中容器类型, 是实现一对多的关键 property 为javabean中容器对应字段名column 为体现在数据库中列名ofType 就是指定javabean中容器指定的类型--><collection property="" column="" ofType=""></collection><!-- association 为关联关系,是实现N对一的关键。property 为javabean中容器对应字段名column 为体现在数据库中列名javaType 指定关联的类型--><association property="" column="" javaType=""></association></resultMap>
复制代码

好啦,知道resutMap怎么配置后,咱们立即接着上面的demo来练习一下吧:

------------------------------------------------------------------下面是用resultMap处理一对多关系的映射的示例-------------------------------------------------------------

一个student对应多个course, 典型的一对多,咱们就来看看mybatis怎么配置这种映射吧:

studentDao.xml:

 View Code

StudentDaoTest.java:

 View Code

 

相信通过以上demo, 大家也能够使用mybatis的select 和 resultMap的用法了。上面demo只演示了一对多的映射,其实多对一、多对多也与它类似,所以我就没演示了,有兴趣的可以自己动手再做做。

好啦,本次就写到这儿了。(PS,生病一周了,所以到现在才更新博客)。

另附上demo, 需要的童鞋可以前往下载:

demo 下载地址:http://pan.baidu.com/s/1qWjsDzA

转载于:https://www.cnblogs.com/0x2D-0x22/p/4147490.html

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

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

相关文章

北大保送、硕博连读!《西游记》红孩儿扮演者现成中科院博士!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术86版《西游记》可以说是很多人的记忆&#xff0c;男女老幼几乎都看过这个版本&#xff0c;虽然已经过去三十多年&#xff0c;但如今依旧是经典无法超越之作。看过86版《西游记》的小伙伴应该都还记得里面牛魔…

Android插件化开发之运行未安装apk的activity

1、介绍 我们知道PathClassLoader是一个应用的默认加载器(而且他只能加载data/app/xxx.apk的文件)&#xff0c;但是我们加载插件一般使用DexClassLoader加载器&#xff0c;所以这里就有问题了&#xff0c;其实如果对于开始的时候&#xff0c;每个人都会认为很简单&#xff0c;…

理解UI线程——SWT, Android, 和Swing的UI机理

2019独角兽企业重金招聘Python工程师标准>>> 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Ma…

C#多线程开发-并发集合中的ConcurrentQueue

前言大家好&#xff0c;我是阿辉。上一篇博文简单介绍了C#中支持并发的数据字典&#xff0c;简单举例说明比较了常规集合与ConcurrentDictionary的读写速度。下来简单介绍其中一个线程安全队列ConcurrentQueue;ConcurrentQueue队列我们不陌生&#xff0c;在数据结构这门课中就有…

一个人动情之后的表现......

1 卖家能有什么坏心思呢&#xff08;via.城与橙与澄&#xff0c;侵删&#xff09;▼2 严重怀疑传了答案▼3 别说我还真没留意到&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 领导说“辛苦了”&#xff0c;你要怎么回答▼5 哦吼&#xff08;素材来源网络&#…

线性代数第五版吉尔伯特课后答_线性代数同济第五版第六章课后习题答案!

搜集 | 整理 | 测试 | 小愉免责声明&#xff1a;以下资源或软件均来自互联网&#xff0c;仅供学习和交流使用&#xff0c;如有侵权请联系删除&#xff0c;请勿用于商业和非法途径等&#xff0c;如有法律纠纷与本人无关&#xff01;本文未经允许&#xff0c;不得转载&#xff0…

sql长整型_SQL 性能优化梳理

先简单梳理下Mysql的基本概念&#xff0c;然后分创建时和查询时这两个阶段的优化展开。1 基本概念简述1.1 逻辑架构第一层&#xff1a;客户端通过连接服务&#xff0c;将要执行的sql指令传输过来第二层&#xff1a;服务器解析并优化sql&#xff0c;生成最终的执行计划并执行第三…

网络的东西南北

前一陣子連續出差, 加上許多的內部會議, 搞的差點想去撞牆把自己搞昏之後就可以休息一下. 但是家中還有嗷嗷待哺的嬰兒需要爸爸幫他洗屁屁, 所以只有咬牙繼續撐下去. 不過這兩個月來, 不過在公司內部還是外部, 我都收到一樣類似的老問題那就是&#xff1a;&#xff08;認識我的…

K8s 中使用 cert-manager 申请免费 Https 证书

K8s 中使用 cert-manager 申请免费 Https 证书Intro最近在尝试将自己的应用从自己用 kind 部署的一个 k8s 集群迁移到 Azure 的 AKS 上&#xff0c;其中一个问题就是 https 证书&#xff0c;原来的 k8s 集群是放在 nginx 后端的并没有直接管理 https 证书&#xff0c;https 证书…

为什么要学数学?因为它真的没用啊!

全世界只有3.14 % 的人关注了爆炸吧知识数学之用无用之用有一天&#xff0c;表妹过来问了我两个问题&#xff1a;数学有什么用&#xff1f;那些深奥的公式对于普通人有什么意义&#xff1f;相信大多数人都有这个疑问&#xff0c;但总是找不到一个标准答案。问老师&#xff0c;他…

UI设计教程-界面设计构图

九宫格构图&#xff0c;圆心点放射形构图&#xff0c;三角形构图&#xff0c;SF字形构图。 1.九宫格网格构图 这种版式主要运用在分类为主的一级页面&#xff0c;起到功能分类的作用。 通常在界面设计中&#xff0c;我们会利用网格在界面进行布局&#xff0c;根据水平方向和垂直…

Android之最好理解的Binder机制

转载&#xff1a;http://weishu.me/2016/01/12/binder-index-for-newer/ Binder学习指南 发表于 2016-01-12 | 92条评论 | 34011次阅读毫不夸张地说&#xff0c;Binder是Android系统中最重要的特性之一&#xff1b;正如其名“粘合剂”所喻&#xff0c;它是系统间各个组件…

sql年月日24小时制_24小时制的「无码」真人秀,令人叫绝

几年前&#xff0c;我们总说互联网给世界带来了巨大的变化。到了现在&#xff0c;没想到自媒体的发展居然也能改变生活。但大家知道吗&#xff0c;其实早在20年前&#xff0c;美国那边就曾因“直播”掀起过不小的风浪——还是尺度挺大的那种。以至于毒师看过以后&#xff0c;整…

HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...

背景HangFire有个很奇怪的现象&#xff0c;就是即使你设置的循环作业是一天一次&#xff0c;但是每次作业执行很长时间&#xff0c;我们假设是1小时&#xff0c;那么差不多在开始执行之后的30分钟之后&#xff0c;如果还在执行job,系统就会自动帮你重新开启了新的job执行。也就…

linux之查看文件大小、文件夹的大小和分区磁盘速度

1 查看文件大小 查看文件大小的命令 ls -l filename 比如: 注意这个 1243870 是 单位是B 2 查看文件夹的大小 查看文件夹的大小,也就是查看文件夹下所有文件的大小总和 先进入这个目录: cd FoldeName 命令如下: du -sh 3 查看分区磁盘速度 命令如下:

再谈“开源软件供应链安全”

| 作者&#xff1a;庄表伟| 编辑&#xff1a;刘雪洁| 设计&#xff1a;周颖| 责编&#xff1a;王玥敏缘起之前写过一篇文章《我所理解的开源软件供应链安全》&#xff0c;当时的情况&#xff0c;还没有出现一些值得探讨的&#xff0c;堪称紧迫的热点事件&#xff0c;所以我也仅…

python 测试框架

2019独角兽企业重金招聘Python工程师标准>>> # -*- encodeing:utf-8 -*- import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.size 4 def tearDown(self): self.size 0 def testSize(self): self.assertEqual(self.size, 4) def su…