使⽤mybatis-generator插件结合tk.mybatis⾃动⽣成mapper⼆三事本篇⽂章将介绍使⽤spring boot框架,引⼊mybatis-generator插件,结合tk.mybatis⾃动⽣成Mapper和Entity的⼀整套流程,其中包括最重要的踩坑与填坑。⼀、基建
演⽰⽤数据库
初始spring boot项⽬
⼆、主⾓登场
1.在l中引⼊mybatis-generator插件。注意,这⾥我使⽤的是tk.mybatis.所以需要引⼊相应的依赖。并添加mapper接⼝
1<dependency>
2<groupId&batis</groupId>
3<artifactId>mapper-spring-boot-starter</artifactId>
4<version>2.0.2</version>
5</dependency>
1package com.tk;
2
batis.mappermon.Mapper;
batis.mappermon.MySqlMapper;
5
6public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
7 }
configurationFile节点配置了⽣成mapper、entity所需的配置⽂件,所以我们需要在相应的位置添加l配置⽂件。
1
2<plugin>
3<groupId&ator</groupId>
4<artifactId>mybatis-generator-maven-plugin</artifactId>
5<version>1.3.5</version>
6<configuration>
7<configurationFile>${basedir}/src/main/l</configurationFile>
8<overwrite>true</overwrite>
9<verbose>true</verbose>
10</configuration>
11<dependencies>
12<dependency>
13<groupId>mysql</groupId>
14<artifactId>mysql-connector-java</artifactId>
15<version>${mysql.version}</version>
16</dependency>
17<dependency>
18<groupId&batis</groupId>
19<artifactId>mapper</artifactId>
20<version>3.4.4</version>
21</dependency>
22</dependencies>
23</plugin>
2.添加l⽂件。⽂件位置要与l中配置的路径⼀致。关于该配置⽂件各个配置节点的含义和⽤途,⽂章末尾有详细解释。
配置⽂件⼀开始引⼊了jdbc.properties数据库连接配置⽂件,所以需要在resources⽂件夹下添加该配置⽂件。
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE generatorConfiguration
3 PUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN"
4 "/dtd/mybatis-generator-config_1_0.dtd">
5
6<generatorConfiguration>
7<!-- 引⼊数据库连接配置 -->
8<properties resource="jdbc.properties"/>
9
10<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
11<property name="beginningDelimiter" value="`"/>
12<property name="endingDelimiter" value="`"/>
13
14<!-- 配置 tk.mybatis 插件 -->
15<plugin type="tk.ator.MapperPlugin">
16<property name="mappers" value="com.tk.MyMapper"/>
17</plugin>
18
19<!-- 配置数据库连接 -->
20<jdbcConnection
21driverClass="${jdbc.driverClass}"
22 connectionURL="${tionURL}"
23 userId="${jdbc.username}"
24 password="${jdbc.password}">
25</jdbcConnection>
26
27<!-- 配置实体类存放路径 -->
28<javaModelGenerator targetPackage="com.senda.hello.ity" targetProject="src/main/java"/>
29
30<!-- 配置 XML 存放路径 -->
31<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
32
33<!-- 配置 DAO 存放路径 -->
34<javaClientGenerator
35targetPackage="com.senda.hello.spring.boot.mapper"
36 targetProject="src/main/java"
37 type="XMLMAPPER"/>
38
39<!-- 配置需要指定⽣成的数据库和表,% 代表所有表 -->
40<table catalog="dbtest" tableName="%">
41<!-- mysql 配置 -->
42<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
43</table>
44</context>
45</generatorConfiguration>
3.添加jdbc.properties数据库连接配置⽂件。需要注意的是mysql8.0之后,driverClass的包名有变化。
1 jdbc.sql.jdbc.Driver
2 #8.0之后:jdbc.sql.cj.jdbc.Driver
tionURL=jdbc:mysql://127.0.0.1:3306/dbtest?useUnicode=true&characterEncoding=utf-8&useSSL=false
4 jdbc.username=root
5 jdbc.password=root
4.经过上述步骤后,⼯程结构如下图所⽰。
5.万事俱备,⾃动构建,启动。双击mybatis-generator插件下的mybatis-generator:generate指令,开始⾃动构建。构建完成后,项⽬中就多了entity、dao、mapper,美滋滋
啊!
6.现在简单查⼀查数据库,看这玩意⼉好不好使。这⾥我使⽤的是阿⾥巴巴的的druid,所以需要引⼊相关依赖。
1<dependency>
2<groupId>com.alibaba</groupId>
3<artifactId>druid-spring-boot-starter</artifactId>
4<version>1.1.10</version>
5</dependency>
6<dependency>
7<groupId>mysql</groupId>
8<artifactId>mysql-connector-java</artifactId>
9</dependency>
并在l配置⽂件中添加相关的配置,包括druid和mybatis。
1 spring:
2 datasource:
3 druid:
4 url: jdbc:mysql://127.0.0.1:3306/dbtest?useUnicode=true&characterEncoding=utf-8&useSSL=false
5 username: root
6 password: root
7 initial-size: 1
8 min-idle: 1
9 max-active: 20
10 test-on-borrow: true
11 driver-class-name: sql.jdbc.Driver
12 #MySQL 8.x: driver-class-name: sql.cj.jdbc.Driver
13
14 mybatis:
15 type-aliases-package: com.senda.hello.ity
16 mapper-locations: classpath:mapper/*.xml
还需要在启动类加上MapperScan注解,指明Dao的位置。注意这⾥引⼊的是tk包下的MapperScan。
1package com.senda.hello.batis;
2
3import org.springframework.boot.SpringApplication;
4import org.springframework.boot.autoconfigure.SpringBootApplication;
batis.spring.annotation.MapperScan;
6
7 @SpringBootApplication
8 @MapperScan(basePackages = "com.senda.hello.spring.boot.mapper")
9public class HelloSpringBootMybatisApplication {
10
11public static void main(String[] args) {
12 SpringApplication.run(HelloSpringBootMybatisApplication.class, args);
13 }
14
15 }
写个测试⽅法,玩⼀玩吧!注意要在SpringBootTest注解⾥注明测试类,为了加载配置⽂件。
1package com.senda.hello.batis;
2
3import com.senda.hello.spring.boot.mapper.TbUserMapper;
4import com.senda.hello.ity.TbUser;
5import org.junit.Test;
6import org.junit.runner.RunWith;
7import org.springframework.beans.factory.annotation.Autowired;
8import org.st.context.SpringBootTest;
9import st.context.junit4.SpringRunner;
10
11import java.util.List;
12
13 @RunWith(SpringRunner.class)
14 @SpringBootTest(classes = HelloSpringBootMybatisApplication.class)
15public class HelloSpringBootMybatisApplicationTests {
16
17 @Autowired
18private TbUserMapper userMapper;
19
20 @Test
21public void testSelect() {
22 List<TbUser> userList = userMapper.selectAll();
23for (TbUser user : userList)
24 System.out.Loginname());
25 }
26
27 }
运⾏测试类,Oops!报错了发现SQL语句错了,数据库和表名字中间多了⼀个点。肿么肥四。搞了这么⼤半天,你跟我说⽤不了吗?
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: ptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.tb_ ### The error may exist in com/senda/hello/spring/boot/mapper/TbUserMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT uid,loginname,loginpass,email,status,activationCode b_user
### Cause: ptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.tb_user' at line 1
; bad SQL grammar []; nested exception ptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL synta
x; check the manual that corresponds to your MySQL server version for the right syntax to use nea 遇到问题,要解决啊打开⽣成的TbUser实体类,我们惊讶的发现,table的名字竟然多了⼀个点。赶紧删除,再运⾏测试⽅法。bingo,完美运⾏,问题解决了。
三、分析问题
问题真的解决了么?真正的项⽬,动辄⼏⼗、⼏百张表的,难道要⼀个个删点么?⼈家这么成熟的插件,难道会烦这么低级的错误?因为Entity、Dao、mapper都是根据l⽂件来⽣成的。所以,只可能是这个配置⽂件那⾥配错了。那么到底是那⾥配错了呢?
1.⾸先,我们需要知道,database、schema、catalog三者的联系与区别。
按照SQL标准的解释,在SQL环境下Catalog和Schema都属于抽象概念,可以把它们理解为⼀个容器或者数据库对象命名空间中的⼀个层次,主要⽤来解决命名冲突问题。从概念上说,⼀个数据库系统包含多个Catalog,每个Catalog⼜包含多个Schema,⽽每个Schema⼜包含多个数据库对象(表、视图、字段等),反过来讲⼀个数据库对象必然属于⼀个Schema,⽽该Schema⼜必然属于⼀个Catalog,这样我们就可以得到该数据库对象的完全限定名称从⽽解决命名冲突的问题了;例如数据库对象表的完全限定名称就可以表⽰为:Catalog名称.Schema名称.表名称。这⾥还有⼀点需要注意的是,SQL标准并不要求每个数据库对象的完全限定名称是唯⼀的,就象域名⼀样,如果喜欢的话,每
个IP地址都可以拥有多个域名。
MySQL 5.5的官⽅⽂档是这么说的:
CREATE DATABASE creates a database with the given name.
To use this statement, you need the CREATE privilege for the database.
CREATE SCHEMA is a synonym for CREATE DATABASE.
[译]
CREATE DATABASE根据给定的名称创建数据库。
你需要拥有数据库的CREATE权限来使⽤这个语句。
CREATE SCHEMA是CREATE DATABASE的⼀个代名词。
也就是说,在MySQL中,schema和database是同⼀个玩意⼉。⽽MySQL⼜不⽀持catalog,所以,我们平常看到的MySQL数据库对象表的完全限定名称是:database.table.
下⾯给出常⽤数据库对catalog、schema的⽀持情况:
供应商Catalog⽀持Schema⽀持
Oracle不⽀持Oracle User ID
MySQL不⽀持数据库名
MS SQL
Server数据库名对象属主名,2005版开
始有变
DB2指定数据库对象时,Catalog
部分省略
Catalog属主名
Sybase数据库名数据库属主名
Informix不⽀持不需要
PointBase不⽀持数据库名
2.好了,回归我们的问题。有了上述背景知识,我们就可以快速定位l⽂件配置错误的地⽅了。在table节点,我们配置了catalog属性为database名称。现
在⼀眼就知道配置错了,⽆中⽣有,删掉该属性。
为了保险起见,我们还要在jdbcConnection节点中添加属性,申明当前数据库不⽀持catalog。
<property name="nullCatalogMeansCurrent" value="true"/>
3.现在让我们重新运⾏命令,⽣成Entity、Dao、mapper,⽣成成功后,看看TbUser的table注解,已经变成了表名字了。在运⾏下测试类,完美还说啥,直接开花就
完事⼉。
、
springboot是啥四、附录
完整的l配置及属性注解。
1<xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE generatorConfiguration
3 PUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN"
4"/dtd/mybatis-generator-config_1_0.dtd">
5<!-- 配置⽣成器 -->
6<generatorConfiguration>
7<!-- 可以⽤于加载配置项或者配置⽂件,在整个配置⽂件中就可以使⽤${propertyKey}的⽅式来引⽤配置项
8 resource:配置资源加载地址,使⽤resource,MBG从classpath开始,⽐如com/myproject/generatorConfig.properties
9 url:配置资源加载地质,使⽤URL的⽅式,⽐如file:///C:/myfolder/generatorConfig.properties.
10注意,两个属性只能选址⼀个;
11
12另外,如果使⽤了mybatis-generator-maven-plugin,那么在l中定义的properties都可以直接在l中使⽤
13<properties resource="" url="" />
14-->
15
16<!-- 在MBG⼯作的时候,需要额外加载的依赖包
17 location属性指明加载jar/zip包的全路径
18<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
19-->
20
21<!--
22 context:⽣成⼀组对象的环境
23 id:必选,上下⽂id,⽤于在⽣成错误时提⽰
24 defaultModelType:指定⽣成对象的样式
25 1,conditional:类似hierarchical;
26 2,flat:所有内容(主键,blob)等全部⽣成在⼀个对象中;
27 3,hierarchical:主键⽣成⼀个XXKey对象(key class),Blob等单独⽣成⼀个对象,其他简单属性在⼀个对象中(record class)
28 targetRuntime:
29 1,MyBatis3:默认的值,⽣成基于MyBatis3.x以上版本的内容,包括XXXBySample;
30 2,MyBatis3Simple:类似MyBatis3,只是不⽣成XXXBySample;
31 introspectedColumnImpl:类全限定名,⽤于扩展MBG
32-->
33<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple">
34
35<!-- ⾃动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
36⼀般保留默认值,遇到数据库关键字(Java关键字),使⽤columnOverride覆盖
37-->
38<property name="autoDelimitKeywords" value="false"/>
39<!-- ⽣成的Java⽂件的编码 -->
40<property name="javaFileEncoding" value="UTF-8"/>
41<!-- 格式化java代码 -->
42<property name="javaFormatter" value="ator.api.dom.DefaultJavaFormatter"/>
43<!-- 格式化XML代码 -->
44<property name="xmlFormatter" value="ator.api.dom.DefaultXmlFormatter"/>
45
46<!-- beginningDelimiter和endingDelimiter:指明数据库的⽤于标记数据库对象名的符号,⽐如ORACLE就是双引号,MYSQL默认是`反引号; --> 47<property name="beginningDelimiter" value="`"/>
48<property name="endingDelimiter" value="`"/>
49
50<!-- 必须要有的,使⽤这个配置链接数据库
51 @TODO:是否可以扩展
52-->
53<jdbcConnection driverClass="sql.jdbc.Driver" connectionURL="jdbc:mysql:///pss" userId="root" password="admin">
54<!-- 这⾥⾯可以设置property属性,每⼀个property属性都设置到配置的Driver上 -->
55</jdbcConnection>
56
57<!-- java类型处理器
58⽤于处理DB中的类型到Java中的类型,默认使⽤JavaTypeResolverDefaultImpl;
59注意⼀点,默认会先尝试使⽤Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型;
60-->
61<javaTypeResolver type="pes.JavaTypeResolverDefaultImpl">
62<!--
63 true:使⽤BigDecimal对应DECIMAL和 NUMERIC数据类型
64 false:默认,
65 scale>0;length>18:使⽤BigDecimal;
66 scale=0;length[10,18]:使⽤Long;
67 scale=0;length[5,9]:使⽤Integer;
68 scale=0;length<5:使⽤Short;
69-->
70<property name="forceBigDecimals" value="false"/>
71</javaTypeResolver>
72
73
74<!-- java模型创建器,是必须要的元素
75负责:1,key类(见context的defaultModelType);2,java类;3,查询类
76 targetPackage:⽣成的类要放的包,真实的包受enableSubPackages属性控制;
77 targetProject:⽬标项⽬,指定⼀个存在的⽬录下,⽣成的内容会放到指定⽬录中,如果⽬录不存在,MBG不会⾃动建⽬录
78-->
79<javaModelGenerator targetPackage="com._batis.domain" targetProject="src/main/java">
80<!-- for MyBatis3/MyBatis3Simple
81⾃动为每⼀个⽣成的类创建⼀个构造⽅法,构造⽅法包含了所有的field;⽽不是使⽤setter;
82-->
83<property name="constructorBased" value="false"/>
84
85<!-- 在targetPackage的基础上,根据数据库的schema再⽣成⼀层package,最终⽣成的类放在这个package下,默认为false -->
86<property name="enableSubPackages" value="true"/>
87
88<!-- for MyBatis3 / MyBatis3Simple
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论