前言:每天学一点,记录美好生活
今天的学习可以说是一波三折,下面我将从MyBatis注解使用、MyBatis的xml使用、MyBatis的三剑客来总结自己的学习。
Mybatis注解使用
在未入手电商项目之前,我其实已经用过了很多次Mybatis的注解使用了,但今天的从0到1的学习,我收获不少。收获的不是说有多少精妙的知识点,而是一些我“常套用,却没记住的知识点” 在我的脑海中“翻新”了一遍,因为我以前老是觉得我理解了就行了,于是就忽略了多去敲敲代码,导致现在运用不及时,出现问题不明原因,有点后悔当初少犯错吧,好吧,感慨结束,回归总结。
总结:
1、导入mysql和mybatis依赖(导入的所有依赖不要乱配版本,sringboot的parent项目已经默认控制配好,如mysql通常不需要加版本)
2、配好 数据库的配置(推荐使用yml文件,url中加useSSL=false可以隐藏启动项目连接数据库时打印的warn)
3、写好实体类(规范java语法写法,变量名不要使用下划线“_”)
4、写好mapper接口(记得在接口上加@Mapper,或在Application上加@MapperScan(basePackages = “mapper所在的包”),sql语句一般用#{ }取值表“?”,${ }表去某个确定的值)
5、test测试执行。(如果执行成功,但有的字段明明数据库有具体的值,但却查询显示为null,那大概是你的数据库的字段为parent_id,而实体类为parentId,数据映射不行,但实体类写法是完全正确的,这就是驼峰写法,解决方案就是(以yml文件为例配置):
总结:
1、写好实体类(实体类就不用说了,接着使用上面的实体类学习、测试)
2、写好mapper接口(如接口:Category queryById (Integer id);没有sql语句了,这里和注解相比确实省事)
3、写好*.xml(xml一般放在resources目录下!如果是第一次学习,强烈建议纯手写,下面简单展示并说明)
1、红线以上部分的格式一般不变,注意无特别:encodeing=“UTF-8”
2、mapper标签的namespace填的是所对应xxxMapper的完整路径(注意一定要含包名)
3、sql标签这里表达的是抽取公共的语句部分,并加上id作为唯一表示。方便相应sql语句的复用,如下面select标签的select语句,使用 include 标签应用 sql 标签的公共语句。
4、select 标签的id对应的是mapper接口的方法名,resultType对应的是返回值的类型,也是要注意含完整包名。
一个最简单的用于select的xml就完成了!
但其实还没有能查询成功,这是直接test测试执行,肯定会报错!
总结我错的地方:没有配置xml的路径。因为xml存放的位置并不是约定好的,配置演示(以yml为例)
因为我的所有xml是放在resources目录下的mapper包下(mapper为自建的),所以是mapper-locations: classpath:mapper/*.xml
如果你在测试的过程中还有其他的错误的话,不要慌,看错误信息对应去代码里找错误,实在搞不了就粘贴错误提示到百度查查嘛。
Mybatis三剑客
这里主要先讲最重要的generator,和plugin,PageHelper先就不讲了,PageHelper以后等我用到在谈谈。
剑客generator我接触Mybatis这么久居然没有用过,可能是之前阅课无数但老师们都不教我吧,哈哈,我也没主动去学过,可以说是相见恨晚。如果你也没有用过剑客generator的话,相信你也是手写Mybatis吧,但你有没有发现这是一个繁琐又没什么技术含量的工作(大神说的,我不敢说哈哈),但这又是开发的必备工作(前提是你用Mybatis哈),所以就有了mybatis-generator这个东西,顾名思义:一个Mybatis的生成器。那generator可以生成什么呢?看下图:
红箭头所指的都是通过generator生成的,有dao层、pojo层、mapper层下的xml。
对,我们平时手写的代码,都已经自动生成好了,这就省去了我们很多的工作量。
但初次上手generator,我还是遇到了一些坑。
下面,简单说说generator的使用
1、导入generator的Maven依赖或plugin
做法一:导入dependency
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.7
做法二:导入plugin
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.7
2、在resources目录下新建generatorConfig.xml,然后在generatorConfig.xml里做一些配置
我的generatorConfig.xml(可参考对比:Mybatis Generator 配置详解)
参考对比一下,我的generatorConfig.xml少了很多的配置,但也是基本够用,你可以先看完我的基本略解(我不讲的一般是默认就好,具体看详解),有多余的精力再去看上面推荐的详解。
1、标签 classPathEntry: location的值是你存放数据库驱动jar包的绝对路径,所以你要先下一个jar包并放好位置。(为什么要这个数据库驱动包呢,你想,自动生成的依据是什么,是数据库的数据)
2、标签 plugin: 重新生成xml时覆盖之前的生成xml文件,不加该标签的话会导致重新生成的xml内容追加在原来已有的xml文件下。
3、标签 jdbcConnection:明显是连接数据库的配置,不在赘述。
4、标签 javaModelGenerator:配置生成的实体类的目标位置,targetPackage表示生成的实体类放在那个包下,targetProject表示当前项目的路径。
5、表示 sqlMapGenerator: 配置生成的sql的xml的目标位置,targetPackage和targetProject表达的意思在标签 javaModelGenerator时已经解释过。
6、标签 javaClientGenerator: javaClientGenerator就是java和数据库的通信层,自然就是生成dao层的接口,type="XMLMAPPER"表明生成的 接口与xml文件映射 的类型。(有没有能生成与注解映射的类型我还不清楚)
7、标签 table:tableName=“mall_order”,表明映射的是命名为 mall_order的数据表。domainObjectName="Order"表明生成的实体类的名字为Order,相应的生成Ordermapper、Ordermapper.xml,如果不加domainObjectName=“Order”,那就会生成MallOrder、MallOrdermapper、MallOrdermapper.xml,就是多了个前缀Mall,这可不是你想要的对吧。
8、其实生成的不仅是这三个,准确来说是4个,还有一个是以Example结尾的实体类,其实那就是用于分页的,但目前还不需要用到,可以在 table 标签上加上enableCountByExample=“false” enableDeleteByExample=“false” enableSelectByExample=“false” enableUpdateByExample=“false”
如下图最后的tables 标签,即可以阻止其的生成。
<generatorConfiguration>
<classPathEntry location="D:\downloads\mysql-connector-java-5.1.6.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3" >
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin">plugin>
<commentGenerator>
<property name="suppressAllComments" value="true"/>
commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://192.168.1.16:3308/mall?characterEncoding=utf-8"
userId="root"
password="123456">
jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
javaTypeResolver>
<javaModelGenerator targetPackage="com.imooc.mall.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.imooc.mall.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
javaClientGenerator>
<table tableName="mall_order" domainObjectName="Order" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>
<table tableName="mall_order_item" domainObjectName="OrderItem" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>
context>
generatorConfiguration>
3、在Terminal窗口或cmd命令窗口运行生成命令:mvn mybatis-generator:generate.
通常情况下,你就成功了!
但这个通常一般都不怎么不通常,啊哈哈。
我也是遇到了两个bug!
第一个报错:
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.913 s
[INFO] Finished at: 2018-09-11T22:37:47+08:00
[INFO] Final Memory: 26M/183M
[INFO] ------------------------------------------------------------------------
[ERROR] No plugin found for prefix 'mybatis-generator' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\Administrator\.m2\repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]
意思就是pom.xml文件中的没有添加mybatis插件。
我心想:我可太冤了啊,我明明添加了啊。
一查才发现,原来不是我的问题,是1.3.7这个版本自身有些bug,把命令改成:
mvn org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate
就好了。
但,又来了。。。
第二个报错:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.176 s
[INFO] Finished at: 2020-02-10T17:20:36+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (default-cli): Goal requires a project to execute but there is no POM in this directory (D:\). Please verify you invoked Maven from the correct directory. -> [Help 1]
意思是:启动项目的时候,所在的目录下没有pom.xml
本来很简单就能解决的了,但我没看清楚错误信息,直接复制粘贴上网查,试了很多种方法,还是没有解决,搞了一下午,细看才发现我和那些博主的错误前半段是一样的,但后半段并不一样,也就是实际错误不同,最后我直接复制后半段查找,才找到了解决的方法。
解决方法:先进入pom.xml所在的目录,再执行 报错一 后修改的命令。
剑客generator就先告一段落了,之后有新的知识点或技巧,我会继续分享的。
下面讲讲剑客mybatis-plugin,这个就是把插件安装好然后重启就得了,轻松简单。但mybatis-plugin已经开始收费了,所以这里推荐使用的是Free-mybatis-plugin,看名字就知道为什么了是吧,而且也完全可以实现mybatis-plugin的效果。
mybatis-plugin的作用就是跳转。我就不多赘述了。可参考:Free Mybatis plugin跳转插件