写在前面的话:大学期间学的是ssh框架,大四实习期间接手的一个项目也是用的是ssh框架。不过当时mybatis已经很流行了,然后正式工作之后就一直用的是mybatis,以前也写过mybatis,jdbc,hibernate的简单比较,在这总结记录一下mybatis环境搭建和个人日常的使用语法,方便以后查询,网上教程很多,我这属于自我总结记录不是教程。主要目的是在工作中可以更熟练的使用它去完成基本开发任务,同时还能节省时间去完成其他任务或者解决其他问题。项目环境:https://github.com/libaolei007/mybatis_demo.git
1.mybatis.cfg.xml(项目的mybatis配置文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 类型别名 用法: <resultMap id="userMap" type="org.lbl.mybatis.beans.User">加完别名后简写为<resultMap id="userMap" type="user">-->
<typeAliases>
<!-- 单个定义 alias为别名,type为具体实体类 -->
<typeAlias alias="user" type="org.lbl.mybatis.beans.User" />
<!-- 批量定义(别名为实体类下的类名,第一个字母大小写都可以 不管有多少实体类,这样直接就全部把别名命名好了,如果想自定义别名,给实体类添加@Alias注解) -->
<package name="org.lbl.mybatis.beans" />
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="cybatis">
<environment id="cybatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--mybatis.cfg.xml里注册UserMapper.xml文件-->
<mappers>
<!--告知映射文件方式1,一个一个的配置-->
<mapper resource="org/lbl/mybatis/mapper/UserMapper.xml"/>
<!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
<!--<package name="org/lbl/mybatis/mapper"/>-->
</mappers>
</configuration>
2.resultMap
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<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>
如果collection标签是使用嵌套查询,格式如下:
<collection column="传递给嵌套查询语句的字段参数" property="pojo对象中集合属性" ofType="集合属性中的pojo对象" select="嵌套的查询语句" >
</collection>
注意:使用另一个select查询封装的结果,collection标签中的column为要传递给select查询语句的参数,如果传递多个参数,格式为column= ” {参数名1=表字段1,参数名2=表字段2} ;
参考:https://www.cnblogs.com/kenhome/p/7764398.html
3.select
<select id="getUserByIds" parameterType="java.util.List" resultMap="userMap">
select * from user where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
4.insert
<!-- 动态添加 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username != null and username !=''">
username,
</if>
<if test="password != null and password !=''">
password,
</if>
<if test="account != null and account !=''">
account,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="username != null and username !=''">
#{username},
</if>
<if test="password != null and password !=''">
#{password},
</if>
<if test="account != null and account !=''">
#{account},
</if>
</trim>
</insert>
<!-- 批量添加 -->
<insert id="insertUsers" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List">
insert into user (username,password,account) values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.username},
#{item.password},
#{item.account}
)
</foreach>
</insert>
5.update
<!-- 动态更新 -->
<update id="updateUser" >
update user
<trim prefix="set" suffixOverrides=",">
<if test="username != null and username !=''">
username = #{username},
</if>
<if test="password != null and password !=''">
password = #{password},
</if>
<if test="account != null and account !=''">
account = #{account},
</if>
</trim>
WHERE id=#{id}
</update>
<!--动态更新简写-->
<update id="updateUserSet">
update user
<set>
<if test="username != null and username !=''">username = #{username},</if>
<if test="password != null and password !=''">password = #{password},</if>
<if test="account != null and account !=''">account = #{account},</if>
</set>
where id=#{id}
</update>
<!--批量更新-->
<update id="updateUsers" parameterType="java.util.List">
update user
<trim prefix="set" suffixOverrides=",">
<trim prefix="username = case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.username != null and item.username != ''">
when id = #{item.id} then #{item.username}
</if>
</foreach>
</trim>
<trim prefix="password=case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.password != null and item.password != ''">
when id = #{item.id} then #{item.username}
</if>
</foreach>
</trim>
<trim prefix="account=case" suffix="end,">
<foreach collection="list" item="item">
<if test="item.account != null and item.account != ''">
when id = #{item.id} then #{item.account}
</if>
</foreach>
</trim>
</trim>
where
<foreach collection="list" index="index" item="item" separator="or">
id = #{item.id}
</foreach>
6.delete
<!--批量删除-->
<delete id="deleteBatch" parameterType="java.util.List">
delete from user
where id in
<foreach item="id" collection="list" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
7.使用记录
choose, when, otherwise
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
<![CDATA[ ]]>符号处理特殊字符。<![CDATA[ 2 < #{id} ]]>连接函数:concat(’%’,#{userName}, ‘%’)