Sql 映射文件
MyBatis 真正的力量是在映射语句中。这里是奇迹发生的地方。对于所有的力量,SQL 映射的 XML 文件是相当的简单。当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 95% 的代 码量。MyBatis 的构建就是聚焦于 SQL 的,使其远离于普通的方式。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
>mapper: 映射文件的根元素节点,只有一个属性 namespace 命名空间,用于区分不同的 mapper,全局唯一 ,namespace 绑定的 DAO 接口全名称,即面向接口编程。这里的 mapper 就相当于接口的实现类。
一:使用 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;
- }
- publicstudent(int id,String name){
- }
- public student(){}
- public voidsetStuAge(int stuAge) {
- this.stuAge = stuAge;
- }
- public int getStuId() {
- return stuId;
- }
- public voidsetStuId(int stuId) {
- this.stuId = stuId;
- }
- public String getStuName() {
- return stuName;
- }
- public void setStuName(String stuName) {
- this.stuName = stuName;
- }
- }
使用 select 完成条件查询
一:首先配置 mapper 使用 resultType
- select * from student where stuName like CONCAT('%', # {
- stuName
- },
- '%')
测试类
- public voidTest()throws IOException {
- studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class);
- List list = dao.getAllStudentByLike("z");
- for (student item:list) {
- System.out.println("----------"+item.getStuName());
- }
- }
另外 parameterType 支持的复杂类型除了 javaBean 之外,还包括 Map 类型
即修改 Mapper
- select * from student where stuName like CONCAT('%', # {
- stuName
- },
- '%')
然后再测试类里创建一个 HashMap 集合直接作为方法参数即可
- studentDao dao = MyBatis.getSessionTwo().getMapper(studentDao.class);
- Map userMap = newHashMap();
- userMap.put("stuName","z");
- List list = dao.getAllStudentByLike(userMap);
- for (student item:list) {
- System.out.println("----------"+item.getStuName());
- }
不过 map 集合的 key 值必须和类中的字段名相同。
二:使用 resultMap 完成两表查询
比如学生表里关联班级表的主键 id,如果使用 resultType 只能展示其 id 但在实际中往往关注的是班级名称,所有需要使用 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 intstuAge;
- 。。。。。省略封装
- SELECT * FROM student,grade WHERE student.stuGrade=grade.gradeId
测试类里直接调用即可
六:前面说到 association 仅处理一对一的管理关系
如果要处理一对多的关系,则需要使用 collection,它与 association 元素差不多,但它映射的属性是一个集合列表,即 javaBean 内部嵌套一个复杂数据类型属性。
javaBean
- private int gradeId;
- private String gradeName;
- privateList 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>
- select * from student,grade where stuGrade = gradeId and gradeId=1
完:
来源: http://www.cnblogs.com/zhangyu0217----/p/7112152.html