【收藏】MyBatis 常用语法汇总
【摘要】 一、MyBatis介绍 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 二、MyBati...
一、MyBatis介绍
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、MyBatis优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
三、MyBatis缺点:
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
- 二级缓存机制不佳
四、常用语法汇总
1、resultMap和resultType
resultType 用于返回值只有一个字段的类型,resultMap 用于返回值有多个字段的类型。
<!-- resultMap -->
<resultMap id="BaseResultMap" type="cn.scpro.model.UserInfo">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="doccode" property="doccode" jdbcType="VARCHAR"/>
<result column="telno" property="telno" jdbcType="VARCHAR"/>
</resultMap>
<!-- resultType -->
<select id="getAge" resultType="java.lang.Integer">
SELECT age FROM USER WHERE id = 1
</select>
2、实体类查询条件
实体查询条件一般是指提取出公共的搜索条件,以便多次复用。
<!-- 实体类查询条件 -->
<sql id="conditionExample">
<where>
<if test="example.id != null">
AND id = #{example.id}
</if>
<if test="example.name != null">
AND name = #{example.name}
</if>
<if test="example.doccode != null">
AND doccode = #{example.doccode}
</if>
<if test="example.telno != null">
AND telno = #{example.telno}
</if>
</where>
</sql>
3、查询字段名
查询字段名,需要返回的字段信息,提取出来复用,包含基本的和指定字段。一般是使用指定字段,以提高查询效率。
<!-- 查询字段名 -->
<sql id="Base_Column_List">
id,
name,
doccode,
telno
</sql>
4、主键查询
主键查询,根据主键查询相关对象信息。
<!-- 主键查询 -->
<select id="selectByPrimaryKey" resultMap="BaseResultMap"
parameterType="java.lang.Integer">
select
<include refid="Base_Column_List"/>
from user_info
where id = #{id}
</select>
5、插入数据 返回主键
新增数据,并返回主键信息,方式一:使用useGeneratedKeys=“true” 和keyProperty=“id”。
<!-- 插入数据 返回主键-->
<insert id="insertSelective" parameterType="cn.scpro.model.UserInfo"
useGeneratedKeys="true" keyProperty="id">
insert into user_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="doccode != null">
doccode,
</if>
<if test="telno != null">
telno,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="doccode != null">
#{doccode},
</if>
<if test="telno != null">
#{telno,jdbcType=VARCHAR},
</if>
</trim>
</insert>
6、插入数据返回主键
新增数据,并返回主键信息,方式二:使用selectKey。
<!--插入数据返回主键2 -->
<insert id="insertTaskHistory" parameterType="cn.scpro.model.UserInfo" >
insert into user_info
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="userinfo.name != null" >
name,
</if>
<if test="userinfo.doccode != null" >
doccode,
</if>
<if test="userinfo.telno != null" >
telno,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="userinfo.name != null" >
#{userinfo.name,jdbcType=VARCHAR},
</if>
<if test="userinfo.doccode != null" >
#{userinfo.doccode,jdbcType=VARCHAR},
</if>
<if test="userinfo.telno != null" >
#{userinfo.telno,jdbcType=VARCHAR},
</if>
</trim>
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="userinfo.id">
SELECT id FROM user_info ORDER BY id DESC LIMIT 0,1
</selectKey>
</insert>
7、更新数据
根据对象更新数据信息
<!-- 更新数据 -->
<update id="updateByPrimaryKeySelective" parameterType="cn.scpro.model.UserInfo">
update user_info
<set>
<if test="name != null">
name = #{userinfo.name,jdbcType=VARCHAR},
</if>
<if test="doccode != null">
doccode = #{userinfo.doccode},
</if>
<if test="telno != null">
telno = #{userinfo.telno,jdbcType=VARCHAR},
</if>
</set>
where id = #{userinfo.id}
</update>
8、批量新增数据
批量插入数据,以List为例。
<!-- 插入list -->
<insert id="insertNotifylist" parameterType="java.util.List" useGeneratedKeys="true">
insert into user_info
values
<foreach collection="userlist" item="item" index="index" separator=",">
(#{item.name,jdbcType=VARCHAR},#{item.doccode,jdbcType=VARCHAR},
#{item.telno,jdbcType=VARCHAR})
</foreach>
</insert>
9、批量更新数据
批量更新数据,以List为例。
<!-- 更新list-->
<update id="UpdateById">
update user_info set name= null
where id in
<foreach collection="list" item="id" separator="," open="("
close=")">
#{id}
</foreach>
</update>
10、批量删除数据
批量删除数据,以List为例。
<!-- 删除list -->
<delete id="DeleteById" parameterType="java.util.List">
delete from user_info where id in
<foreach collection="list" item="id" separator="," open="("
close=")">
#{id}
</foreach>
</delete>
11、查多个对象
继承map,可查多项个实体
<!-- 继承map,可查多项个实体 -->
<resultMap id="BaseResultMapForMore" type="com.test.model.User"
extends="BaseResultMap">
<collection property="score"
ofType="com.test.model.Score" column="userid"
javaType="com.test.model.Score"
select="com.test.mapper.ScoreMapper.findByuserid">
</collection>
<collection property="teacherlist"
ofType="com.test.model.Teacher" column="teacherid"
javaType="com.test.model.Teacher"
select="com.test.model.TeacherMapper.findById">
</collection>
<!--<collection property="homeinfo"-->
<!--ofType="com.test.model.Home" column="homeid"-->
<!--javaType="com.test.model.Home"-->
<!--select="com.test.mapper.HomeMapper.findById">-->
<!--</collection>-->
</resultMap>
结语
好了,以上就是MyBatis 常用语法汇总 ,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】,欢迎关注阅读交流。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)