現在,任何一個互聯網產品都離不開數據,更離不開數據庫。在我還沒了解過Spring和MyBatis以前,作一個簡單的登陸Demo都要手動編寫,用戶類、數據庫操做類、JDBC註冊等,花費了許多時間在與數據庫的交互上。直到有一天,有個小夥伴告訴我:你能夠試一下MyBatis,而後經過MyBatis來管理與數據庫的交互以及實體類的生成。 因而我找到了MyBatis的資料,看到以下一段描述:php
MyBatis 本是Apache的一個開源項目iBatis, 2010年這個項目由Apache Software Foundation 遷移到了Google Code,而且更名爲MyBatis,實質上Mybatis對ibatis進行一些改進。
MyBatis是一個優秀的持久層框架,它對JDBC的操做數據庫的過程進行封裝,使開發者只須要關注 SQL 自己,而不須要花費精力去處理例如註冊驅動、建立Connection、建立Statement、手動設置參數、結果集檢索等JDBC繁雜的過程代碼。
MyBatis經過xml或註解的方式將要執行的各類Statement(Statement、PreparedStatement、CallableStatement)配置起來,並經過Java對象和Statement中的SQL進行映射生成最終執行的SQL語句,最後由MyBatis框架執行SQL並將結果映射成Java對象並返回。java
看到上面的描述,簡單點說就是MyBatis集成了JDBC,而後能夠經過定義Java對象和Statement中的Sql映射來執行SQL語言。心想:好像有點牛逼,可是仍是要本身寫實體類、寫SQL映射啊,有沒有簡單點的方式呢?我就喜歡在數據庫中建立各類主鍵、外鍵、索引,經過Java實體類來生成數據庫表,好像作不到吧??mysql
有一天,我偶然發現有一個叫作MyBatis-generator的逆向插件,能夠將數據庫中的表,直接生成實體POJO類、Dao層等。所以,我就開始了MyBatis-generator的逆向之路。sql
項目中使用了MySQL數據庫、MyBatis持久層框架,經過MyBatis-generator生成POJO類、數據映射Mapper和Dao層。數據庫
首先在pom.xml文件中添加以下配置:bash
<dependencies>
...
<!-- 使用mybatis-generator逆向工程 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<build>
<plugins>
...
<!-- 使用mybatis-generator maven插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
複製代碼
建表操做省略... mybatis
<?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>
<!--數據庫驅動 -->
<classPathEntry location=".m2\\repository\\mysql\\mysql-connector-java\\5.1.45\\mysql-connector-java-5.1.45.jar"/>
<context id="DB2Tables" 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/數據庫名字" userId="帳號" password="密碼">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model類存放位置 -->
<javaModelGenerator targetPackage="com.ljh.po" 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="true"/>
</sqlMapGenerator>
<!--生成Dao類存放位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.ljh.dao" targetProject="src/main/java/">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成對應表及類名-->
<table tableName="user" domainObjectName="User"/>
<table tableName="permission" domainObjectName="Permission" />
<table tableName="role" domainObjectName="Role" />
<table tableName="role_permission" domainObjectName="RolePermission" />
</context>
</generatorConfiguration>
複製代碼
看到上述的配置文件,其實不難理解app
Result Maps collection already contains value for ***
複製代碼
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指向逆向工程配置文件
File configFile = new File("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);
}
複製代碼