mybatis SQL 语句构建器与mybatis generator (代码生成器)简单基本使用

SQL 语句构建器

MyBatis 在 XML 映射中具备强大的 SQL 动态生成能力及动态sql,但有时,我们还是需要在 Java 代码里构建 SQL 语句就需要SQL 语句构建器

SQL 语句构建器解决了在java代码中拼接sql的复杂性。例如像:

String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "
"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +
"FROM PERSON P, ACCOUNT A " +
"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +
"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +
"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +
"OR (P.LAST_NAME like ?) " +
"GROUP BY P.ID " +
"HAVING (P.LAST_NAME like ?) " +
"OR (P.FIRST_NAME like ?) " +
"ORDER BY P.ID, P.FULL_NAME";

MyBatis 3 提供了方便的工具类来帮助解决此问题。借助 SQL 类,我们只需要简单地创建一个实例,并调用它的方法即可生成 SQL 语句。

private String selectPersonSql() {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
  }}.toString();
}

不用担心可能会重复出现的 “AND” 关键字,或者要做出用 “WHERE” 拼接还是 “AND” 拼接还是不用拼接的选择。SQL 类已经为你处理了哪里应该插入 “WHERE”、哪里应该使用 “AND” 的问题,并帮你完成所有的字符串拼接工作。

import org.apache.ibatis.jdbc.SQL;

public class MysqlMaker {
    public String selectPersonSql() {
        return new SQL() {{
            SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
            SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
            FROM("PERSON P");
            FROM("ACCOUNT A");
            INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
            INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
            WHERE("P.ID = A.ID");
            WHERE("P.FIRST_NAME like ?");
            OR();
            WHERE("P.LAST_NAME like ?");
            GROUP_BY("P.ID");
            HAVING("P.LAST_NAME like ?");
            OR();
            HAVING("P.FIRST_NAME like ?");
            ORDER_BY("P.ID");
            ORDER_BY("P.FULL_NAME");
        }}.toString();
    }
}

mybatis SQL 语句构建器与mybatis generator (代码生成器)简单基本使用_第1张图片

语句 描述
SELECT(String) 开始新的或追加到已有的 SELECT子句。可以被多次调用,参数会被追加到 SELECT 子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意参数。
SELECT_DISTINCT(String) 开始新的或追加到已有的 SELECT子句,并添加 DISTINCT 关键字到生成的查询中。可以被多次调用,参数会被追加到 SELECT 子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意参数。
FROM(String) 开始新的或追加到已有的 FROM子句。可以被多次调用,参数会被追加到 FROM子句。 参数通常是一个表名或别名,也可以是数据库驱动程序接受的任意参数。
JOIN(String)、INNER_JOIN(String)、LEFT_OUTER_JOIN(String)、RIGHT_OUTER_JOIN(String) 基于调用的方法,添加新的合适类型的 JOIN 子句。 参数可以包含一个由列和连接条件构成的标准连接。
WHERE(String) 插入新的 WHERE 子句条件,并使用 AND 拼接。可以被多次调用,对于每一次调用产生的新条件,会使用 AND 拼接起来。要使用 OR 分隔,请使用 OR()。
OR() 使用 OR 来分隔当前的 WHERE 子句条件。 可以被多次调用,但在一行中多次调用会生成错误的 SQL。
AND() 使用 AND 来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用会生成错误的 SQL。由于 WHERE 和 HAVING都会自动使用 AND 拼接, 因此这个方法并不常用,只是为了完整性才被定义出来。
GROUP_BY(String) 追加新的 GROUP BY 子句,使用逗号拼接。可以被多次调用,每次调用都会使用逗号将新的条件拼接起来。
HAVING(String) 追加新的 HAVING 子句。使用 AND 拼接。可以被多次调用,每次调用都使用AND来拼接新的条件。要使用 OR 分隔,请使用 OR()。
ORDER_BY(String) 追加新的 ORDER BY 子句,使用逗号拼接。可以多次被调用,每次调用会使用逗号拼接新的条件。
LIMIT(String)、LIMIT(int) 追加新的 LIMIT 子句。 仅在 SELECT()、UPDATE()、DELETE() 时有效。 当在 SELECT() 中使用时,应该配合 OFFSET() 使用。
OFFSET(String)、OFFSET(long) 追加新的 OFFSET 子句。 仅在 SELECT() 时有效。 当在 SELECT() 时使用时,应该配合 LIMIT() 使用。
OFFSET_ROWS(String)、OFFSET_ROWS(long) 追加新的 OFFSET n ROWS 子句。 仅在 SELECT() 时有效。 该方法应该配合 FETCH_FIRST_ROWS_ONLY() 使用。
FETCH_FIRST_ROWS_ONLY(String)、FETCH_FIRST_ROWS_ONLY(int) 追加新的 FETCH FIRST n ROWS ONLY 子句。 仅在 SELECT() 时有效。 该方法应该配合 OFFSET_ROWS() 使用。
DELETE_FROM(String) 开始新的 delete 语句,并指定删除表的表名。通常它后面都会跟着一个 WHERE 子句
INSERT_INTO(String) 开始新的 insert 语句,并指定插入数据表的表名。后面应该会跟着一个或多个 VALUES() 调用,或 INTO_COLUMNS() 和 INTO_VALUES() 调用。
SET(String) 对 update 语句追加 “set” 属性的列表
UPDATE(String) 开始新的 update 语句,并指定更新表的表名。后面都会跟着一个或多个 SET() 调用,通常也会有一个 WHERE() 调用。
VALUES(String, String) 追加数据值到 insert 语句中。第一个参数是数据插入的列名,第二个参数则是数据值。
INTO_COLUMNS(String…) 追加插入列子句到 insert 语句中。应与 INTO_VALUES() 一同使用。
INTO_VALUES(String…) 追加插入值子句到 insert 语句中。应与 INTO_COLUMNS() 一同使用。
ADD_ROW() 添加新的一行数据,以便执行批量插入。

mybatis中文网

MyBatis generator

myabtis开发需要配置大量的XML,但是配置XML文件也是一件相当繁琐的一个过程,而且会出现很多不容易定位的错误。当在工作中需要生成大量对象的时候,有太多的重复劳动,简直是生无可恋。所以,官方开发了 MyBatis Generator。它只需要很少量的简单配置,就可以完成大量的表到Java对象的生成工作,拥有零出错和速度快的优点,让开发人员解放出来更专注于业务逻辑的开发。

MyBatis Generator,简称MBG,可以生成三种文件:

(1)Model实体文件,一个数据库表对应生成一个 Model 实体;
(2)Mapper接口文件,数据数操作方法都在此接口中定义;
(3)Mapper XML配置文件

需要下载MyBatis Generator之后,配置generatorConfig.xml文件,然后通过命令行就可以运行MyBatis Generator构建代码。Maven项目需要导入依赖。

mybatis-generator的运行过程:首先连接数据库———>从数据库的表获取字段————>依据字段生成mapper,dao,domain文件。

mybatis-generator默认将数据的下划线转化为java的驼峰规则并生成实体类。其他相关配置通过gernerator设置。

  1. 导入插件依赖
<plugin>
        <groupId>org.mybatis.generatorgroupId>
        <artifactId>mybatis-generator-maven-pluginartifactId>
        <version>1.3.7version>
plugin>
  1. 配置generatorConfig.xml文件

DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <classPathEntry location="D:\Java\apache-maven-3.6.3-bin\repository\mysql\mysql-connector-java\8.0.29\mysql-connector-java-8.0.29.jar"/>

    
    <context id="testTables" targetRuntime="MyBatis3">
        
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            
            <property name="suppressAllComments" value="true"/>
        commentGenerator>

        
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/smbms?characterEncoding=utf8"
                        userId="root"
                        password="Xwh190823">
        jdbcConnection>

        
        <javaTypeResolver>
            
            <property name="forceBigDecimals" value="false"/>
        javaTypeResolver>

        
        <javaModelGenerator targetPackage="com.example.generator1.pojo" targetProject="src/main/java">
            
            <property name="enableSubPackages" value="true"/>
            
            <property name="trimStrings" value="true"/>
        javaModelGenerator>

        
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            
            <property name="enableSubPackages" value="false"/>
        sqlMapGenerator>

        
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.generator1.dao"
                             targetProject="src/main/java">
            
            <property name="enableSubPackages" value="false"/>
        javaClientGenerator>


        
        
        <table tableName="smbms_user" domainObjectName="User"
               enableSelectByExample="false"
               selectByExampleQueryId="false"
               enableDeleteByExample="false"
               enableUpdateByExample="false"
               enableCountByExample="false">
            
            <property name="useActualColumnNames" value="false"/>
        table>
    context>
generatorConfiguration>

  1. 运行插件构建项目

mybatis SQL 语句构建器与mybatis generator (代码生成器)简单基本使用_第2张图片

  1. 构建成功

mybatis SQL 语句构建器与mybatis generator (代码生成器)简单基本使用_第3张图片

  1. 测试代码

测试需要SqlSession对象需要再创建mybatis-config.xml配置文件:


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/smbms?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>
    environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    mappers>
configuration>

测试代码:

public class Test1 {
    @Test
    public void method1() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectByPrimaryKey(3L);
        System.out.println(user);
    }
}

mybatis SQL 语句构建器与mybatis generator (代码生成器)简单基本使用_第4张图片

查询的结果不一定是想要的自己添加sql语句即可,mybatis-generator帮助我们省略了大多数重复繁琐的步骤。

更多generatorConfig.xml配置参考:


DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

 
 
  

<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
 
    
    <property name="autoDelimitKeywords" value="false"/>
    
    <property name="javaFileEncoding" value="UTF-8"/>
    
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
    
    
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
    
    
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///pss" userId="root" password="admin">
        
    jdbcConnection>
    
    
    <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
        
        <property name="forceBigDecimals" value="false"/>
    javaTypeResolver>
    
    
    
    <javaModelGenerator targetPackage="com._520it.mybatis.domain" targetProject="src/main/java">
        
        <property name="constructorBased" value="false"/>
        
        
        <property name="enableSubPackages" value="true"/>
        
        
        <property name="immutable" value="false"/>
        
        
        <property name="rootClass" value="com._520it.mybatis.domain.BaseDomain"/>
        
        
        <property name="trimStrings" value="true"/>
    javaModelGenerator>
    
    
    
    <sqlMapGenerator targetPackage="com._520it.mybatis.mapper" targetProject="src/main/resources">
        
        <property name="enableSubPackages" value="true"/>
    sqlMapGenerator>
    
    
    
    <javaClientGenerator targetPackage="com._520it.mybatis.mapper" type="ANNOTATEDMAPPER" targetProject="src/main/java">
        
        <property name="enableSubPackages" value="true"/>
        
        
    javaClientGenerator>
    
    
    <table tableName="userinfo" >
        
        
        <property name="constructorBased" value="false"/>
        
        
        <property name="ignoreQualifiersAtRuntime" value="false"/>
        
        
        <property name="immutable" value="false"/>
        
        
        <property name="modelOnly" value="false"/>
        
        
         
        
        
        
        
        
        
        
        
        
        <property name="selectAllOrderByClause" value="age desc,username asc"/>
        
        
        <property name="useActualColumnNames" value="false"/>
        
        
        
        
        
         
         
         
         <columnOverride column="username">
            
            <property name="property" value="userName"/>
            
            
             
            
             
            
            
            
         columnOverride>
         
         
    table>
    
context>
 
generatorConfiguration>

参考1
参考2感谢作者。

你可能感兴趣的:(#,MyBatis)