【收藏】MyBatis 常用语法汇总

举报
小阿杰· 发表于 2022/01/21 21:32:17 2022/01/21
【摘要】 一、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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。