MyBatis笔记(第三部分)

前言

上次把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>

希望大家通过这篇文章能够有所收获

猜你喜欢

转载自blog.csdn.net/qq_43538697/article/details/108245493