轉載:http://www.javashuo.com/article/p-crxonmyx-b.htmljava
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄,MyBatis的一個主要的特色就是須要程序員本身編寫sql,那麼若是表太多的話,不免會很麻煩,因此mybatis官方提供了一個逆向工程,能夠針對單表自動生成mybatis執行所須要的代碼(包括mapper.xml、mapper.java、po)。在開發中,經常使用的逆向工程方式是經過數據庫的表生成代碼,以提升開發效率。mysql
使用逆向工程git
使用MyBatis的逆向工程,須要導入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2.jar,下面開始總結一下MyBatis逆向工程的使用步驟。程序員
新建一個工程(重要)github
咱們要新建一個java工程,這個工程專門用來使用逆向工程生成代碼的。有些人可能會問,爲何要新建一個工程呢?直接在原來工程中你想生成不就能夠了麼?確實是這樣,能夠在原來的工程中生成,可是有風險,由於MyBatis是根據配置文件來生成的(下面會說到),若是生成的路徑中有相同的文件,那麼就會覆蓋原來的文件,這樣會有風險。因此開發中通常都會新建一個java工程來生成,而後將生成的文件拷貝到本身的工程中,這也不麻煩,並且很安全。以下:
從上圖中看,①就是要執行的java代碼,執行它便可生成咱們須要的dao接口;②是生成的vo③生成的mybatis的映射文件;④mybatis生成器的配置文件。
如下是mavan工程的配置文件spring
<dependencies>sql
<dependency>數據庫
<groupId>org.mybatis</groupId>apache
<artifactId>mybatis</artifactId>安全
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- java編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
配置逆向工程的配置文件
MyBatis逆向工程生成代碼須要一個配置文件,名字隨便起。而後MyBatis會根據這個配置文件中的配置,生成相應的代碼。mybatis-generator-core-1.3.6.jar這個jar包裏面有幫助文檔,打開后里面有配置文件的模板,這裏就再也不贅述了,下面先把配置文件寫好:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration1.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/books"userId="root"
password="tiger">
</jdbcConnection>
<!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer,爲 true時把JDBC DECIMAL 和
NUMERIC 類型解析爲java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals"value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO類的位置 -->
<javaModelGenerator targetPackage="com.oracle.mybatis.vo"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否讓schema做爲包的後綴 -->
<property name="enableSubPackages"value="false" />
<!-- 從數據庫返回的值被清理先後的空格 -->
<property name="trimStrings"value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.oracle.mybatis.mapper"
targetProject=".\src\main\resources">
<!-- enableSubPackages:是否讓schema做爲包的後綴 -->
<property name="enableSubPackages"value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.oracle.dao"
targetProject=".\src\main\java">
<!-- enableSubPackages:是否讓schema做爲包的後綴 -->
<property name="enableSubPackages"value="false" />
</javaClientGenerator>
<!-- 指定數據庫表 -->
<table schema=""tableName="book"></table>
<table schema=""tableName="account"></table>
<!-- 有些表的字段須要指定java類型
<table schema=""tableName="">
<columnOverridecolumn="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
從上面的配置文件中能夠看出,配置文件主要作的幾件事是:
1. 鏈接數據庫,這是必須的,要否則怎麼根據數據庫的表生成代碼呢?
2. 指定要生成代碼的位置,要生成的代碼包括po類,mapper.xml和mapper.java
3. 指定數據庫中想要生成哪些表
執行逆向工程生成代碼
配置文件搞好了,而後就執行如下程序便可生成代碼了,生成的java程序,下載的逆向工程文檔中都有示例,以下:
publicclass Generator {
publicvoid generator() throws Exception{
List<String> warnings = new ArrayList<String>();
booleanoverwrite = true;
//指定逆向工程配置文件
File configFile = new File("src/main/resources/Configuration.xml");
System.out.println(configFile.getAbsolutePath());
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);
}
/**主函數*/
publicstaticvoid main(String[] args) throws Exception {
try {
GeneratorgeneratorSqlmap = new Generator();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行一下便可,運行完了後刷新一下工程,就能夠看到最新生成的代碼了。
這裏能夠看出有個細節,每一個vo類多了一個東西,就是xxxExample.java,這個類是給用戶自定義sql使用的,後面我會提到。到這裏就生成好了,下面咱們就把生成的代碼拷貝到本身的工程使用了。
逆向工程測試
在這裏我把生成的代碼拷貝到上文的工程案例中,:
接着在Spring核心配置文件——application-context.xml添加以下配置:
<bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource"ref="dataSource"></property>
<!-- 映射文件所在的位置 -->
<property name="mapperLocations"value="classpath*:com/oracle/mapper/*.xml"></property>
<property name="typeAliasesPackage"value="com.oracle.vo"></property>
<property name="configurationProperties">
<props>
<prop key="logImpl">LOG4J</prop>
</props>
</property>
<!-- 配置分頁插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- dao接口的位置 -->
<mybatis-spring:scan base-package="com.oracle.dao"/>
最後編寫UserMapper接口的單元測試類——UserMapperTest.java,內容以下:
publicclassUserMapperTest {
privateApplicationContext applicationContext;
@Before
publicvoidinit() {
// 初始化Spring容器
applicationContext = newClassPathXmlApplicationContext("capplication-context.xml");
}
@Test
publicvoidtestDeleteByPrimaryKey() {
// 請讀者自行測試...
}
@Test
publicvoidtestInsert() {
BookMapper bookMapper = applicationContext.getBean(BookMapper.class);
Book book = new Book();
book.setName("數學之美");
book.setIsbn(4578963);
book.setPrice(39);
bookMapper.insert(book);
}
@Test
publicvoidtestSelectByExample() {
BookMapper bookMapper = applicationContext.getBean(BookMapper.class);
BookExample example = new bookExample();
// Criteria類是UserExample類裏面的內部類,Criteria類是幹什麼用的呢?它專門用於封裝自定義查詢條件的
// Criteria criteria = example.createCriteria();
// criteria.andNameLike("%數學%");
// 執行查詢
List<BookMapper> list = bookMapper.selectByExample(example);
for (BookMapper book : list) {
System.out.println(user);
}
}
@Test
publicvoidtestSelectByPrimaryKey() {
BookMapper bookMapper = applicationContext.getBean(BookMapper.class);
BookMapper book = bookMapper.selectByPrimaryKey(10);
System.out.println(book);
}
@Test
publicvoidtestUpdateByPrimaryKey() {
// 請讀者自行測試...
}
}