目录
Mybatis中文网🧁
Mybatis中文网https://mybatis.net.cn/
Mybatis概述🍭
Mybatis框架是一个持久化层的、半自动化的ORM
- 持久化:程序数据在瞬时状态和持久状态转换的过程
- ORM :对象关系映射(Object-Relational Mapper)
配置文档的顶层结构:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事物管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseldProvider(数据库厂商标识)
- mapper(映射器)
属性(properties)
<!--引入包含数据库连接参数的database.properties文件-->
<properties resource="database.properties"/>
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
设置名 | 描述 | 有效值 | 默认值 | |
---|---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 |
| true | |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL | |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
<settings>
<!--使用Log4j作为MyBatis框架的日志实现-->
<setting name="logImpl" value="LOG4J"/>
<!--开启自动映射-->
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<settings>
<!--使用Log4j作为MyBatis框架的日志实现-->
<setting name="logImpl" value="LOG4J"/>
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
环境配置(environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
注:不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
<environments default="development">
<environment id="development">
<!--配置事务管理器,采用JDBC事物,由应用自行管理事物-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,POOLED:MyBatis提供的数据源,JNDI:JNDI数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
映射器(mappers)
MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
<mappers>
<mapper resource="mapper/SysUserMapper.xml"/>
</mappers>
Mybatis的核心对象🧁
SqlSessionFactory
作用域:全局 生命周期:与应用的生命周期相同
SqlSessionFactoryBuilder
作用域:方法块 生命周期:方法执行完
SqlSession
作用域:一次会话 生命周期:一次会话
SQL映射文件🧁
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
SQL 映射文件的顶级元素:
- cache – 该命名空间的缓存配置。
- cache-ref – 引用其它命名空间的缓存配置。
- resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
- sql – 可被其它语句引用的可重用语句块。
- insert – 映射插入语句。
- update – 映射更新语句。
- delete – 映射删除语句。
- select – 映射查询语句。
resultMap (结果映射)
用于将查询结果映射到Java对象或者其他数据结构中。(一般用于多张表)
resultMap元素的属性
- id:resultMap的唯一标识
- type:映射的结果类型
resultMap元素的子元素
- id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能
- result:指定结果集字段和实体类属性的映射关系
- association:映射“多对一”或“一对一”关系
- collection:映射“一对多”关系
<resultMap id="userSysRole" type="SysUser">
<!--主键的映射关系 column:列名(数据库列名) property:属性名(与实体类类名一致)-->
<id property="id" column="id"></id>
<result property="realName" column="realName"></result>
<association property="sysRole" javaType="SysRole">
<id property="id" column="rid"></id>
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
<select id="getUserListByRoleId" parameterType="java.lang.Integer" resultMap="userSysRole">
select u.*,r.id as rid,r.roleName from t_sysuser u,t_sysrole r
where u.roleId=#{roleId} and u.roleId = r.id
</select>
参数
1、注解@Param
使用 @param注解 为参数命名 (Mapper接口)
/**
* 根据ID查询用户信息
* @param id
* @return
*/
User searchById(@Param("id") Integer id);
Mapper.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="mapper.SysUserDemoMapper">
<sql id="baseColumn">
u.id,u.account,u.realName,u.roleId,r.roleName,u.sex,(YEAR(NOW())-YEAR(u.birthday)) age,u.phone
</sql>
<select id="searchById" resultType="User">
select
<include refid="baseColumn"></include>
from t_sysuser u,t_sysrole r
where u.roleId=r.id
and u.id=#{id}
</select>
</mapper>
注:如果入参的列名,在实体类里面没有就需要自己指定(必须要跟@Param和#{属性}一样)
2、对象(实体类)
<insert id="addUser" parameterType="User">
INSERT INTO `t_sysuser`
(`account`, `realName`, `sex`, `birthday`, `phone`, `roleId`)
VALUES (#{account}, #{realName}, #{sex}, #{birthday},#{phone}, #{roleId});
</insert>
3、Map
<select id="searchByIdMap" resultType="User" parameterType="java.util.Map">
select
<include refid="baseColumn"></include>
from t_sysuser u,t_sysrole r
where u.roleId=r.id
and u.id=#{id}
</select>
注:key值必须要和#{属性}相同
4、List
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (id, name, age) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.id}, #{user.name}, #{user.age})
</foreach>
</insert>
动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
常用标签
- if
- where
- choose
- foreach
- set
- trim
if标签
if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。if可以和很多的标签一起使用!
<select id="selectByIdAndRealName" resultType="SysUser">
SELECT * FROM t_sysuser
<if test="id != null"> /*如果传入进来的id不等于空*/
where id=#{id}
</if>
<if test="realName != null">
and realName like concat('%',#{realName},'%')
</if>
</select>
where标签
以上面的示例为例。当我们不传入id (id为空),realName给张。那么,这时的sql语句就有问题少了where,所以,接下来就需要用到我们的where标签。
<select id="selectByIdAndRealName" resultType="SysUser">
SELECT * FROM t_sysuser
<where>
<if test="id != null"> /*如果传入进来的id不等于空*/
id=#{id}
</if>
<if test="realName != null">
and realName like concat('%',#{realName},'%')
</if>
</where>
</select>
注:where标签会自动帮我们加上where,智能处理and、or等关键字 (第一个if的and不能加上)
foreach标签
oreach 标签主要用于构建 in 条件,只要看见in就要马上想到foreach。可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。
collection:参数名称
item:元素别名
open:起始位置的拼接字符
separator:元素之间的连接符
close:末尾位置的拼接字符
index:当前元素位置下标(一般用不上)
<select id="selectByAddress" resultType="SysUser">
SELECT * FROM t_sysuser
where address in
<foreach collection="addressList" item="address" open="(" separator="," close=")">
#{address}
</foreach>
</select>
set标签
更新用户表数据时,除重新赋值的属性外,其他属性的值都更新为null,简化SQL语句中set子句处理,智能忽略更新语句尾部多出来的逗号。
<update id="updateById" parameterType="SysUser">
update t_sysuser
<set>
<if test="account !=null">
account=#{account},
</if>
<if test="realName !=null">
realName=#{realName},
</if>
<if test="sex !=null">
sex=#{sex}
</if>
</set>
where id=#{id}
</update>
trim标签
添加前后缀,智能忽略标签前后多余的and、or或逗号等字符
prefix:添加前缀
suffix:添加后缀
prefixOverrides:忽略前缀
suffixOverrides:忽略后缀
<update id="updateById" parameterType="SysUser">
update t_sysuser
<trim prefix="set" suffix="where id=#{id}" suffixOverrides=",">
<if test="account !=null">
account=#{account},
</if>
<if test="realName !=null">
realName=#{realName},
</if>
<if test="sex !=null">
sex=#{sex}
</if>
</trim>
</update>