相关文档:https://github.com/abel533/Mapper
目前在持久层框架上有 MyBatis 和 Spring Data JPA 两个选择, MyBatis 应用比较广泛,特别灵活,但是写映射文件比较繁琐。使用Generator后,一般的代码模板都是能够自动生成的,需要手写的部分比较少,加上通用mapper后就更加方便了。 Spring Data JPA 用起来比较简单,而且与 Spring Boot 整合起来非常好用。
以下代码github地址:https://github.com/LiWang1314/demo
一.pom.xml 新增
<!--通用Mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.14</version>
</dependency>
<!-- Mybatis Generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</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>8.0.14</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
</plugin>
注意:
1:mysql5用的驱动url是com.mysql.jdbc.Driver,mysql6以后用的是com.mysql.cj.jdbc.Driver。版本不匹配便会报驱动类已过时的错误。我的为mysql8
2:如果报下面的错:
The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
原因是没有指定时区jdbc:mysql://localhost:3306/**?serverTimezone=GMT%2B8
二.定义自己的基础接口,也可以不定义。会影响generatorConfig.xml中的配置,和生成mapper接口(dao层)默认继承的父类,application.properties中的 mapper.mappers配置
1:如果定义自己的基础接口,则generatorConfig.xml中的对应的配置
<property name="mappers" value="com.example.transfer.mappers.MyMapper"/>
生成的mapper接口(dao层)则默认继承MyMapper接口
特别注意:如果你定义了一个自己的基础接口,该接口不能被扫描到,否则会出错
定义自己的基础接口:
package com.example.transfer.mappers;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/*
Mapper接口:基本的增、删、改、查方法
MySqlMapper:针对MySQL的额外补充接口,支持批量插入
*/
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {
}
2.反之:<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
三.在resources目录下->创建generator目录->创建generatorConfig.xml
注意: mappers的value值配置的对应的接口地址
,生成的 Mapper 接口都会自动继承上该接口
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包 C:\Users\wang\.m2\repository\mysql\mysql-connector-java\8.0.13\mysql-connector-java-8.0.13.jar C:\Users\wang\.m2\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar-->
<!-- <classPathEntry location="C:\Users\wang\.m2\repository\mysql\mysql-connector-java\8.0.13\mysql-connector-java-8.0.13.jar"/>-->
<!--
context:生成一组对象的环境
id:必选,上下文id,用于在生成错误时提示
defaultModelType:指定生成对象的样式
1,conditional:类似hierarchical;
2,flat:所有内容(主键,blob)等全部生成在一个对象中;
3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)
targetRuntime:
1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
introspectedColumnImpl:类全限定名,用于扩展MBG
-->
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--
caseSensitive 是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,会生成 @Table(name = "USER") 注解,否则使用小写 user 时会找不到表。
forceAnnotation 是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table 和 @Column)。
beginningDelimiter 和 endingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。
useMapperCommentGenerator 是否使用通用 Mapper 提供的注释工具,默认 true 使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false 后会用默认的,或者你可以配置自己的注释插件。
generateColumnConsts 在生成的 model中,增加字段名的常量,便于使用 Example 拼接查询条件的时候使用。
lombok 增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true) 四类注解, 使用者在插件配置项中增加 <property name="lombok" value="Getter,Setter,ToString,Accessors"/> 即可生成对应包含注解的 model 类。
-->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.example.transfer.mappers.MyMapper"/>
<!--<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>-->
<property name="caseSensitive" value="true"/>
<!--<property name="lombok" value="Getter,Setter,ToString"/>-->
</plugin>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<!--
true:使用BigDecimal对应decimal(小数)和 numeric(数字)数据类型
false:默认,
scale>0;length>18:使用BigDecimal;
scale=0;length[10,18]:使用Long;
scale=0;length[5,9]:使用Integer;
scale=0;length<5:使用Short;
-->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- java模型创建器,是必须要的元素
负责:1,key类(见context的defaultModelType);2,java类;3,查询类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="com.example.transfer.entity" targetProject="src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.transfer.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="fs" domainObjectName="FS" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
<!--
enableInsert(默认true):指定是否生成insert语句;
enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get);
enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句;
enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update);
enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete);
enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句;
enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询);
enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性);
-->
</generatorConfiguration>
四.开始生成(ide右边栏,如果找不到则点击工具栏view ,选中 tool buttons即可):
注意:如果需要生成model的时候生成lombok的注解,需要在generatorConfig.xml中添加<property name="lombok" value="Getter,Setter,ToString,Accessors"/>配置,并且在pom.xml中添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
idea lombok不生效问题请参考:https://blog.csdn.net/lwang_IT/article/details/83016597
六.生成结果
mapper接口(dao层)
package com.example.transfer.dao;
import com.example.transfer.entity.FS;
import com.example.transfer.mappers.MyMapper;
public interface FSMapper extends MyMapper<FS> {
}
还有对应的实体类
package com.example.transfer.entity;
import java.util.Date;
import javax.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Table(name = "fs")
public class FS {
@Id
private Integer id;
/**
* 店名
*/
private String name;
/**
* 省
*/
@Column(name = "state_id")
private Integer stateId;
}
.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.example.transfer.dao.FSMapper">
<resultMap id="BaseResultMap" type="com.example.transfer.entity.FS">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="state_id" jdbcType="INTEGER" property="stateId" />
</resultMap>
</mapper>
注意:通用mapper还不能满足全部的数据库操作,一般还需要其他的自定义方法。在接口中添加其他方法的时候和只用 MyBatis 是完全一样的,但是需要注意,在对应的 XML 中,不能出现和继承接口中同名的方法!
比如我们要增加一个自己的的方法则:
.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.example.transfer.dao.FSMapper">
<resultMap id="BaseResultMap" type="com.example.transfer.entity.FS">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="state_id" jdbcType="INTEGER" property="stateId" />
</resultMap>
<insert id="insertA" parameterType="FS">
INSERT INTO `fs`( `name`) VALUES (#{name});
</insert>
</mapper>
mapper接口(dao层)
package com.example.transfer.dao;
import com.example.transfer.entity.FS;
import com.example.transfer.mappers.MyMapper;
public interface FSMapper extends MyMapper<FS> {
int insertA(FS fs);
}
七.application.properties新增
#通用mapper的所在接包名接口名称
mapper.mappers=com.example.transfer.mappers.MyMapper
#如果没有自定义基础类
#mapper.mappers=tk.mybatis.mapper.common.Mapper
#数据库
mapper.identity=MYSQL
mybatis.typeAliasesPackage=com.example.transfer.entity
mybatis.mapperLocations=classpath:mybatis/mapper/*Mapper.xml
#打印sql
logging.level.com.example.transfer.dao=debug
八.运行
在启动类上扫描mapper接口(dao层)
@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.example.transfer.dao")
调用:
@RequestMapping(value="test.do")
@ResponseBody
public void Test(){
//通用
List list=fsMapper.selectAll();
log.info("size:"+list.size());
FS fs=new FS();
fs.setName("姓名");
//自己
int addCount=fsMapper.insertA(fs);
log.info("测试添加"+addCount);
}
来源:oschina
链接:https://my.oschina.net/u/4367225/blog/4462553