-
项目搭建
- springboot
- mybatis插件生成器
-
mybaitis插件使用
- pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- (1) mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
2.mybatis配置文件
<?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>
<!--mybatis生成工具的帮助文档可以看:-->
<!--英文:http://www.mybatis.org/generator/usage/mysql.html-->
<!--中文:http://www.mybatis.tk/-->
<!--中文:http://mbg.cndocs.tk/-->
<!--<classPathEntry location="D:\maven5\mvnRespo\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>-->
<context id="context" targetRuntime="MyBatis3">
<!--设置编码格式-->
<property name="javaFileEncoding" value="UTF-8"/>
<commentGenerator>
<property name="suppressAllComments" value="false"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
<!--添加你的 JDBC 连接信息-->
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" userId="****" password="****"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--要生成的 pojo 模块位置-->
<javaModelGenerator targetPackage="com.timothy.generator.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--要生成的 Mapper.xml 文件位置-->
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--要生成的 Mapper 接口类-->
<javaClientGenerator targetPackage="com.timothy.generator.mapper" targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--要根据哪张表生成,要在这里配置-->
<!--用百分号表示生成所有表,可以直接省去一个一个写 <table tableName="%" />
<table tableName="%" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>-->
<!--用户报告列表-->
<table tableName="User" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="select uuid_short()" identity="false" />
<columnOverride column="emails" javaType="java.lang.String[]" typeHandler="com.timothy.mybatis.JsonStringArrayTypeHandler"/>
<columnOverride column="address" javaType="java.lang.Object" typeHandler="com.timothy.mybatis.JsonTypeHandler"/>
</table>
</context>
</generatorConfiguration>
3.生成的实体
package com.timothy.generator.pojo;
public class User {
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.id
*
* @mbggenerated
*/
private Integer id;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.name
*
* @mbggenerated
*/
private String name;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.age
*
* @mbggenerated
*/
private Integer age;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.emails
*
* @mbggenerated
*/
private String[] emails;
/**
* This field was generated by MyBatis Generator.
* This field corresponds to the database column User.address
*
* @mbggenerated
*/
private Object address;
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.id
*
* @return the value of User.id
*
* @mbggenerated
*/
public Integer getId() {
return id;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column User.id
*
* @param id the value for User.id
*
* @mbggenerated
*/
public void setId(Integer id) {
this.id = id;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.name
*
* @return the value of User.name
*
* @mbggenerated
*/
public String getName() {
return name;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column User.name
*
* @param name the value for User.name
*
* @mbggenerated
*/
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.age
*
* @return the value of User.age
*
* @mbggenerated
*/
public Integer getAge() {
return age;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column User.age
*
* @param age the value for User.age
*
* @mbggenerated
*/
public void setAge(Integer age) {
this.age = age;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.emails
*
* @return the value of User.emails
*
* @mbggenerated
*/
public String[] getEmails() {
return emails;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column User.emails
*
* @param emails the value for User.emails
*
* @mbggenerated
*/
public void setEmails(String[] emails) {
this.emails = emails;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column User.address
*
* @return the value of User.address
*
* @mbggenerated
*/
public Object getAddress() {
return address;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column User.address
*
* @param address the value for User.address
*
* @mbggenerated
*/
public void setAddress(Object address) {
this.address = address;
}
}
4.mapper.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.timothy.generator.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.timothy.generator.pojo.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="emails" property="emails" jdbcType="VARCHAR" typeHandler="com.timothy.mybatis.JsonStringArrayTypeHandler" />
<result column="address" property="address" jdbcType="VARCHAR" typeHandler="com.timothy.mybatis.JsonTypeHandler" />
</resultMap>
<sql id="Base_Column_List" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
id, name, age, emails, address
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
select
<include refid="Base_Column_List" />
from User
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
delete from User
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.timothy.generator.pojo.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >
select uuid_short()
</selectKey>
insert into User (id, name, age,
emails,
address)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER},
#{emails,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonStringArrayTypeHandler},
#{address,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonTypeHandler})
</insert>
<insert id="insertSelective" parameterType="com.timothy.generator.pojo.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >
select uuid_short()
</selectKey>
insert into User
<trim prefix="(" suffix=")" suffixOverrides="," >
id,
<if test="name != null" >
name,
</if>
<if test="age != null" >
age,
</if>
<if test="emails != null" >
emails,
</if>
<if test="address != null" >
address,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
#{id,jdbcType=INTEGER},
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
<if test="age != null" >
#{age,jdbcType=INTEGER},
</if>
<if test="emails != null" >
#{emails,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonStringArrayTypeHandler},
</if>
<if test="address != null" >
#{address,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonTypeHandler},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.timothy.generator.pojo.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
update User
<set >
<if test="name != null" >
name = #{name,jdbcType=VARCHAR},
</if>
<if test="age != null" >
age = #{age,jdbcType=INTEGER},
</if>
<if test="emails != null" >
emails = #{emails,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonStringArrayTypeHandler},
</if>
<if test="address != null" >
address = #{address,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonTypeHandler},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.timothy.generator.pojo.User" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
update User
set name = #{name,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER},
emails = #{emails,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonStringArrayTypeHandler},
address = #{address,jdbcType=VARCHAR,typeHandler=com.timothy.mybatis.JsonTypeHandler}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="findById" resultMap="BaseResultMap">
SELECT * FROM User where id =1
</select>
</mapper>
-
使用自定义的handler(常用的几个)
- json---->Integer[]
package com.timothy.mybatis;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
<columnOverride column="ids" javaType="java.lang.Integer[]" typeHandler="JsonIntegerArrayTypeHandler"/>
*/
public class JsonIntegerArrayTypeHandler extends BaseTypeHandler<Integer[]> {
private static final ObjectMapper mapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Integer[] parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i,toJson(parameter));
}
@Override
public Integer[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.toObject(rs.getString(columnName));
}
@Override
public Integer[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.toObject(rs.getString(columnIndex));
}
@Override
public Integer[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.toObject(cs.getString(columnIndex));
}
private String toJson(Integer[] params) {
try {
return mapper.writeValueAsString(params);
} catch (Exception e) {
e.printStackTrace();
}
return "[]";
}
private Integer[] toObject(String content) {
if (content != null && !content.isEmpty()) {
try {
return (Integer[]) mapper.readValue(content, Integer[].class);
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return null;
}
}
}
2.json---->Object
package com.timothy.mybatis;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.timothy.config.JsonUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
/**
* 继承自BaseTypeHandler<Object> 使用Object是为了让JsonUtil可以处理任意类型
*/
public class JsonTypeHandler extends BaseTypeHandler<Object> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter,
JdbcType jdbcType) throws SQLException {
ps.setString(i, JsonUtil.stringify(parameter));
}
@Override
public Object getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return JsonUtil.parse(rs.getString(columnName), Object.class);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JsonUtil.parse(rs.getString(columnIndex), Object.class);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return JsonUtil.parse(cs.getString(columnIndex), Object.class);
}
}
3.json---->String[]
package com.timothy.mybatis;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
<columnOverride column="urls" javaType="java.lang.String[]" typeHandler="JsonStringArrayTypeHandler"/>
*/
@MappedJdbcTypes({JdbcType.VARCHAR})
public class JsonStringArrayTypeHandler extends BaseTypeHandler<String[]> {
private static final ObjectMapper mapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i,toJson(parameter));
}
@Override
public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.toObject(rs.getString(columnName));
}
@Override
public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.toObject(rs.getString(columnIndex));
}
@Override
public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.toObject(cs.getString(columnIndex));
}
private String toJson(String[] params) {
try {
return mapper.writeValueAsString(params);
} catch (Exception e) {
e.printStackTrace();
}
return "[]";
}
private String[] toObject(String content) {
if (content != null && !content.isEmpty()) {
try {
return (String[]) mapper.readValue(content, String[].class);
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return null;
}
}
}
- 使用到的工具类 JsonUtils
package com.timothy.config;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.AnnotationUtils;
import java.io.OutputStream;
/**
*@author tzx
*/
public class JsonUtil {
private static Log log = LogFactory.getLog(JsonUtil.class);
private static ObjectMapper objectMapper = new ObjectMapper();
public static String stringify(Object object) {
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
public static String stringify(Object object, String... properties) {
try {
return objectMapper
.writer(new SimpleFilterProvider().addFilter(
AnnotationUtils.getValue(
AnnotationUtils.findAnnotation(object.getClass(), JsonFilter.class)).toString(),
SimpleBeanPropertyFilter.filterOutAllExcept(properties)))
.writeValueAsString(object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
public static void stringify(OutputStream out, Object object) {
try {
objectMapper.writeValue(out, object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public static void stringify(OutputStream out, Object object, String... properties) {
try {
objectMapper
.writer(new SimpleFilterProvider().addFilter(
AnnotationUtils.getValue(
AnnotationUtils.findAnnotation(object.getClass(), JsonFilter.class)).toString(),
SimpleBeanPropertyFilter.filterOutAllExcept(properties)))
.writeValue(out, object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public static <T> T parse(String json, Class<T> clazz) {
if (json == null || json.length() == 0) {
return null;
}
try {
return objectMapper.readValue(json, clazz);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
}
- 在controller提供接口测试