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>

 

 

完:

 

网站地图xml地图