美文网首页Javajava学习之路
spring boot+mybatis简单demo

spring boot+mybatis简单demo

作者: 唯有努力不欺人丶 | 来源:发表于2019-08-09 01:04 被阅读34次

用了一年多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用习惯了情不自禁拿来比较。最后,仅代表个人观点。也就当我随便发发牢骚吧。
针对上面几个问题,不想撕,有大佬知道的心态好的话希望指点一二。

相关文章

网友评论

    本文标题:spring boot+mybatis简单demo

    本文链接:https://www.haomeiwen.com/subject/jueqjctx.html