由于现在互联网蓬勃发展,为了求快,持久层使用的框架已经从Hibernate转化为mybatis,不过笔者从使用两者之后的感觉明显就是Hibernate高大上,但是学习起来门槛比较高;而mybatis则学起来难度较低,而且在开发过程中使用mybatis可以提升开发效率。现在笔者也从Hibernate往mybatis转移,但是后续还是会离不开Hibernate,尤其是业务开始使用springboot的时候,配合使用的JPA则就是基于Hibernate的。本文则主要讲述mybatis使用过程中一个可以提升效率的方法---mybatis逆向工程,通过插件来实现数据库的链接并将指定数据表映射成JavaBean类,并自动生成mybatis基于该数据表的操作--mapper类以及mapper.xml文件。
1.数据库中建立相关表
首先建立数据库mydata,然后在该库中建立一个employees表,命令如下:
create database mydata;
use mydata;
DROP TABLE IF EXISTS EMPLOYEES;
CREATE TABLE EMPLOYEES(EMPLOYEE_ID INTEGER(12),
DEPT_ID INTEGER,
EMPLOYEE_NAME VARCHAR(32),
EMPLOYEE_NAME_SALARY INTEGER,
primary key(EMPLOYEE_ID));
2.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>
<properties resource="config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--支持序列化-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--指定某些表参与逆向工程,并且指定哪些方法暴露出来-->
<table tableName="employees"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
3. config.properties文件
该文件则是对一些generatorConfig.xml文件中涉及的属性的说明,包括一些数据库的连接池、登录账户密码等。
# 数据库配置
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mydata?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
jdbc.user=root
jdbc.password=root
# 通用Mapper固定配置
mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin
mapper.Mapper=tk.mybatis.mapper.common.Mapper
mapper.forceAnnotation=true
# 生成文件保存位置
targetModelPackage=com.carson.mybatis_generate.entity
targetXMLPackage=com.carson.mybatis_generate.mapper
targetMapperPackage=com.carson.mybatis_generate.mapper
targetJavaProject=src/main/java
targetResourcesProject=src/main/java
4.pom文件
要实现逆向工程,则需要一些插件和相关依赖,mysql-connector-java用于连接数据库,mybatis-generator-core用于逆向工程生成文件。同时需要引入mybatis依赖包。
<?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.carson</groupId>
<artifactId>mybatis_generate</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- 依赖版本 -->
<mapper.version>3.3.9</mapper.version>
<mysql.version>8.0.16</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${mapper.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${mapper.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
5.生成文件
点击上述选中的即可生成相应的文件,如下所示:
其中Employees.java:
import java.io.Serializable;
public class Employees implements Serializable {
private Integer employeeId;
private Integer deptId;
private String employeeName;
private Integer employeeNameSalary;
private static final long serialVersionUID = 1L;
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName == null ? null : employeeName.trim();
}
public Integer getEmployeeNameSalary() {
return employeeNameSalary;
}
public void setEmployeeNameSalary(Integer employeeNameSalary) {
this.employeeNameSalary = employeeNameSalary;
}
EmployeesMapper.java:
import com.carson.mybatis_generate.entity.Employees;
public interface EmployeesMapper {
int deleteByPrimaryKey(Integer employeeId);
int insert(Employees record);
int insertSelective(Employees record);
Employees selectByPrimaryKey(Integer employeeId);
int updateByPrimaryKeySelective(Employees record);
int updateByPrimaryKey(Employees record);
}
Employees.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.carson.mybatis_generate.mapper.EmployeesMapper">
<resultMap id="BaseResultMap" type="com.carson.mybatis_generate.entity.Employees">
<id column="EMPLOYEE_ID" jdbcType="INTEGER" property="employeeId" />
<result column="DEPT_ID" jdbcType="INTEGER" property="deptId" />
<result column="EMPLOYEE_NAME" jdbcType="VARCHAR" property="employeeName" />
<result column="EMPLOYEE_NAME_SALARY" jdbcType="INTEGER" property="employeeNameSalary" />
</resultMap>
<sql id="Base_Column_List">
EMPLOYEE_ID, DEPT_ID, EMPLOYEE_NAME, EMPLOYEE_NAME_SALARY
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from employees
where EMPLOYEE_ID = #{employeeId,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from employees
where EMPLOYEE_ID = #{employeeId,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.carson.mybatis_generate.entity.Employees">
insert into employees (EMPLOYEE_ID, DEPT_ID, EMPLOYEE_NAME,
EMPLOYEE_NAME_SALARY)
values (#{employeeId,jdbcType=INTEGER}, #{deptId,jdbcType=INTEGER}, #{employeeName,jdbcType=VARCHAR},
#{employeeNameSalary,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.carson.mybatis_generate.entity.Employees">
insert into employees
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="employeeId != null">
EMPLOYEE_ID,
</if>
<if test="deptId != null">
DEPT_ID,
</if>
<if test="employeeName != null">
EMPLOYEE_NAME,
</if>
<if test="employeeNameSalary != null">
EMPLOYEE_NAME_SALARY,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="employeeId != null">
#{employeeId,jdbcType=INTEGER},
</if>
<if test="deptId != null">
#{deptId,jdbcType=INTEGER},
</if>
<if test="employeeName != null">
#{employeeName,jdbcType=VARCHAR},
</if>
<if test="employeeNameSalary != null">
#{employeeNameSalary,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.carson.mybatis_generate.entity.Employees">
update employees
<set>
<if test="deptId != null">
DEPT_ID = #{deptId,jdbcType=INTEGER},
</if>
<if test="employeeName != null">
EMPLOYEE_NAME = #{employeeName,jdbcType=VARCHAR},
</if>
<if test="employeeNameSalary != null">
EMPLOYEE_NAME_SALARY = #{employeeNameSalary,jdbcType=INTEGER},
</if>
</set>
where EMPLOYEE_ID = #{employeeId,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.carson.mybatis_generate.entity.Employees">
update employees
set DEPT_ID = #{deptId,jdbcType=INTEGER},
EMPLOYEE_NAME = #{employeeName,jdbcType=VARCHAR},
EMPLOYEE_NAME_SALARY = #{employeeNameSalary,jdbcType=INTEGER}
where EMPLOYEE_ID = #{employeeId,jdbcType=INTEGER}
</update>
</mapper>
6.常见的报错
1.mybatis-generator-maven-plugin:1.3.5:generate (default-cli) on project mybatis_generate: Communications link failure
是因为没有连上数据库。
2.数据库显示:Could not connect, server may not be running. Can't connect to...
这说明mysql服务未启动,需要启动服务。
3.出现mysql服务一直无法启动的情况
上图所示操作相当于进行初始化,然后进入workbench进行修改密码,old password,则可以在mysql安装目录下的data中.err结尾的文件中寻找,然后更换成新的密码。然后需要重新建立需要的库以及表。