Mybatis如何自动生成sql语句

 更新时间:2021年12月14日 17:16:07   作者:GeBiao285869350  
这篇文章主要介绍了Mybatis如何自动生成sql语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis自动生成sql语句

创建maven项目,将该配置文件运行即可生成 sql 语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- MyBatis 自动生成sql代码  -->
<generatorConfiguration>
    <!-- 导入jar包(路径) -->
    <classPathEntry location="E:\CourseWare\MYSQL\mysql-connector-java-5.1.26-bin.jar" />
    <!-- 设置生成代码的规则 targetRuntime 开发环境使用Mybatis3的版本 -->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
        <commentGenerator>
            <!-- 这个元素用来去除指定生成的注释中是否包含生成的日期 false:表示保护 -->
            <!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true -->
            <property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="false" />
        </commentGenerator>
        <!-- 连接数据库的四要素 -->
        <jdbcConnection 
            driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/user" 
            userId="root"
            password="root">
        </jdbcConnection>
        <!-- 该属性用于指定MyBatis生成器是否应该强制使用java.math。小数点和数字域的BigDecimal -->   
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 定义实体类 bean -->
        <javaModelGenerator targetPackage="en.et.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 接口映射的注解 或者xml文件路径 -->
        <sqlMapGenerator targetPackage="cn.et.resource" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成的接口所在的位置 type="xml 或者 注解" -->
        <javaClientGenerator type="ANNOTATEDMAPPER"
            targetPackage="en.et.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 告诉mbg 需要生成代码的数据库的表 -->
        <table tableName="emp"></table>
    </context>
</generatorConfiguration>

Mybatis的动态sql语句

Mybatis的动态sql语句主要解决的问题是不同条件sql语句的拼接。

例如:根据用户信息,查询用户列表,当不知道根据的是用户的什么信息时,写出查询的SQL语句是有一定困难的,而动态SQL语句主要解决的就是此类问题。

if标签的使用

在持久层接口定义方法

    /**
     * 根据用户信息,查询用户列表
     * @param user
     * @return
     */
    List<User> findByUser(User user);

编写持久层接口对应的映射文件

 <!-- 根据用户信息,查询用户列表 -->
    <select id="findByUser" resultType="User" parameterType="User">
        select *from user where 1 = 1
        <if test="id != 0">
            and id = #{id}
        </if>
        <if test="username != null and username != '' ">
            and username like #{username}
        </if>
        <if test="birthday != null">
            and birthday = #{birthday}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
        <if test="address != null">
            and address = #{address}
        </if>
    </select>

编写测试方法

  /**
     * 根据用户信息,查询用户列表
     */
    @Test
    public void testFindByUser()
    {
        User user = new User();
        user.setUsername("%王%");
        List<User> users = userDao.findByUser(user);
        for (User u : users)
        {
            System.out.println(u);
        }
    }

where标签的使用

为了简化上面 where 1=1 的条件拼接,我们可以采用标签来简化开发,因此修改持久层映射文件

 <!-- 根据用户信息,查询用户列表 -->
    <select id="findByUser" resultType="User" parameterType="User">
        select *from user
        <where>
            <if test="id != 0">
                and id = #{id}
            </if>
            <if test="username != null and username != '' ">
                and username like #{username}
            </if>
            <if test="birthday != null">
                and birthday = #{birthday}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
            <if test="address != null">
                and address = #{address}
            </if>
        </where>
    </select>

foreach标签的使用

froeach是对一个集合进行遍历,通常在构建in条件语句的时候应用

例如:根据一个用户id集合查询用户。

对id集合进行封装,加入到List集合

在这里插入图片描述

编写持久层接口方法

  /**
     * 根据id集合查询用户
     * @param queryUR
     * @return
     */
    List<User> findInIds(QueryUR queryUR);

编写持久层接口映射文件

  <!--根据id集合查询用户 -->
    <select id="findInIds" resultType="user" parameterType="int">
       select *from user
       <where>
           <if test="ids != null and ids.size() > 0">
                <!-- foreach:用于遍历集合
                    collection:代表要遍历的集合
                    open:代表语句的开始部分
                    close:代表语句的结束部分
                    item:代表需要遍历的集合的每个元素
                    sperator:代表分隔符
                 -->
               <foreach collection="ids" open="id in (" close=")" item="uid" separator=",">
                    #{uid}
               </foreach>
           </if>
       </where>
    </select>

编写测试方法

  /**
     * 根据id集合查询用户
     */
    @Test
    public void testFindInIds()
    {
        QueryUR queryUR = new QueryUR();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(41);
        ids.add(43);
        ids.add(45);
        queryUR.setIds(ids);
        List<User> users = userDao.findInIds(queryUR);
        for (User user : users)
        {
            System.out.println(user);
        }
    }

sql语句的简化编写

在映射文件中,可以将重复的sql语句通过sql标签提取出来,使用include标签引用即可,已达到sql重用的效果。如下所示:

    <!--抽取重复的语句代码片段-->
    <sql id="querySql">
        select *from user
    </sql>
    <select id="findAll" resultType="USER" >
        <include refid="querySql"></include>
    </select>
    <!--根据id查询用户-->
    <select id="findById" resultType="User" parameterType="int">
        <include refid="querySql"></include> where id= #{userID};
    </select>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Data MongoDB中实现自定义级联的方法详解

    Spring Data MongoDB中实现自定义级联的方法详解

    这篇文章主要给大家介绍了关于Spring Data MongoDB中实现自定义级联的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • JAVA算法起步之堆排序实例

    JAVA算法起步之堆排序实例

    这篇文章主要介绍了JAVA算法起步之堆排序实例,需要的朋友可以参考下
    2014-02-02
  • spring cloud 的监控turbine-rabbitmq的示例

    spring cloud 的监控turbine-rabbitmq的示例

    这篇文章主要介绍了spring cloud 的监控turbine-rabbitmq的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java 17新特性详细讲解与代码实例

    Java 17新特性详细讲解与代码实例

    这篇文章主要给大家介绍了关于Java 17新特性详细讲解与代码实例的相关资料,Java 17是2021年9月发布的最新版本,其中包含了很多新特性和改进,这些新特性和改进将进一步提高 Java 语言的性能和可用性,需要的朋友可以参考下
    2023-09-09
  • java如何从不规则的字符串中截取出日期

    java如何从不规则的字符串中截取出日期

    这篇文章主要介绍了java从不规则的字符串中截取出日期的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Mybatis实现动态增删改查功能的示例代码

    Mybatis实现动态增删改查功能的示例代码

    这篇文章主要介绍了Mybatis实现动态增删改查功能的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Presto支持Elasticsearch数据源配置详解

    Presto支持Elasticsearch数据源配置详解

    这篇文章主要为大家介绍了Presto支持Elasticsearch数据源配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringMVC中的http Caching的具体使用

    SpringMVC中的http Caching的具体使用

    本文主要介绍了SpringMVC中的http Caching的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 排查Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl

    排查Failed to validate connection com.mysql.cj.jdbc.Connec

    这篇文章主要介绍了Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl问题排查,具有很好的参考价值,希望对大家有所帮助
    2023-02-02
  • java中String StringBuffer和StringBuilder的区别详解

    java中String StringBuffer和StringBuilder的区别详解

    大家好,本篇文章主要讲的是java中String StringBuffer和StringBuilder的区别详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论