Mybatis XML映射文件

来源:互联网 发布:网络小贷清理整顿会议 编辑:程序博客网 时间:2024/05/16 15:05

Mybatis XML映射文件


在 Mybatis 中映射文件主要是用于编写SQL语句,通过SqlSession的实例进行定位执行。其中定位是通过 “mapper”标签的namespace属性来确定是哪一个映射文件,再通过每个元素的”id”属性确定哪一个SQL语句。下面是“增 删 改 查”操作对应的元素名称。

  • insert – 映射插入语句
  • delete – 映射删除语句
  • update – 映射更新语句
  • select – 映射查询语句

举例insert元素使用

下面是一段代码,我将通过实例来介绍insert标签的使用。

  • xml映射文件代码
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.test.dao.EmployeeDao">    <sql id="insertSql">         INSERT INTO        oa_employee        (EMP_NAME,SEX,FK_DEPT_ID)    </sql>    <insert id="insertOne" parameterType="com.test.model.Employee"      useGeneratedKeys="true" keyProperty="emp_id">       <include refid="insertSql"></include>        VALUES(#{emp_name},#{emp_sex},#{fk_dept_id})    </insert>     <insert id="insertTwo"     useGeneratedKeys="true" keyProperty="emp_id">       <include refid="insertSql"></include>        VALUES(#{emp_name},#{emp_sex},#{fk_dept_id})    </insert></mapper>

首先 namespace 属性用于定位 mapper 映射文,它的值有两种书写方式:
- 完全限定名 例如”com.test.dao.EmployeeDao”
- 短命称 例如 “EmployeeDao”
sql 元素用于提取映射文件中重复的sql语句片段,通过 include 元素引入并且通过 refid 属性来确定具体引入那条片段。
以上两段 sql 语句中的parameterType是可选的,当参数为基本数据类型和String类型时 parameterType 不写,#{}中的参数可以任意填入,但不能为空。当参数为自定义类型的相关属性或者 Map 的 key 时,parameterType 可以写入类的全路径或者”map” ,也可以不写。
当你的数据库的id字段设置自动增长时,搭配 useGeneratedKeys=”true” keyProperty=”emp_id” ,就可以将其id自动填充到返回的对象中。

select 元素的结果处理

结果处理有两种方式:resultType和resultMap 。其中resultType是通过指明返回值类型来实现的,resultMap通过外部的resultMap设置来实现结果集的处理。

resultType

    <select id="select01" resultType="map">    SELECT *    FROM oa_employee    where emp_id = 50    </select>     <select id="select02" resultType="Employee">    SELECT *    FROM oa_employee    where emp_id = 50    </select>

代码中的 resultType 属性应该写类名的全路径,但是可以采用别名的方式来解决这个问题,别名的设置是在核心配置文件中进行配置,配置时请注意元素的位置,应放置在setting元素的下面,不可以打算顺序,否则会编译失败。

 <typeAliases>        <typeAlias type="com.test.model.Employee" alias="Employee"/>    </typeAliases>  

以上代码中的resultType分别是map和自定义类型,但是均可以成功返回。但是要求自定义类型的构造方法必须重载为包含返回字段初始化的形式而且数据库字段名称要和自定义类的属性名一致。例如:

    public Employee( Integer emp_id , String emp_name , String emp_sex , Integer fk_dept_id ) {        super();        this.emp_id = emp_id;        this.emp_name = emp_name;        this.emp_sex = emp_sex;        this.fk_dept_id = fk_dept_id;    }

当返回多条数据时,resultType 只写单条数据的类型。接受SqlSession的调用方法的返回值时采用List容器进行接收。

resultMap

<resultMap type="com.test.model.Employee" id="EmployeeResultMap" autoMapping="true">        <id property="emp_id" column="emp_id"/>        <result property="emp_name" column="emp_name"/>        <result property="emp_sex" column="sex"/>        <result property="fk_dept_id" column="fk_dept_id"/>    </resultMap>

上面是一段resultMap的代码, type 属性指明了自定义类,id 提供了这个结果集的唯一签名,autoMapping 实现了当字段名和类的属性名一致时自动完成映射。其中 id 元素是提供了主键字段的字段映射,其他字段则使用 result 元素进行映射。其中未注明的属性为javaType 和 jdbcType 分别通过这两个属性指明该字段在java中的类型和数据库中的类型。

关联的应用: 当你查询出一个对象时,对象中包含一个其他对象的信息需要一并查出是,就用到了关联。例如:查询出一个员工的信息,员工信息中包含了单位的信息。其中员工和单位分别在两个类体现。
下面代码将解决这个问题:

<resultMap type="com.test.model.Employee" id="EmployeeResultMap" autoMapping="true">        <id property="emp_id" column="emp_id"/>        <result property="emp_name" column="emp_name"/>        <result property="emp_sex" column="sex"/>        <result property="fk_dept_id" column="fk_dept_id"/>        <association property="department" javaType="com.test.model.Department"            resultMap="com.test.dao.DepartmentDao.DepartmentResultMap"        />    </resultMap>    <select id="select02" resultMap="EmployeeResultMap">     SELECT od.*,oe.* FROM oa_employee oe       LEFT JOIN oa_department od      ON od.dept_id = oe.fk_dept_id      WHERE oe.emp_id = 47    </select>

首先我们使用左关联查询出所有的信息(员工信息和对应的单位信息),然后使用resultMap来映射基本字段,再用association关联映射单位的信息。其中property指明 员工类中的单位类 的实例属性,javaType指明映射的java数据类型, resultMap 指明了 单位 实例应如何进行结果映射。

    private Integer emp_id;    private String emp_name;    private String  emp_sex;    private Integer fk_dept_id;    private Department department;

上面的代码是员工类中的所有属性。department 指代的就是 员工类中的单位类 的实例属性。
集合的应用
当你查询出一个单位信息时,也需要这个单位的所有员工信息, 这时就用到了集合。简单来说就是在数据库中一并查询出单位信息,属于这个单位的所有员工的信息。我们需要在单位类中建立一个员工集合的属性,用来表示属于这个单位的所有员工。像这样:

private Integer dept_id;private String dept_name;private List<Employee> employeeList;

接下来,我们编写映射文件的内容。

<resultMap type="com.test.model.Department" id="DepartmentResultMap" autoMapping="true">        <id property="dept_id" column="dept_id"/>        <collection        property="employeeList"         javaType="java.util.List"         ofType="com.test.model.Employee"        resultMap="com.test.dao.EmployeeDao.BasicResultMap"/>    </resultMap>    <select id="select01" resultMap="DepartmentResultMap">    SELECT       *     FROM      oa_department od       LEFT JOIN      oa_employee oe       ON oe.fk_dept_id = od.dept_id     </select>

上面的代码中 collection 元素就是我们主要要说的集合元素,property 属性和关联元素中 property 元素是一样的,需要写入结果类中的要关联的属性名。 javaType表明 property 中属性的类型, ofType写的是容器中的泛型类型。 resultMap 写的是容器中元素的映射规则。

欢迎学习,如有错误请及时联系本人修改。
希望指出本人不足共同进步
LLY19960418

0 0
原创粉丝点击