spring boot+mybatis简单demo

用了一年多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>

我不知道大家看出有什么区别了没。。是表名!因为众所周知的数据库不区分大小写。但是,我刚刚因为这个问题查了一下。因为我数据库连接的是服务器的数据库,所以改了以后正常跑起来了。


Linux下表名区分大小写

如果你是单纯看demo怎么做的,到这里就可以收藏或者×了。因为以下讲的都是废话。

题外话

其实对于mybatis,真的很久不用,说是一点也不会确实是有点印象。说是会啥问题都得百度。
然后这个demo我就简单的实现了查询,增加的功能。删除和修改大同小异,没有特意实现。但是关联查询复杂查询什么的我都还没做。看了一些网上的教程,觉得整体来看,三点没有特别明白。

  1. 参数大于1难道必须封装成对象映射?因为其实我们无论修改还是查询其实很经常遇到这种问题啊。反正我之前增加因为懒,只想加id和name。直接写接收两个参数是解析不出来的。感觉还要转换有点小麻烦啊。(可能目前已经有成熟的解决办法了,但是我记得很清楚前几年学习mybatis的时候这个参数数量就有限制)
  2. 还是非映射字段问题。我目前百度告诉我的都是mybatis plus的办法。这个我承认是我着急了没有慢慢看。不过真的感觉这里略麻烦。
  3. 这个是我个人的一个很严重的问题!!!我并没有太觉得mybatis哪里简单了。该写sql写sql(注解方式我觉得也是),为什么不直接用jdbcTemplate?真的感觉除了封装结果集,哎。。。

首先,我这里承认我对mybatis不够了解。其次用jpa用习惯了情不自禁拿来比较。最后,仅代表个人观点。也就当我随便发发牢骚吧。
针对上面几个问题,不想撕,有大佬知道的心态好的话希望指点一二。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容