MyBatis 常用语法汇总

简介: MyBatis 常用语法汇总

一、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 常用语法汇总就介绍完了

目录
相关文章
|
SQL XML 前端开发
比mybatis还好的ORM,有点GraphQL语法的味道
个新的类似ORM的框架,具备了ORM框架的功能,同时也还有一点 GraphQL语法的味道,这个新的框架叫Bean Searcher
359 0
|
6月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
124 7
|
8月前
|
SQL Java 数据库连接
实时计算 Flink版产品使用合集之怎么将MyBatis-Plus集成到SQL语法中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL Java mybatis
【问题解决】MyBatis分页查询SQL Server2008时出现&#39;@P0&#39; 附近有语法错误
MyBatis分页查询SQL Server2008时出现’@P0’ 附近有语法错误” Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: ‘@P0’ 附近有语法错误。
2961 0
|
2天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
13 2
|
3月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
177 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
117 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
3月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
790 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
3月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
55 0
mybatis使用二:springboot 整合 mybatis,创建开发环境