MyBatis-sql映射文件
Sql映射文件
MyBatis真正的力量是在映射语句中。这里是奇迹发生的地方。对于所有的力量,SQL映射的XML文件是相当的简单。当然如果你将它们和对等功能的JDBC代码来比较,你会发现映射文件节省了大约95%的代 码量。MyBatis的构建就是聚焦于SQL的,使其远离于普通的方式。
SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
>mapper:映射文件的根元素节点,只有一个属性namespace命名空间,用于区分不同的mapper,全局唯一 ,namespace绑定的DAO接口全名称,即面向接口编程。这里的mapper就相当于接口的实现类。
- cache - 配置给定命名空间的缓存。
- cache-ref – 从其他命名空间引用缓存配置。
- resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
- parameterMap – 已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。这里不会记录。
- sql – 可以重用的SQL块,也可以被其他语句引用。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
一:使用select完成但条件查询
使用工具idea和mysql数据库
创建实体类
public class student {
private int stuId;
private String stuName;
private grade getGrade;
private int stuAge;
public grade getGetGrade() {
return getGrade;
}
public void setGetGrade(grade getGrade) {
this.getGrade = getGrade;
}
public int getStuAge() {
return stuAge;
}
public student(int id,String name){
}
public student(){}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
}
使用select完成条件查询
一:首先配置mapper使用resultType
<!--模糊查询 使用resultType返回结果集-->
<select id="getAllStudentByLike" parameterType="String" resultType="stu">
select * from student where stuName like CONCAT('%',#{stuName},'%')
</select>
测试类
public void Test() throws IOException {
studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class);
List<student> list = dao.getAllStudentByLike("z");
for (student item:list) {
System.out.println("----------"+item.getStuName());
}
}
另外parameterType支持的复杂类型除了javaBean之外,还包括Map类型
即修改Mapper
<!--模糊查询-->
<select id="getAllStudentByLike" parameterType="Map" resultType="stu">
select * from student where stuName like CONCAT('%',#{stuName},'%')
</select>
然后再测试类里创建一个 HashMap集合直接作为方法参数即可
studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class);
Map<String,String> userMap = new HashMap<String, String>();
userMap.put("stuName","z");
List<student> list = dao.getAllStudentByLike(userMap);
for (student item:list) {
System.out.println("----------"+item.getStuName());
}
不过map集合的key值必须和类中的字段名相同。
二:使用resultMap完成两表查询
比如学生表里关联班级表的主键id,如果使用resultType只能展示其id但在实际中往往关注的是班级名称,所有需要使用resultMap映射自定义结果。
<resultMap id="studentMap" type="entity.student">
<id property="stuId" column="stuId"></id>
<result property="stuName" column="stuName"></result>
<result property="gradeName" column="gradeName"> </resultMap> //sql语句
select * from student,grade
resultType直接表示 返回 类型 ,包括基础类型和复杂数据类型
resultMap则是对外部resultMap的引用,对应resultMap的id 表示返回结果映射到 哪一个resultMap。:他的应用场景是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果 。
另外在 MyBatis的select元素中,resultType和resultMap本质上是一样的,都是Map数据结构。但是 二者不能同时 存在。
三:使用resultMap的自动映射级别
MyBatis中分为三个映射级别
>NONE:禁止自动匹配
>PARTIAL:(默认):自动匹配所有属性有内部嵌套(association,collection)的除外
>FULL:自动匹配所有
在大配置里设置autoMappingBehavior
<settings>
<!--设置resultMap的自动映射级别为Full(自动匹配所有)-->
<setting name="autoMappingBehavior" value="FULL" /> <!--FULL要大写··-->
</settings>
设置autoMappingBehavior的值为FULL时就不需要配置resultMap下的节点,他会根据数据库自动匹配
四:使用update完成修改
<update id="update">
update student set stuName=#{0} where stuId=#{1}
</update>
这里使用占位符比较简单的一种作为参数,在测试类中就直接填参就行了
五:使用映射复杂类型的属性association
前面的result只能映射到javaBean的某个“简单类型”属性,基础数据类型和包装类等/
但要映射复杂类型的属性时需要用到assocoation 复杂类xing:即一个javaBean里有另一个javaBean,但是association仅处理一对一的关联关系
private int stuId;
private String stuName;
private grade getGrade;
private int stuAge;
。。。。。省略封装
<resultMap id="studentMap" type="entity.student">
<!-- <id property="stuId" column="stuId"></id>
<result property="stuName" column="stuName"></result>-->
<!--关联另一个 属性-->
<association property="getGrade" javaType="grade">
<!-- <id property="gradeId" javaType="Integer" column="gradeId"></id>
<result property="gradeName" javaType="String" column="gradeName"></result>-->
</association>
</resultMap>
<!--这里使用了自动匹配-->
<select id="getAllStudent" resultMap="studentMap">
SELECT * FROM student,grade WHERE student.stuGrade=grade.gradeId
</select>
测试类里直接调用即可
六:前面说到association仅处理一对一的管理关系
如果要处理一对多的关系,则需要使用collection,它与 association元素差不多,但它映射的属性是一个集合列表,即javaBean内部嵌套一个复杂数据类型属性。
javaBean
private int gradeId;
private String gradeName;
private List<student> gatStudent;
<resultMap id="gradeMap" type="grade">
<!--<id property="gradeId" column="gradeId"></id>
<result property="gradeName" column="gradeName"></result>-->
<collection property="gatStudent" ofType="stu">
<!-- <id property="stuId" column="stuId"></id>
<result property="stuName" column="stuName"></result>-->
</collection>
</resultMap>
<!--查询对应年级的student-->
<select id="getAll" resultMap="gradeMap">
select * from student,grade where stuGrade = gradeId and gradeId=1
</select>
完:
MyBatis-sql映射文件的更多相关文章
- Mybatis sql映射文件浅析 Mybatis简介(三)
简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...
- Mybatis sql映射文件浅析 Mybatis简介(三) 简介
Mybatis sql映射文件浅析 Mybatis简介(三) 简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...
- Mybatis SQL映射文件详解
Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...
- MyBatis -- sql映射文件具体解释
MyBatis 真正的力量是在映射语句中. 和对等功能的jdbc来比价,映射文件节省非常多的代码量. MyBatis的构建就是聚焦于sql的. sql映射文件有例如以下几个顶级元素:(按顺序) cac ...
- SSM - Mybatis SQL映射文件
MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给 ...
- 初始MyBatis、SQL映射文件
MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...
- MyBatis 创建核心配置文件和 SQL 映射文件
Mybatis 的两个配置文件(mybatis-config.xml 和 xxxMapper.xml)都为 xml 类型,因此在 eclipse 中创建 xml 文件命名为相应的 mybatis-c ...
- MyBatis 的基本要素—SQL 映射文件
MyBatis 真正的强大在于映射语句,相对于它强大的功能,SQL 映射文件的配置却是相当简单.对比 SQL 映射配置和 JDBC 代码,发现使用 SQL 映射文件配置可减少 50% 以上的代码,并且 ...
- Mybatis(二) SQL映射文件
SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...
- MyBatis学习-映射文件标签篇(select、resultMap)
MyBatis 真正的核心在映射文件中.比直接使用 JDBC 节省95%的代码.而且将 SQL 语句独立在 Java 代码之外,可以进行更为细致的 SQL 优化. 一. 映射文件的顶级元素 selec ...
随机推荐
- windows下命令行cmder工具
windows下系统自带的命令行工具,实在是太丑了,输入命令后,有时排版乱七八糟,而且使用惯liunx系统的命令后,实在是不能够接受,这么蹩脚的工具:为此我给大家推荐一款实用的开源工具cmder 下载 ...
- 详解CockroachDB事务处理系统
本文提到的一些术语,比如Serializability和Linearizability,解释看Linearizability, Serializability and Strict Serializa ...
- iOS Regex匹配关键字并修改颜色
引入第三方框架RegexKitLite /** * 根据传入的文字返回一个符合规则的富文本 * * @param title 匹配的文字 * * @return 创建的富文本 */ -(NSAttri ...
- let与const详解
在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域? 众所就知,在js当中存在预解析的概念,就是变量提升.并且只存在全局作用域和私有作用域.在全局定义的变量就是全局变量,而在函数内部定义的 ...
- 【JAVAWEB学习笔记】28_jqueryAjax:json数据结构、jquery的ajax操作和表单校验插件
Ajax-jqueryAjax 今天内容: 1.json数据结构(重点) 2.jquery的ajax操作(重点) 3.jquery的插件使用 一.json数据结构 1.什么是json JSON(J ...
- JAVA网络编程TCP通信
Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端 ...
- enote笔记语言(2)(ver0.3)
why not(whyn't) 为什么不(与“why”相对应,是它的反面) how对策 how设计 key-memo: ...
- 学习笔记TF019:序列分类、IMDB影评分类
序列分类,预测整个输入序列的类别标签.情绪分析,预测用户撰写文字话题态度.预测选举结果或产品.电影评分. 国际电影数据库(International Movie Database)影评数据集.目标值二 ...
- 在Quo.js下Tap和singleTap的区别
前两天上网搜开发手机页面的JS,看到了Quo.js下载下来后来看了一下,支持的触屏手势挺多的,在一般的开发中应该够用了,更让我喜欢它的一点是它跟JQ差不多(虽然功能不如JQ强大但是语法基本一致).这就 ...
- 你是否也在学习ES6 Promise时遇到过这个问题?
背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...