MyBatis逆向工程
MyBatis Generator简介
MyBatis Generator简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据数据库表生成对应的映射文件、接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要手动编写;
MBG的搭建
项目目录结构
MBG jar包
官方地址:http://www.mybatis.org/generator/
github地址:https://github.com/mybatis/generator/releases
maven地址:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.soft863</groupId>
<artifactId>mbg</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mbg</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- MyBatis generator(逆向工程) -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>mbg</finalName>
</build>
</project>
MBG配置文件
创建MBG配置文件mbg.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>
<!--
targetRuntime:指定生成代码的运行目标
可选值:
MyBatis:可以生成动态WHERE条件的SQL
MyBatis3Simple:只能生成简单的CURD
Ibatista2Java2
Ibatista2Java5
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 指定如何连接到目标数据库 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_echarts"
userId="root"
password="root">
</jdbcConnection>
<!-- Java类型解析器 -->
<javaTypeResolver>
<!-- 是否强制转换BigDecimals -->
<property name="forceBigDecimals" value="false"></property>
</javaTypeResolver>
<!-- 配置JavaBean的生成策略 -->
<!--
targetPackage:目标包名;
targetProject:目标工程;
-->
<javaModelGenerator targetPackage="com.soft863.mbg.entity" targetProject="./src/main/java">
<property name="enableSubPackages" value="true"></property>
<property name="trimStrings" value="true"></property>
</javaModelGenerator>
<!-- sql映射生成策略 -->
<sqlMapGenerator targetPackage="com.soft863.mbg.dao.mapper" targetProject="./src/main/java">
<property name="enableSubPackages" value="true"></property>
</sqlMapGenerator>
<!--mapper接口的所在位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.soft863.mbg.dao" targetProject="./src/main/java">
<property name="enableSubPackages" value="true"></property>
</javaClientGenerator>
<!-- 根据表创建JavaBean-->
<!--
tableName:表名;
domainObjectName:要生成的类名;
-->
<table tableName="t_goods" domainObjectName="Goods"></table>
<table tableName="t_score" domainObjectName="Score"></table>
</context>
</generatorConfiguration>
测试
说明:
a)testMbg()方法是执行MBG配置文件的方法,运行该方法,会生成bean、接口、映射文件;
b)后面两个方法是测试生成内容的测试方法;
package com.soft863.mbg.test;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
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;
import com.soft863.mbg.dao.GoodsMapper;
import com.soft863.mbg.entity.Goods;
public class TestCase {
/**
* 运行逆向工程配置文件
* @throws Exception
*/
@Test
public void testMbg() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.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);
}
private static SqlSessionFactory ssf = null;
@BeforeClass
public static void beforeClass() {
InputStream is = TestCase.class.getResourceAsStream("/mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(is);
}
/**
* 测试Mybatis3Simple逆向工程生成的功能
*/
@Test
public void testMybatis3Simple() {
SqlSession session = ssf.openSession();
GoodsMapper goodsDao = session.getMapper(GoodsMapper.class);
List<Goods> list = goodsDao.selectAll();
for (Goods goods : list) {
System.out.println(goods.getGoodsid());
}
session.close();
}
}
待条件复杂查询
项目目录结构
使用复杂的条件查询,要在MBG配置文件中,<context>标签的targetRuntime属性修改为“Mybatis3”,该参数值支持生成复杂的mapper文件;
注:修改mbg.xml后,在运行执行MBG配置文件方法前,先把原来生成的所有文件删掉,防止新生成的文件覆盖原文件时发出错误;
修改后的<context>标签,如下:
<context id="DB2Tables" targetRuntime="MyBatis3">
测试
/**
* 测试Mybatis3逆向工程生成的功能
*/
@Test
public void testMybatis3() {
SqlSession session = ssf.openSession();
GoodsMapper goodsDao = session.getMapper(GoodsMapper.class);
/*
* selectByExample():查询多条记录,参数为null时,查询所有记录,指定参数时,参数是查询的条件
*/
// 查询所有记录
List<Goods> list = goodsDao.selectByExample(null);
for (Goods goods : list) {
System.out.println(goods.getGoodsid());
}
System.out.println("----------------------");
// 根据条件查询记录
GoodsExample example = new GoodsExample(); // XxxExample类封装的查询条件
Criteria criteria = example.createCriteria(); // Criteria中封装了一系列的条件拼接方法
criteria.andGoodstotalBetween(0, 100); // 商品数量在0到100之间的商品
/*
* 多个where条件的关系是and时,调用and开头的方法设置条件即可;
* 如果是 or 的关系,则要新创建一个Criteria对象,设置条件,然后使用example.or(Criteria对象)
* 方法就可以拼接上 or 的条件
*/
Criteria criteria2 = example.createCriteria();
criteria2.andGoodstotalEqualTo(200);
example.or(criteria2);
List<Goods> list2 = goodsDao.selectByExample(example); // 查询结果
for (Goods goods : list2) {
System.out.println(goods.getGoodsid());
}
session.close();
}