mybatis 通用mapper,generator代码生成器,generator 生成 lombok(开发工具:idea,配置:application.properties)

一个人想着一个人 提交于 2020-08-13 09:12:57

相关文档: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);
	}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!