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 ...
随机推荐
- 跟随上次的socket sever,追加Tcplistener、Httplistener的server
一.Tcplistener搭建web server 1.同socket类似,Tcplistener其实是对socket的封装,方便编程,先初始化tcplistener并且开始监听 //初始化端点信息 ...
- Java基础知识二次学习--第三章 面向对象
第三章 面向对象 时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...
- 9.Java 加解密技术系列之 RSA
Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...
- c语言项目开发流程二部曲
一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...
- maven问题:如何不继承父工程的依赖
在maven中,使用父工程来管理所有的依赖,当子工程只需要用到父工程的部分依赖,而不是所有依赖时,只需要在父工程的依赖中加入<dependencyManagement></depen ...
- opencv基础到进阶(1)
Opencv是一个用户基础非常多的视觉开发库,可以用来实现人脸识别等功能,由于涉及到大量的调用与计算,所以对硬件的条件要求很高,并且还需要时时刻刻注意内存溢出这个问题,怎么样?很刺激吧. 从这篇文章开 ...
- shell中如何进行算术运算
A=3 B=6 1.let算术运算表达式 let C=$A+$B2.$[算术运算表达式] C=$[$A+$B] 3.$(()) C=$(($A+$NB))
- php curl 的几个实例
使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...
- [HDU1020] Encoding - 加密
Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...
- python-散列表
散列表 简单地来说,通过某种函数关系将输入的数据映射为数字,使得数字与数据有着一一对应的关系. 其中,散列函数必须满足一定的要求: 它必须是一致的.例如,当你输入mag时得到4,那么每当输入mag时, ...