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 ...
随机推荐
- 如何让CSS区别IE版本
关于IE浏览器实在太坑爹了,但你又不得不去解决它,不过就本人所知,IE8—IE10差别不大,至少本人还没有遇到过在IE8环境下到了IE9及以上版本就出现坑爹的问题,但我们又不得不面对IE8以下的版本, ...
- ZigZag Conversion2015年6月23日
题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...
- Ultimus BPM 房地产与建筑行业应用解决方案
Ultimus BPM 房地产与建筑行业应用解决方案 行业应用需求 房地产与建筑行业客户业务特点是集团化管控,多区域.多项目.多业态管理,而行业业务往往项目周期长,涉及专业复杂,客户越来越重视管理和跟 ...
- 消息队列RabbitMQ与Spring集成
1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 官网:http://www.rabbitmq.c ...
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...
- Java反射机制剖析(三)-简单谈谈动态代理
通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1. 代理模式 代理模式就是为其他对象提供一种代理来 ...
- Introducing: Machine Learning in R(转)
Machine learning is a branch in computer science that studies the design of algorithms that can lear ...
- 2017CUIT校赛-线上赛
2017Pwnhub杯-CUIT校赛 这是CUIT第十三届校赛啦,也是我参加的第一次校赛. 在被虐到崩溃的过程中也学到了一些东西. 这次比赛是从5.27早上十点打到5.28晚上十点,共36小时,中间睡 ...
- Python教程(2.2)——数据类型与变量
和C/C++.Java一样,Python也有数据类型和变量两个概念. 数据类型 Python中的几个基本数据类型为整数(integer/int).浮点数(float/float).布尔值(boolea ...
- 15.Three Sum
思路 直接暴力,\(O(n^4 log(n))\),不出意外的超时了.. class Solution { public: vector<vector<int>> threeS ...