Intellij IDEA Spring Boot (11) MyBatis Generator 自动生成

本文介绍了如何在IntelliJ IDEA中利用MyBatis Generator从数据库表反向生成Java实体类、Mapper接口及XML文件。通过添加相关依赖、配置mybatis-config.xml,以及操作插件,可以快速完成代码生成,简化开发流程。

  这篇文章是最近新学的 由数据库表 反向生成 实体类,mapper.xml,Dao。

先新建一个项目


然后pom文件

这里log的配置,我只是学习使用别人的一种方式

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.dashuai.mybatis</groupId>
	<artifactId>mybatisapp</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>mybatisapp</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.8.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>de.codecentric</groupId>
			<artifactId>spring-boot-admin-starter-client</artifactId>
			<version>1.4.6</version>
			<exclusions> <!--这个是排除该jar包中连带依赖的以下依赖-->
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions> <!--这个是排除该jar包中连带依赖的以下依赖-->
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!--spring-boot-log4j2依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.44</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
			<scope>true</scope>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.31</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.33</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.1.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>1.3.5</version>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<fork>true</fork>
				</configuration>
			</plugin>
		</plugins>
	</build>


</project>

然后是把application.properties文件后缀名改为.yml。不是必须的。但改为yml,内容如下:

server:
  port: 8080
spring:
  application:
    name: mybatis-app
  datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8
        jdbcUsername: root
        jdbcPassword: 123456
        filters: stat
        maxActive: 20
        initialSize: 20
        maxWait: 2000
        minIdle: 20
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 1 from dual
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false

mybatis:
  mapperLocations: classpath:mapper/*.xml

接下来是日志

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="spring.application.name">
           mybatis-app
        </Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>%d %p [${ctx:spring.application.name},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}] %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
        </Console>
        <!-- 按日期每天生成log文件 -->
        <RollingFile name="RollingFile" fileName="../${ctx:spring.application.name}.log"
                     filePattern="../${ctx:spring.application.name}-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>%d %p [${ctx:spring.application.name},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}] %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>

            <!-- log文件只打印error级别信息 -->
            <Filters>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.dashuai.mybatis" level="DEBUG" additivity="false">
            <appender-ref ref="Console" />
            <appender-ref ref="file" />
        </Logger>

        <!-- 输出info级别信息 Root 节点不可删除,但是root的level 可以在yml文件中配置-->
        <Root>
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </Loggers>
</Configuration>

然后是 mybatisConfiguration

package com.dashuai.mybatis.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * @author yaoss
 */
@Configuration(value = "MybatisConfiguration")
@MapperScan(basePackages = {"com.dashuai.mybatis.dao"})
public class MybatisConfiguration {

	@Value("${spring.datasource.driver-class-name}")
	private String driveClassName;

	@Value("${spring.datasource.url}")
	private String jdbcUrl;

	@Value("${spring.datasource.jdbcUsername}")
	private String jdbcUsername;

	@Value("${spring.datasource.jdbcPassword}")
	private String jdbcPassword;

	@Value("${spring.datasource.filters}")
	private String filters;

	@Value("${spring.datasource.maxActive}")
	private int maxActive;

	@Value("${spring.datasource.initialSize}")
	private int initialSize;

	@Value("${spring.datasource.maxWait}")
	private int maxWait;

	@Value("${spring.datasource.minIdle}")
	private int minIdle;

	@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
	private long timeBetweenEvictionRunsMillis;

	@Value("${spring.datasource.minEvictableIdleTimeMillis}")
	private int minEvictableIdleTimeMillis;

	@Value("${spring.datasource.validationQuery}")
	private String validationQuery;

	@Value("${spring.datasource.testWhileIdle}")
	private boolean testWhileIdle;

	@Value("${spring.datasource.testOnBorrow}")
	private boolean testOnBorrow;

	@Value("${spring.datasource.testOnReturn}")
	private boolean testOnReturn;

	@Bean
	public DataSource dataSource() {

		DruidDataSource datasource = new DruidDataSource();
		datasource.setDriverClassName(this.driveClassName);
		datasource.setUrl(this.jdbcUrl);
		datasource.setUsername(this.jdbcUsername);
		datasource.setPassword(this.jdbcPassword);
		datasource.setMaxActive(this.maxActive);
		datasource.setInitialSize(this.initialSize);
		datasource.setMaxWait(this.maxWait);
		datasource.setMinIdle(this.minIdle);
		datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);
		datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);
		datasource.setValidationQuery(this.validationQuery);
		datasource.setTestWhileIdle(this.testWhileIdle);
		datasource.setTestOnBorrow(this.testOnBorrow);
		datasource.setTestOnReturn(this.testOnReturn);

		try {
			datasource.setFilters("stat,wall");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return datasource;
	}
}

接下来,基本上项目就可以跑起来了。 但是我们要研究 由表自动反向生成实体类,dao,mapper。

第一: pom文件 插件的依赖,以及mybatis,mysql驱动的依赖

第二: mybaits-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="callSettersOnNulls" value="true"/>
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

第三: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>
    <classPathEntry location="D:\Dev\MavenRepo\mysql\mysql-connector-java\5.1.44\mysql-connector-java-5.1.44.jar" />

    <context id="MyTables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!--<javaTypeResolver >-->
            <!--<property name="forceBigDecimals" value="false" />-->
        <!--</javaTypeResolver>-->

        <javaModelGenerator targetPackage="com.dashuai.mybatis.entity" targetProject="D:\Dev\myApp\mybatisapp\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mapper"  targetProject="D:\Dev\myApp\mybatisapp\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.dashuai.mybatis.dao" targetProject="D:\Dev\myApp\mybatisapp\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <table schema="mybatis" tableName="tb_user" domainObjectName="User" >
            <!--<property name="useActualColumnNames" value="true"/>-->
            <!--<generatedKey column="ID" sqlStatement="DB2" identity="true" />-->
            <!--<columnOverride column="DATE_FIELD" property="startDate" />-->
            <!--<ignoreColumn column="FRED" />-->
            <!--<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />-->
        </table>
        <table schema="mybatis" tableName="tb_role" domainObjectName="Role"  />
        <table schema="mybatis" tableName="tb_user_role" domainObjectName="UserRole"  />

    </context>
</generatorConfiguration>

第四:数据库表


最后使用插件。

使用插件前:


使用插件


使用插件成功后:


那么这一系列就完成了。接下来测试一下。

package com.dashuai.mybatis.controller;

import com.dashuai.mybatis.entity.User;
import com.dashuai.mybatis.service.UserService;
import com.dashuai.mybatis.util.Pagination;
import com.dashuai.mybatis.util.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

    private static Logger log = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 用户列表展示
     *
     * @return
     */
    @RequestMapping(value = "/getUserList", method = RequestMethod.GET)
    public Result getUserList(@RequestParam(value = "userName", required = false) String userName,
                              @RequestParam(required = false, value = "sortName") String sortName,
                              @RequestParam(required = false, value = "sortOrder") String sortOrder,
                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                              @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Result result = new Result();
        result.setRetCode(Result.RECODE_SUCCESS);
        try {
            Pagination<User> userList = userService.getUserList(userName, sortName,sortOrder,pageNum, pageSize);
            result.setData(userList);
        } catch (Exception e) {
            log.error("用户列表展示接口发生错误", e);
            throw new RuntimeException("用户列表展示接口发生错误", e);
        }
        return result;
    }

    /**
     * 通过ID查找用户
     *
     * @param id
     * @return
     */
    @RequestMapping(value = "/getByPrimaryKey/{id}", method = RequestMethod.GET)
    public Result getByPrimaryKey(@PathVariable("id") String id) {
        Result result = new Result();
        result.setRetCode(Result.RECODE_SUCCESS);
        try {
            User user = userService.getByPrimaryKey(id);
            result.setData(user);
        } catch (Exception e) {
            log.error("通过ID查找用户接口发生错误", e);
            throw new RuntimeException("通过ID查找用户接口发生错误", e);
        }
        return result;
    }

    /**
     * 新增用户
     *
     * @param user
     * @return
     */
    @RequestMapping(value = "/addUser", method = RequestMethod.POST)
    public Result addUser(@RequestBody User user) {
        Result result = new Result();
        result.setRetCode(Result.RECODE_SUCCESS);
        try {
            userService.addUser(user);
            result.setData(user.getUuid());
        } catch (Exception e) {
            log.error("新增用户接口发生错误", e);
            throw new RuntimeException("新增用户接口发生错误", e);
        }
        return result;
    }

    /**
     * 删除用户
     *
     * @param id
     * @return
     */
    @RequestMapping(value = "/delUser/{id}", method = RequestMethod.DELETE)
    public Result delUser(@PathVariable("id") String id) {
        Result result = new Result();
        result.setRetCode(Result.RECODE_SUCCESS);
        try {
            userService.delUser(id);
        } catch (Exception e) {
            log.error("删除用户接口发生错误", e);
            throw new RuntimeException("删除用户接口发生错误", e);
        }
        return result;
    }

    /**
     * 修改用户
     *
     * @param user
     * @return
     */
    @RequestMapping(value = "/updateUser", method = RequestMethod.PUT)
    public Result updateUser(@RequestBody User user) {
        Result result = new Result();
        result.setRetCode(Result.RECODE_SUCCESS);
        try {
            userService.updateUser(user);
            result.setData(user.getUuid());
        } catch (Exception e) {
            log.error("修改用户接口发生错误", e);
            throw new RuntimeException("修改用户接口发生错误", e);
        }
        return result;
    }

}
package com.dashuai.mybatis.service;


import com.dashuai.mybatis.entity.User;
import com.dashuai.mybatis.util.Pagination;

public interface UserService {

    /**
     * 分页用户列表展示
     *
     * @param userName
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    Pagination<User> getUserList(String userName, String sortName, String sortOrder, int pageNum, int pageSize) throws Exception;

    /**
     * 通过ID查找用户
     *
     * @param id
     * @return
     */
    User getByPrimaryKey(String id) throws Exception;

    /**
     * 添加用户
     *
     * @param user
     * @return
     */
    int addUser(User user) throws Exception;

    /**
     * 删除用户
     *
     * @param id
     * @return
     */
    int delUser(String id) throws Exception;

    /**
     * 更新用户
     *
     * @param user
     * @return
     */
    int updateUser(User user) throws Exception;


}

package com.dashuai.mybatis.util;

import java.util.List;

public class Pagination<T> {
    private int pageNum;
    private int pageSize;
    private long total;
    private List<T> list;

    public Pagination(List<T> list, int pageNum, int pageSize, long total) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
    }

    public int getPageNum() {
        return this.pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return this.pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public long getTotal() {
        return this.total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public List<T> getList() {
        return this.list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public String toString() {
        return "{pageNum:" + this.pageNum + ", pageSize:" + this.pageSize + ", total:" + this.total + ", list:" + this.list + '}';
    }
}
package com.dashuai.mybatis.util;

public class Result {
    public static Integer RECODE_SUCCESS = Integer.valueOf(1);
    public static Integer RECODE_ERROR = Integer.valueOf(0);
    public static Integer RECODE_UNLOGIN = Integer.valueOf(-1);
    public static Integer RECODE_VALIDATE_ERROR = Integer.valueOf(-2);
    private String errMsg;
    private Integer retCode;
    private Object data;

    public Result() {
        this.retCode = RECODE_SUCCESS;
    }

    public String getErrMsg() {
        return this.errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

    public Integer getRetCode() {
        return this.retCode;
    }

    public void setRetCode(Integer retCode) {
        this.retCode = retCode;
    }

    public Object getData() {
        return this.data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return " {\"errMsg\":" + this.errMsg + ", \"retCode\":" + this.retCode + ", \"data\":" + this.data + "}";
    }
}
package com.dashuai.mybatis.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {

    public static boolean isNullOrEmpty(Object obj) {
        return obj == null || "".equals(String.valueOf(obj).trim());
    }

    private static Pattern humpPattern = Pattern.compile("[A-Z]");
    /**
     * @return java.lang.String
     * @desc 驼峰转下划线
     * @pars [str]  驼峰字符串
     * @date 2017/6/28 0028 上午 10:37 lulx
     **/
    public static String underscoreName(String str) {
        if (isNullOrEmpty(str)) {
            return null;
        }
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值