1.什么是逆向工程?
mybaits需要程序員自己編寫sql語句,mybatis官方提供逆向工程 可以針對單表自動生成mybatis執行所需要的代碼:(mapper.java,mapper.xml、po..) 建議:企業實際開發中,常用的逆向工程方式,由于數據庫的表生成java代碼。
2.使用方法
根據官網介紹有一下幾種使用方法: Running MyBatis Generator
MyBatis Generator (MBG) can be run in the following ways: From the command PRompt with an XML configuration
As an Ant task with an XML configurationAs a Maven PluginFrom another Java program with an XML configurationFrom another Java program with a Java based configuration除了上面的方法還還可以使用eclipse插件的方式. 建議:使用java程序方式,不依賴開發工具。 這里逆向工程中用的方法是上面提到的 From another Java program with an XML configuration.
此處只用到了generatorConfig.xml文件.
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> <!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 --> <jdbcConnection driverClass="com.MySQL.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" passWord="root"> </jdbcConnection> <!-- 連接Oracle數據庫的信息 --> <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> --> <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO類的位置 --> <javaModelGenerator targetPackage="cn.com.yves.model" targetProject="./src"> <!-- enableSubPackages:是否讓schema作為包的后綴 --> <property name="enableSubPackages" value="false" /> <!-- 從數據庫返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="cn.com.yves.mapper" targetProject="./src"> <!-- enableSubPackages:是否讓schema作為包的后綴 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.com.yves.mapper" targetProject="./src"> <!-- enableSubPackages:是否讓schema作為包的后綴 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定數據庫表 --> <table tableName="items" domainObjectName="ItemsModel"></table> <table tableName="orders" domainObjectName="OrdersModel"></table> <table tableName="orderdetail" domainObjectName="OrderdetailModel"></table> <table tableName="user" domainObjectName="UserModel"></table> <table tableName="user_stringkey" domainObjectName="User_stringkeyModel"> </table> <!-- <table schema="" tableName="sys_user"></table> <table schema="" tableName="sys_role"></table> <table schema="" tableName="sys_permission"></table> <table schema="" tableName="sys_user_role"></table> <table schema="" tableName="sys_role_permission"></table> --> <!-- 有些表的字段需要指定java類型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context></generatorConfiguration>GeneratorSqlmap.java文件:
package cn.com.yves;import java.io.File;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;/** * java代碼+ xml配置文件自動生成mapper.xml和mapper.java,以及po * * @author Yves He * */public class GeneratorSqlmap { public void generator() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; // 指定 逆向工程配置文件 File configFile = new File( "D://git//mybatisgeneration//generationConfig//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) throws Exception { try { GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } }}SqlMapconfig.xml配置內容:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 一般配置: 1.運行環境 2.數據源 3.事務 --><configuration> <!--全局屬性配置:除了加載db.properties 中的屬性,還可以自己配置一些屬性 --> <properties resource="db.properties"> </properties> <!-- 全局配置參數,影響mybatis的性能 --> <!-- <settings> --> <!-- <setting name="" value=""/> --> <!-- </settings> --> <!-- 類型別名 --> <typeAliases> <!-- 單個別名定義 --> <!-- <typeAlias alias="user" type="cn.com.yves.model.UserModel" /> --> <!-- 批量別名定義,掃描整個包下的類,別名為類名(首字母大寫或小寫都可以) --> <package name="cn.com.yves.model" /> </typeAliases> <!-- 類型處理器 --> <!-- <typeHandlers> --> <!-- </typeHandlers> --> <!-- 對象工程 --> <!-- <objectFactory type=""> --> <!-- </objectFactory> --> <!-- 插件 --> <!-- <plugins></plugins> --> <!-- 環境集合屬性對象 (和spring整合后 environments配置將廢除) --> <environments default="development"> <!-- 環境子屬性對象 --> <environment id="development"> <!-- 事務管理 (使用jdbc事務管理,事務控制由mybatis控制) --> <transactionManager type="JDBC" /> <!-- 數據源 (數據庫連接池 ,暫時由mybatis管理) --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 映射器(加載映射文件):我這里由于是mapper.xml和mapper.java是在同一目錄下,采用掃描包的方式注入映射文件 --> <mappers> <!-- 這里特別注意:是路徑符號,不是轉義符號 --> <package name="cn/com/yves/mapper" /> </mappers></configuration>自動生成的Mapper接口測試
學會使用mapper自動生成的增、刪、改、查方法。
/** * Filename: ItemsMapperTest.java * Copyright: Copyright (c)2016 * Company: Yves * @version: 1.0 * Create at: 2017-3-4 上午9:49:20 * Description: * * Author Yves He */package cn.com.yves.mapper;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import cn.com.yves.model.ItemsModel;import cn.com.yves.model.ItemsModelExample;import cn.com.yves.model.ItemsModelExample.Criteria;//測試類中的測試方法都會執行public class ItemsModelMapperTest { private SqlSessionFactory sqlSessionFactory; // 測試方法之前執行 @Before public void setUp() throws Exception { String mybatisConfigPath = "SqlMapConfig.xml"; InputStream inputStream = Resources .getResourceAsStream(mybatisConfigPath); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 查詢數量: @Test public void testCountByExample() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModelExample example = new ItemsModelExample(); Criteria criteria = example.createCriteria(); criteria.andNameLike("%iPhone%"); int count = mapper.countByExample(example); session.close(); } // 刪除byprimaryKey @Test public void testDeleteByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); mapper.deleteByPrimaryKey(4); session.commit(); session.close(); } // 新增,全量更新(這里要注意數據庫中不能為空的列明,否則更新時會出錯) @Test public void testInsert() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = new ItemsModel(); // iModel.setId(id); //如果id在數據中設置了自動增長,這里不需要設定id的值,設置了也不會生效 iModel.setName("iPhone6s"); iModel.setPrice(4800f); iModel.setCreatetime(new Date()); mapper.insert(iModel); session.commit(); session.close(); } // 查詢:自定義條件查詢(用得最多),這里類似那種自己封裝的filterBean來過濾查詢條件 @Test public void testSelectByExample() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); /* 創造過濾條件 */ ItemsModelExample example = new ItemsModelExample(); // 通過criteria來構造條件 Criteria criteria = example.createCriteria(); criteria.andNameEqualTo("筆記本"); List<ItemsModel> listResult = mapper.selectByExample(example); session.close(); System.out.println(listResult); } // 查詢: 通過primaryKey查詢單條記錄 @Test public void testSelectByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = mapper.selectByPrimaryKey(1); session.close(); System.out.println(iModel); } // 更新:字段不為null就更新,通常在批量更新的時候使用此方法(因為每條紀錄要更新的內容可以能不相同) @Test public void testUpdateByPrimaryKeySelective() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); ItemsModel iModel = new ItemsModel(); iModel.setId(1); iModel.setCreatetime(new Date()); mapper.updateByPrimaryKeySelective(iModel); session.commit(); session.close(); } // 更新:全量更新 @Test public void testUpdateByPrimaryKey() { SqlSession session = sqlSessionFactory.openSession(); ItemsModelMapper mapper = session.getMapper(ItemsModelMapper.class); // 全量查詢的切記要先查詢出原來的數據在做更新 ItemsModel itemsModel = mapper.selectByPrimaryKey(1); itemsModel.setName("yves"); mapper.updateByPrimaryKey(itemsModel); session.commit(); session.close(); }}逆向工程注意事項
1.單獨生成代碼后,再拷貝到工程,而不是直接在工程中生成. XXXMapper.xml文件已經存在時,如果進行重新生成則mapper.xml文件內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗。 解決方法:刪除原來已經生成的mapper xml文件再進行生成。 Mybatis自動生成的po及mapper.java文件不是內容而是直接覆蓋沒有此問題。2.關于針對oracle數據庫表生成代碼的schema問題 Schma即數據庫模式,oracle中一個用戶對應一個schema,可以理解為用戶就是schema。 當Oralce數據庫存在多個schema可以訪問相同的表名時,使用mybatis生成該表的mapper.xml將會出現mapper.xml內容重復的問題,結果導致mybatis解析錯誤。 解決方法:在table中填寫schema,如下: <table schema="XXXX" tableName=" " >
XXXX即為一個schema的名稱,生成后將mapper.xml的schema前綴批量去掉,如果不去掉當oracle用戶變更了sql語句將查詢失敗。 快捷操作方式:mapper.xml文件中批量替換:“from XXXX.”為空 Oracle查詢對象的schema可從dba_objects中查詢,如下: select * from dba_objects
心得: 如果要做代理開發,加載mapper.xml映射文件時采用掃描包的方法,在自動生成mapper.java和mapper.xml時要配置在同一目錄下,且文件名相同.