Mapper XML 文件
前言
上次把mybatis-config.xml基本操作已经介绍完成,那么这篇文章将对mybatis的映射文件进行介绍
Mapper配置文件
1.mapper标签
<mapper namespace="类的全限定名">
</mapper>
该标签是此配置文件主标签,其中的namespace的值为需要映射的接口
select
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
这里select标签是针对查询语句进行操作的,下面一一介绍其属性的作用:
1.id:对应接口中的抽象方法名
2.parameterType:对参数类型进行声明,如果有多个建议使用@Param()注解与map
3.resultType:对该方法返回值的声明标记,如果有多个返回值,会自动封装成List,还可以指定为其他类型
resultMap:常见使用场景
第一种用法
<!-- 当实体对象的属性与数据表的字段名不匹配时,则用resultMap来做映射 -->
<resultMap id="leaveMap" type="LeaveRecords">
<id column="id" property="id"/>
<result column="levaeTime" property="levaeTime"/>
<result column="reason" property="reason"/>
<!-- 表连接的方式取数据,封装成Employe对象 -->
<association property="employe" javaType="Employe">
<id column="e.id" property="id"/>
<result column="name" property="name"/>
</association>
</resultMap>
第二种用法
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
第三种用法
<resultMap type="Employe" id="employeMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!-- 一对多的映射 封装某个员工的所有请假记录 -->
<collection property="list" column="id" select="com.leave.dao.LeaveRecordsDao.findByuId"/>
</resultMap>
这是我找到的比详细的示例:
<resultMap id="唯一的标识" type="映射的pojo对象">
<id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
<result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
<association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
<id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
<result column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性" ofType="集合中的pojo对象">
<id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
<result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />
</collection>
</resultMap>
insert
先看一下用法
<!-- 添加请假信息 LeaveRecords参数是一个对象 #{userName} 从对象的属性中取数据,通过属性所封装的get方法取数据
useGeneratedKeys=true:表示我在添加数据时需要系统自动产生的主键值 -->
<insert id="add" parameterType="LeaveRecords" useGeneratedKeys="true"
keyProperty="id">
insert into leaverecords values(null,#{name},#{levaeTime},#{reason})
</insert>
这里我们可以看到insert标签使用来封装插入数据的操作的,其中:
id:是接口中的方法名
parameterType:是对应#{…}中的属性集合对应的实体类
useGeneratedKeys:这个设为true会获取自动增长的列
以上我列出了基本用法,有些用法这会在以后文章一一列出的
update
其实增删改的标签用法都差不多
<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
delete
下面是删除
<delete
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">
以下就对以上增删改的各个属性进行一波解释
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |
flushCache | 将其设置为 true,不论语句什么时候被带哦用,都会导致缓存被清 空。默认值:false。 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。 |
timeout | 这个设置驱动程序等待数据库返回请求结果, 并抛出异常时间的最 大等待值。默认不设置(驱动自行处理)。 |
statementType | STA TEMENT,PREPARED 或 CALLABLE 的一种。这会让 MyBatis 使用选择使用 Statement,PreparedStatement 或 CallableStatement。 默认值:PREPARED。 |
useGeneratedKeys | ( 仅 对 insert 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的 getGeneratedKeys 方法来取出由数据(比如:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。 默认值:false。 |
keyProperty | (仅对 insert 有用) 标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。 默认: 不设置。 |
keyColumn | (仅对 insert 有用) 标记一个属性, MyBatis 会通过 getGeneratedKeys 或者通过 insert 语句的 selectKey 子元素设置它的值。 默认: 不设置。 |
好,下面就来总体的对以上增删改再示例一下
<insert id="insertAuthor" parameterType="domain.blog.Author">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateAuthor" parameterType="domain.blog.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<delete id="deleteAuthor" parameterType="int">
delete from Author where id = #{id}
</delete>
最后再列出一个比较标准的映射文件内容
<?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.lib.dao.BookDao">
<!-- 对实体类的属性和数据库的字段进行映射 -->
<resultMap type="com.lib.entity.Book" id="bookMap">
<id column="bookid" property="bookid"/>
<result column="bookName" property="bookname" />
<result column="price" property="price"/>
<result column="content" property="content"/>
<result column="press" property="press"/>
<association property="authorid" column="authorid" select="com.lib.dao.AuthorDao.getAuthorById"/>
</resultMap>
<select id="find" resultMap="bookMap">
select * from book
</select>
<select id="findByAuthorId" resultMap="bookMap">
select * from book where authorid = #{authorid.authorId}
</select>
<select id="findById" resultMap="bookMap">
select * from book where bookid = #{bookid}
</select>
<select id="getAllInfo" parameterType="map" resultMap="bookMap">
select * from book
<where>
<if test="bookname != null">
bookname like concat('%',#{bookname},'%')
</if>
<if test="author.authorName != null">
AND authorid like concat('%',#{author.authorId},'%')
</if>
</where>
limit #{begin},#{size}
</select>
<insert id="add" parameterType="com.lib.entity.Book" useGeneratedKeys="true" keyProperty="bookId">
insert book values(null,#{bookName},#{authorid.authorId}.#{price},#{content},#{press})
</insert>
<delete id="delete">
delete from book where bookid = #{bookid}
</delete>
<update id="update" parameterType="com.lib.entity.Book">
update book set bookname = #{bookname},
author = #{authorid.authorId},
price = #{price},
content = #{content},
press = #{press}
where bookid = #{bookid}
</update>
</mapper>
希望大家通过这篇文章能够有所收获