这篇文章是最近新学的 由数据库表 反向生成 实体类,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();
}
}
本文介绍了如何在IntelliJ IDEA中利用MyBatis Generator从数据库表反向生成Java实体类、Mapper接口及XML文件。通过添加相关依赖、配置mybatis-config.xml,以及操作插件,可以快速完成代码生成,简化开发流程。

4万+

被折叠的 条评论
为什么被折叠?



