第二章 SQL映射文件详解

第二章 SQL映射文件详解

MyBatis框架最具特色的部分是SQL映射。

MyBatis框架主要思想是将SQL语句从程序代码中分离出来,对JDBC访问数据库的代码进行封装,减少数据访问层的编码量。SQL语句和代码解耦,对SQL语句的灵活管理,方便SQL语句调优

SQL 映射文件中的几个*元素

  1. mapper:SQL映射文件的根元素。只有一个namespace,用于区分不同的mapper,必须全局唯一
  2. cache:为给定命名空间配置缓存。
  3. cache-ref:引用其他命名空间中的缓存配置。
  4. resultMap:用于描述查询结果集中的字段和Java实体类属性的对应关系。
  5. sql:定义可重用的SQL代码块,可以在其他语句映射中引用,提高编写和维护SQL语句的效率。
  6. insert:映射insert语句
  7. update:映射update语句
  8. delete:映射delete语句
  9. select:映射select语句

命名规则:

  1. SQL映射文件与Mapper接口同名(实体类名+Mapper),并放置在同一个包路径下。文件类型不一样
  2. mapper的namespace一般是要映射的Mapper接口的完全限定名。
  3. 接口中的方法名与映射文件中SQL语句的ID一一对应。MyBatis通过namespace+ID确定和接口方法绑定的SQL语句ID。这也就是为什么可以不通过Mapper接口直接用selectOne 和selectList来读取值。
  4. 不同的SQL映射文件中,子元素ID可以相同。(因为命名空间唯一,使用时是命名空间加上ID也就唯一了)

select 元素

select是MyBatis中最常用的元素之一
select语句有很多属性可以详细配置每一条语句
id
命名空间中唯一的标识符
接口中的方法与映射文件中的SQL语句id一一对应
parameterType
传入SQL语句的参数类型
resultType
SQL语句返回值类型的完整类名或别名

resultMap

描述如何将结果集映射到Java对象

<resultMap type="User" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/><!--property里是实体类的字段 coliumn是数据库里的列-->
<result property="userName" column="userName"/>
<result property="userRole" column=“userRole"/>
<result property="userRoleName" column="roleName"/>
</resultMap>
<select id="getUserList" resultMap="userList" parameterType="User"><!--一个外部resultMap的id,表示返回结果映射到哪一个resultMap上-->
	select u.*,r.roleName from smbms_user u,smbms_role r 
			where u.userName like CONCAT (‘%’,#{userName}, ‘%’)  
			and u.userRole = #{userRole} and u.userRole = r.id 
</select>

resultType :直接表示返回类型
基本数据类型
复杂数据类型
resultMap :对外部resultMap的引用
应用场景:
**数据库字段信息与对象属性不一致**
==复杂的联合查询,*控制映射结果==

二者不能同时存在,本质上都是Map数据结构

parameterType

基础数据类型****

int、String、Date等

只能传入一个,通过#{参数名}即可获取传入的值

复杂数据类型

Java实体类、Map等
通过#{属性名}或者#{map的keyName}即可获取传入值

resultMap自动映射匹配前提:字段名与属性名一致

resultMap的自动映射级别-autoMappingBehavior

PARTIAL(默认):自动匹配所有

NONE:禁止自动匹配

第二章 SQL映射文件详解

insert update delete 这类操作,数据库默认返回执行SQL语句锁影响的行数,所以Mapper接口的返回一般设置为int类型。者三个元素均没有resultType/resultMap属性

insert元素

idparameterType

<insert  id="add" parameterType="User" >
 insert into  smbms_user (userCode,userName,userPassword) 
		values ( #{userCode},#{userName},#{userPassword})
</insert>

update元素

id

parameterType

<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
	         userName = #{userName},
              userPassword = #{userPassword}  where id = #{id}
</update>

delete元素

id
parameterType

<delete id ="deleteUserById" parameterType="int">
	delete from smbms_user where id = #{id}
</delete>

resultMap属性

id:resultMap的唯一标识
type:
Java实体类
resultMap子元素
id:一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result:映射到JavaBean的某个“简单类型”属性
association
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection
映射到JavaBean的某个“复杂类型”属性,比如集合

association 元素

复杂的类型关联一对一
内部嵌套
映射一个嵌套JavaBean属性
属性
property:映射数据库列的实体对象的属性
javaType:完整Java类名或者别名
resultMap:引用外部resultMap
子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名

collection 元素

复杂类型集合,一对多
内部嵌套
映射一个嵌套结果集到一个列表
属性
property:映射数据库列的实体对象的属性
ofType:完整Java类名或者别名(集合所包括的类型)
resultMap:引用外部resultMap
子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名

2.2 MyBatis框架的条件查询

2.2.1 实现单一条件查询

在SQL映射的文件中添加一个新的属性,parameterType,它表示使用完全限定名或别名,支持基础数据类型和复杂数据类型。而在被映射的SQL语句中,参数的表示方法为#{参数名},MyBatis会把它转化成PreparedStatement参数并为其赋值。

除MyBatis框架内建的类型别名,还可以在配置文件中使用typeAliases元素为自定义的Java类型设置别名。

2.2.2 实现多条件查询

  1. 将查询条件封装成Java对象作为传参

  2. 将查询条件封装成Map对象作为传参

    存放成一个<String,Object>map对象,String 的值和需要的字段值需要相同,以及它该赋的值 放进value里

  3. 使用@Param注解实现多参数传参

MyBatis缓存

一级缓存
二级缓存

二级缓存的配置

MyBatis的全局cache配置
在Mapper XML文件中设置缓存,默认情况下是没有开启缓存的
在Mapper XML文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache

<cache  type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
<select id="selectAll" resultType="Emp" 
        useCache="true">

第二章 SQL映射文件详解

第二章 SQL映射文件详解

上一篇:【剑指offer】替换空格


下一篇:数据库设计(1)