用了一年多mybatis。一直惧怕于mybatis的配置文件的繁琐和各种限制。但是因为明天面的公司看起来像是mybatis。所以这里简单的做了个demo。
然后深感于人的健忘性。。我全程看别的的教程,一步一对照的才终于跑起来。简单记录一下,以后自己忘记了也可以看看。
框架搭建
这里还有个小故事,我笔记本用手机热点,所以导包是个大问题。远程的朋友的电脑完成的(为了面试也很拼啊)。
然后spring boot基本框架。
导包
这里说一下,mybatis的分页是有专门插件的(宣扬一波jpa,自带插件),不过因为我只实现了增删改查简单功能,所以并没有倒mybatis分页的依赖。上面两个是mybatis必须引用的,后两个是插件,自己看情况吧
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
包的层次结构
贼拉可惜我写这个文的时候已经关了远程。所以只能用文件结构来说明了(个人色彩很浓,建议酌情考虑或者不考虑)
我一直以来的习惯.controller,service,entity(叫model也可以,看你习惯。我一直觉得这个又不是明文规定的。),dao,(正常还应该有个工具类不过是我demo,就懒得弄了),还有个启动类。然后配置文件的结构正常应该是mapper是文件夹,里面是我们的各种表的mapper。但是我demo只有一个表,所以
Mybatis的简单使用
首先我这里根据步骤来写,省的有落下的。
- 配置数据源。
直接上我的配置吧。这块有个注意点:最下面的映射文件的位置,因为是直接写在resource下面了,所以这里也这么配置的。但如如果正常情况下应该mapper文件下下面的。(之前粗略的看了下,还有很多有必要或者有用的配置,不过我觉得都没写。重申N次,我这里就是实现crud的简单demo)
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=ROOT
spring.datasource.password=ROOT
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.typeAliasesPackage=demo.entity
mybatis.mapperLocations=classpath:mapper.xml
#mybatis.mapperLocations=classpath:mapper/*.xml
- 建立实体和dao层
这个其实挺神奇的,因为实体和dao都没有什么注释(忍不住又要和jpa比较了。jpa虽然有自动生成表。但是各种注解。。啧啧)。据说mybatis有自动生成实体的插件。但是我之前简单看了下,还要导包还要配置的。所以我这里暂时放弃了。
然后手敲了实体类。据说这里字段名不一致可以在映射文件里建立关联。不过我没那么大挑战精神。就是跟数据一致的创建了实体。
package demo.entity;
public class Demo {
int id;
int age;
String nick;
String name;
String tel;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public Demo() {
super();
}
}
除了前五行手敲后面的get/set和构造器都是生成的。其实也没想的那么麻烦。然后啥注解都没有。
接下来的dao层。(习惯性这么命名了。我看demo上mybatis的方法名字不用映射的,叫啥都可以)
package demo.dao;
import demo.entity.Demo;
public interface DemoDao {
Demo findById(int id);
Demo findByName(String name);
}
- 配置mapper文件
然后mapper文件是xml格式的。我其实就做了几个测试。不过看了一个帖子说的不错,推给大家 Mapper映射文件
然后我是看了一个demo,又看的这个帖子,所以两个查询有一丢丢区别。就是返回值类型。我觉得第一种麻烦一点,但是应该也灵活一点吧。mybatis的非映射字段的处理?我真觉得一个框架用久了会产生依赖。哎
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
-<mapper namespace="demo.dao.DemoDao">
-<resultMap type="demo.entity.Demo" id="demoMap">
<result column="id" property="id"/>
<result column="age" property="age"/>
<result column="name" property="name"/>
<result column="nick" property="nick"/>
<result column="tel" property="tel"/>
</resultMap>
<!--这种返回的是resultMap。然后如果表的字段和你对象的属性不同可以这么用。还有查询出来的选择性的获取可以这么用?反正应该有别的用法,但是我没想到-->
<select id="findById" parameterType="int" resultMap="demoMap">SELECT * FROM demo where id = #{id} </select>
<!--这个是第二种,直接返回实体。-->
<select id="findByName" parameterType="String" resultType="demo">SELECT * FROM demo where name = #{name} </select>
</mapper>
- 注意事项
你以为到这就完了么?我当时就傻了吧唧的做完映射就跑起来了,果不其然的报错了。因为少了一个注释。
接下来我们要在启动类上面添加一个扫描的注解:
@MapperScan("demo.dao")
到这里你可以尝试着跑了!反正我是没跑通。因为一开始我的配置文件是这么写的
<select id="findById" parameterType="int" resultMap="demoMap">SELECT * FROM Demo where id = #{id} </select>
我不知道大家看出有什么区别了没。。是表名!因为众所周知的数据库不区分大小写。但是,我刚刚因为这个问题查了一下。因为我数据库连接的是服务器的数据库,所以改了以后正常跑起来了。
如果你是单纯看demo怎么做的,到这里就可以收藏或者×了。因为以下讲的都是废话。
题外话
其实对于mybatis,真的很久不用,说是一点也不会确实是有点印象。说是会啥问题都得百度。
然后这个demo我就简单的实现了查询,增加的功能。删除和修改大同小异,没有特意实现。但是关联查询复杂查询什么的我都还没做。看了一些网上的教程,觉得整体来看,三点没有特别明白。
- 参数大于1难道必须封装成对象映射?因为其实我们无论修改还是查询其实很经常遇到这种问题啊。反正我之前增加因为懒,只想加id和name。直接写接收两个参数是解析不出来的。感觉还要转换有点小麻烦啊。(可能目前已经有成熟的解决办法了,但是我记得很清楚前几年学习mybatis的时候这个参数数量就有限制)
- 还是非映射字段问题。我目前百度告诉我的都是mybatis plus的办法。这个我承认是我着急了没有慢慢看。不过真的感觉这里略麻烦。
- 这个是我个人的一个很严重的问题!!!我并没有太觉得mybatis哪里简单了。该写sql写sql(注解方式我觉得也是),为什么不直接用jdbcTemplate?真的感觉除了封装结果集,哎。。。
首先,我这里承认我对mybatis不够了解。其次用jpa用习惯了情不自禁拿来比较。最后,仅代表个人观点。也就当我随便发发牢骚吧。
针对上面几个问题,不想撕,有大佬知道的心态好的话希望指点一二。