前两篇:
Idea+Maven+springboot+Mybatis 创建web项目教程(1):环境搭建与配置
Idea+Maven+springboot+Mybatis 创建web项目教程(2)集成Mybatis
上一节已经装好了mysql,现在我们来创建项目需要的数据库文件,然后再回到 mybatis-generator.xml 里面配置。
一、创建项目需要的数据库
打开navicat进行操作。
新建一个数据库:
字符集的编码,是utf8mb4的兼容性更好,官网文档关于这两个字符集是这么说的:
意思是,utf8mb3字符集已弃用,将在以后的MySQL版本中删除。建议改用utf8mb4,尽管utf8目前是utf8mb3的别名,但在某些情况下,utf8将成为utf8mb4的引用。为了避免对utf8的含义产生歧义,可以考虑为字符集引用显式指定utf8mb4,而不是utf8。
(忽略我的内容。自己按需进行
二、配置mybatis-generator.xml
模板可以从官网查看,一般有些可选元素不需要,可以删除掉,每一个元素的作用基本能做到见名知义,详细的介绍官网也有,可以自行翻译。
针对这个练习,进行的修改如下,也就是一些常用的元素。
1.修改 jdbcConnection 元素里的内容:
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/miaosha?serverTimezone=GMT%2B8&useSSL=false"
userId="root"
password="19970910">
</jdbcConnection>
对于这个元素不用多说,是数据库链接和驱动的相关信息,需要注意的是,到 mysql6.0 之后,写法有区别,mysql8 的驱动名称有修改,
不是com.mysql.jdbc.Driver 而是 com.mysql.cj.jdbc.Driver,Driver记得大写。
其中 localhost:3306 是因为链接本地的数据库,miaosha 是数据的名字,问号及后面是指定的额外信息,这个似乎是新版本的 mysql 必须的,不然会有别的问题。(另外,不能用&链接,需要分号结尾,搜索了一下,要把 & 替换成 & )
2.修改javaModelGenerator元素里的内容:
<javaModelGenerator targetPackage="com.miaoshaproject.dataobject" targetProject="src/main">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
这个元素是用于定义 JavaModelGenerator 的属性。javaModelGenerator 会创建与内省表匹配的主键类、记录类和按示例查询类( primary key classes, record classes, and Query by Example classes)。或者说就是,我们数据库对应到 java 的对象的类。所以他就是DataObject。
那我们先把对应的路径创建出来:
然后,在 javaModelGenerator 里指定 targetPackage,就是目标路径:
也就是说,把数据库里面的表,会分别创建出Object,并且生成在我们指定的这个dataobject 路径下面。
3.sqlMapGenerator修改
<!--生成映射文件的存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
因为上一节里面,application.properties 里面我们已经设定了所有相关的 mybatis 的mapper 存放的路径,是一个mapping文件夹,而且已经创建出来了,这个元素的作用和上一个类似,会和数据库的表对应生成映射,里面会有模板 sql 之类的。
所以这里,就修改 targetPackage 和对应的 targeProject 为对应的路径。
4.元素
ava客户机生成器构建Java接口和类,以便轻松使用生成的 Java 模型和 XML 映射文件。对于MyBatis,生成的对象采用映射器接口的形式。
先创建一个dao文件夹:
<javaClientGenerator type="XMLMAPPER" targetPackage="com.miaoshaproject.dao" targetProject="src/main">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
然后设置生成 dao 类后的存放位置,type 可选类型有多种,默认的是 XMLMAPPER,会生成 SQLMAP 的 xml 文件和独立的 Mapper 接口。
5.元素
根据对应表名生成类名
<table tableName="user_info" domainObjectName="UserDO" ></table>
<table tableName="user_password" domainObjectName="UserPasswordDO"></table>
tableName 属性指定了数据库对应的表名,domainObjectName 指定生成的映射的类叫UserDO 和 UserPasswordDO。
三、使用命令让mybatis自动生成映射
点击运行 – 左上角加号新建一个maven
在命令行的框里输入:
mybatis-generator:generate
这行命令就会解析我们的POM文件指定的一个mybatis的插件,并且执行。
然后点击确定。
然后run一下这个命令。
因为我们使用的mybatis自动生成器这个插件本地没有,所以执行命令后,maven首先会自动下载,稍等一会。
开始执行之后可能会报错:
Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate (default-cli) on project miaosha: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.5:generate failed: Exception getting JDBC Driver
意思就是获取jdbc驱动异常了。网上搜了一下,因为目前为止,我的mysql装的是8.0,按理来说,对应的mysql-connector-java是指定的5.1没问题,但是找不到别的方法,在想是不是版本,于是去pom.xml
将两处的mysql-connector-java都换成了8.0.15版本并刷新让maven重新下载。
再重新运行命令:
发现成功了,也就是mybatis的生成器帮我们生成了指定的,对应我们的数据库的所有表里面内容,生成了DO文件,DOmapper映射文件都是java,以及xml文件。
在目录里面查看:
(问题很大,可以看到这些东西都是新出现的。然而,目录怎么不对呢?
我们指定的com.miaoshaproject下面根本没有对应的文件,而是直接重新建了层级目录。。。
回到mybatis-generator.xml里面,发现上面的 几个生成器元素里面 的 targetPackage没写对。
提醒大家,targetProject和targetPackage目录一定要写完整和正确。
正确之后,比如打开UserDOMapper.xml
可以看到:
指定的 column 名以及对应的类型都是和数据库里创建表格时候是一样的,而且还帮我们生成了 property 属性;
另外,在下面还有一个 id 为 “ Example_Where_Clause ”的查询示例模板,下面有select、update、insert等等的模板,也就是说冗余的很多CRUD语句,这个 mybatis 的自动生成器已经帮我们做了。
又比如我们打开一个UserDO这个Object类:
对应数据库的表格的字段,生成了对应的Bean类和方法。
注意:
我们指定的时候,应该是两张表去自动生成,对应应该是有xml文件两份,数据类两份,以及映射的类两份。但是在dataoobject里却多出来了两个,分别是两个数据object对应的Example类。
随便打开一个Example类,可以看到有七百多行代码,里面是各种情况的复杂查询的组合,都是sql语句,
但是大部分情况下我们都用不到,而且很复杂的查询也愿意自己写,而不是使用他自动生成的示例
,因此我们在generator.xml文件中,table的元素中加上一些属性,这样能在生成的时候指定把这些我们不需要的东西去掉。
可以修改 table 元素里的属性
<!--生成对应表和类名-->
<table tableName="user_info" domainObjectName="UserDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
<table tableName="user_password" domainObjectName="UserPasswordDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
然后我们重新运行一下mybatis的generator命令。
虽然对应的类还在,但是点进xml文件里面,可以看到,对应的示例查询语句已经是一些很简单的查询语句。那么我们就可以手
动把那两个Example.java文件删除
掉,不会产生影响。
四、接入数据源
使用springboot的数据源配置方式。
在我们的application.properties文件里面加上:
#配置数据源spring.datasource.name=miaoshaspring.datasource.url=jdbc:mysql://localhost:3306/miaoshaspring.datasource.username=rootspring.datasource.password=19970910#使用阿里的druid数据源做具体操作spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
现在去APP哪个java文件来做一些修改:
1.为了让springboot先去扫描mybatis的一些配置文件(daomapper),我们更改 @EnableAutoConfiguration 注解为:
@SpringBootApplication
和之前的Enable注解的功能差不多。
2.在下面写入一个简单的逻辑,调查询之后,从DO这个类里面就可以用select方法获取对应的值(整个把数据库和后端串起来了已经,如果没有springboot这是一个很漫长的过程)
注解什么的我现在还不会,也没学,下面代码可以直接copy,然后运行。
@SpringBootApplication(scanBasePackages = {"com.miaoshaproject"})
@RestController
@MapperScan("com.miaoshaproject.dao")
public class App
{
@Autowired
private UserDOMapper userDOMapper;
//次注解和springmvc一致,表示用户访问根目录的时候,输出一个helloworld
@RequestMapping("/")
public String home(){
UserDO userDO=userDOMapper.selectByPrimaryKey(1);
if(userDO==null){
return ("用户对象不存在");
}else{
return userDO.getName();
}
}
public static void main( String[] args )
{
System.out.println( "Hello World!" );
SpringApplication.run(App.class,args);
}
}
运行之后打开浏览器,输入localhost的网址:
没问题,数据库建好之后还没有数据,所以他显示了正确的内容。
虽然成功了,但是我的项目中存在两个遗留问题。
1.创建一个User对象的时候,IDEA提示:
但是可以正常运行,网上搜了一堆答案,有些就是复制粘贴,问题没解决,也没人说为什么,我暂且空着这个问题
2.启动过程中控制台输出了一些奇怪的东西:
网上说是因为jdk和mybatis的匹配问题,我用的是jdk11,如果是jdk8及以下则没有这个问题。