Mybatis筆記(三):逆向工程

[toc]

概述

  1. 官網(wǎng)提供的mapper自動生成工具mybatis-generator-core-1.3.6.jar
  2. 可以生成 po類,mapper映射文件,mapper接口
  3. 支持單表查詢(簡單查詢,條件查詢,1.3.6提供動態(tài)sql)
  4. 官網(wǎng)MyBatis Generator使用文檔:http://www.mybatis.org/generator/index.html

mybatis-generator逆向工程

如何搭建

  • jar包

    • log4j
    • mybatis核心
    • mybatis-generator-core-1.3.6.jar
    • 數(shù)據(jù)庫連接jar
  • generatorConfig.xml

    <?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">
    
    <generatorConfiguration>
    
        <context id="testTables" targetRuntime="MyBatis3">
    
            <commentGenerator>
                <!-- 是否 去除自動生成的注釋 true:是 : false:否 -->
                <property name="suppressAllComments" value="true" />
            </commentGenerator>
    
            <!--數(shù)據(jù)庫連接 信息-->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://10.211.55.6:3306/mybatis?characterEncoding=utf-8"
                            userId="machine"
                            password="4869">
            </jdbcConnection>
    
            <!-- 如使用oracle參考如下 -->
            <!--
            <jdbcConnection
                driverClass="oracle.jdbc.driver.OracleDriver"
                connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
                userId="scott"
                password="wcy675600920">
            </jdbcConnection> -->
    
            <!--
                false(默認): 把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,
                true: 把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal
            -->
            <javaTypeResolver >
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!--targetProject: 生成 PO類 的位置-->
            <!--
                mac下路徑是./src
                windows 路徑是.\src
            -->
            <javaModelGenerator targetPackage="com.machine.pro.pojo" targetProject="./src">
                <!-- enableSubPackages:是否讓schema作為包的后綴 -->
                <property name="enableSubPackages" value="false" />
                <!-- 從數(shù)據(jù)庫返回的值 被清理前后的空格 -->
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
    
            <!-- targetProject: 生成 mapper映射文件 的位置 -->
            <sqlMapGenerator targetPackage="com.machine.pro.mapper"  targetProject="./src">
                <!-- enableSubPackages:是否讓schema作為包的后綴 -->
                <property name="enableSubPackages" value="false" />
            </sqlMapGenerator>
    
            <!-- targetPackage:mapper接口生成的位置 -->
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.machine.pro.mapper"  targetProject="./src">
                <!-- enableSubPackages:是否讓schema作為包的后綴 -->
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator>
    
    
            <!--指定要生成的 數(shù)據(jù)庫表-->
            <table tableName="user" />
            <table tableName="orders" />
    
            <!--table更多細節(jié)-->
            <!--
            <table tableName="" domainObjectName="">
               <columnOverride column="" javaType="" />
            </table>
            -->
        </context>
    </generatorConfiguration>
    
    
  • GeneratorSqlMap.java

    public class GeneratorSqlMap {
    
        public void generator() throws Exception{
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            //指定逆向工程配置文件
            File configFile = new File("config/generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configFile);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        }
    
        public static void main(String[] args) {
    
    
            try {
                GeneratorSqlMap generator = new GeneratorSqlMap();
                generator.generator();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
  • 運行main可生成相應代碼

附錄:我的代碼地址

https://github.com/Machine4869/MyCode/tree/master/Mybatis逆向工程/

一些映射 生成規(guī)則

  • 如表的creat_time字段 會映射成 pojo的craeteTime屬性(去下劃線大寫)
  • user表 會映射成 User類
  • tb_user表會映射成 TbUser類

Mapper接口測試與使用

(法一)采用Example進行條件查詢

配置:targetRuntime="MyBatis3"

<context id="testTables" targetRuntime="MyBatis3">

常用接口

//按id 查詢
UserselectByPrimaryKey(String id);
//按id 刪除
int deleteByPrimaryKey(String id);
//按id 更新:對象中所有字段
int updateByPrimaryKey(User record);
//按id 更新:對象中非空字段
int updateByPrimaryKeySelective(User record);

//插入對象 所有字段
//  :insert into user(id,username,sex....) values..
int insert(User record);
//插入對象 非空字段
//  :insert into user(username) values..
int insertSelective(User record);

//按條件 刪除
int deleteByExample(UserExample example);

//按條件 查詢 結果集
List<User> selectByExample(UserExample example);

條件查詢:

@Test
public void test3(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //查詢所有
    /*
    UserExample userExample = null;
    List<User> userList = userMapper.selectByExample(userExample);
    */

    //單條件查詢
    /*
    UserExample userExample = new UserExample();
    UserExample.Criteria criteria = userExample.createCriteria();
    criteria.andUsernameLike("%m%");
    List<User> userList = userMapper.selectByExample(userExample);
    */

    //多條件查詢and
    /*
    UserExample userExample = new UserExample();
    UserExample.Criteria criteria = userExample.createCriteria();
    criteria.andUsernameLike("%m%");
    criteria.andSexEqualTo("女");
    List<User> userList = userMapper.selectByExample(userExample);
    */

    //多條件查詢or
    /*
    UserExample userExample = new UserExample();

    UserExample.Criteria criteria1 = userExample.createCriteria();
    criteria1.andUsernameLike("%m%");

    UserExample.Criteria criteria2 = userExample.createCriteria();
    criteria2.andSexEqualTo("女");

    userExample.or(criteria1);
    userExample.or(criteria2);

    List<User> userList = userMapper.selectByExample(userExample);
    */

    //排序
    /*
    UserExample userExample = new UserExample();

    UserExample.Criteria criteria = userExample.createCriteria();
    criteria.andUsernameLike("%m%");

    //userExample.setOrderByClause("id asc");//asc:正序排 desc:逆序排
    //userExample.setOrderByClause("id desc");
    userExample.setOrderByClause("sex asc,username asc");

    List<User> userList = userMapper.selectByExample(userExample);
    */

    //統(tǒng)計
    /*
    UserExample userExample = new UserExample();
    UserExample.Criteria criteria = userExample.createCriteria();

    criteria.andUsernameLike("%m%");
    criteria.andIdBetween(1,5);//包括1和5

    long count = userMapper.countByExample(userExample);
    */
    
}

(法二)MyBatis Dynamic SQL(用where子句進行條件查詢)

  1. 概述:

    • generator 使用為MyBatis3DynamicSQL生成代碼,這些類依賴于MyBatis Dynamic SQL
    • MyBatis Dynamic SQL 是生成動態(tài) SQL 語句的框架,可以配合為MyBatis Generator使用
    • MyBatis Dynamic SQL 使用WHERE子句(可以用任意組合的and和or來創(chuàng)建)進行條件查詢
    • MyBatis Dynamic SQL lib下載地址
  2. 準備工作

使用:

前提:import靜態(tài)支持類

import static com.machine.pro.mapper.UserDynamicSqlSupport.*;  // import 自動生成的 "support" 類
import static org.mybatis.dynamic.sql.SqlBuilder.*;  // import MyBatis Dynamic SQL where support

使用案例:

@Test
public void test2(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    /**
     * MyBatis Dynamic SQL
     * build():所有構建器都通過調(diào)用build()方法完成
     * execute():調(diào)用execute方法執(zhí)行語句
     */
    //按主鍵查詢 仍然可用
    /*
    User user = userMapper.selectByPrimaryKey(3);
    */

    //查詢所有(不用where子句)
    /*
    List<User> userList = userMapper.selectByExample()
            .build().execute();
    */

    //單條件查詢
    /*
    List<User> userList = userMapper.selectByExample()
            .where(sex, isEqualTo("女"))
            .build().execute();
            //如sex屬性就來自import static 的支持類
    */

    //多條件查詢and
    /*
    List<User> userList = userMapper.selectByExample()
            .where(sex, isEqualTo("女"))
            .and(username, isLike("%m%"))
            .build().execute();
    */

    //多條件查詢or
    /*
    List<User> userList = userMapper.selectByExample()
            .where(sex, isEqualTo("女"))
            .or(username, isLike("%m%"))
            .build().execute();
    */

    //排序:正序
    /*
    List<User> userList = userMapper.selectByExample()
            .where(username, isLike("%m%"))
            .orderBy(id)
            .build().execute();
    */

    //排序:逆序
    /*
    List<User> userList = userMapper.selectByExample()
            .where(username, isLike("%m%"))
            .orderBy(id.descending())
            .build().execute();
    */

    //排序:多字段
    /*
    List<User> userList = userMapper.selectByExample()
            .where(username, isLike("%m%"))
            .orderBy(sex.descending(),username)
            .build().execute();
    */

    //統(tǒng)計
    /*
    Long count = userMapper.countByExample()
            .build().execute();
    */
}

注意事項

Mapper文件內(nèi)容不覆蓋而是追加

  • XXXMapper.xml文件已經(jīng)存在時,如果進行重新生成則mapper.xml文件內(nèi)容不被覆蓋而是進行內(nèi)容追加,結果導致mybatis解析失敗。
  • 解決方法:刪除原來已經(jīng)生成的mapper xml文件再進行生成。

針對oracle數(shù)據(jù)庫的 Table schema問題

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • MyBatis Generator (MBG) 是由一個XML配置文件驅(qū)動的。這個配置文件中會聲明以下內(nèi)容: 如何...
    JSON_NULL閱讀 19,139評論 3 10
  • 今天培訓課堂上老師給我們分享了一個支教的小故事,我這人一向淚點就低,沒有看到場景光聽老師描述就感動的出眼淚了,而...
    云沐媽媽閱讀 392評論 0 1
  • 我是一個喜歡說話的人。并非天性喜歡說話,而是在年少時,因為種種原因,沒能和同齡人說夠話。確切地說,自五年級起,到中...
    郭國酬閱讀 3,907評論 1 3
  • 電腦里放著綠色花園,輕音樂,我曾經(jīng)在電臺做節(jié)目時候的背景音樂。電腦旁邊是十月文藝出版的安妮寶貝十年文集,...
    水墨清歡閱讀 309評論 2 1
  • 將來有一天后,肯定會變成一個合格的社會人吧;但從那一天起,肯定不會再踏入學校半步。
    古道塵絕閱讀 280評論 3 2

友情鏈接更多精彩內(nèi)容