Spring Boot 整合MyBatis

image.png

一、准备工作

1、添加依赖

在pom.xml文件中,添加mybatis-spring-boot-starter依赖和mySql连接的依赖

<!--MySQL数据库驱动,无需参与编译-->

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.1.40</version>

    <scope>runtime</scope>

</dependency>

<!--MyBatis-->

<dependency>

    <groupId>org.mybatis.spring.boot</groupId>

    <artifactId>mybatis-spring-boot-starter</artifactId>

    <version>1.3.2</version>

</dependency>

2、在数据库中添加如下表

# Dump of table role

# ------------------------------------------------------------

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `role` WRITE;

/*!40000 ALTER TABLE `role` DISABLE KEYS */;

INSERT INTO `role` (`id`, `name`)

VALUES

  (1,'超级管理员'),

  (2,'一般用户');

/*!40000 ALTER TABLE `role` ENABLE KEYS */;

UNLOCK TABLES;

3、配置数据库的用户名密码信息

在resources的application.yml文件中添加如下节点

spring:
  datasource:
    username: root
    password:
    url: jdbc:mysql://localhost:3306/student_manage?useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver

二、建立相关类

1、添加实体类

新建一个domain的包,然后在此包中新增一个Role的类

public class Role {

    /**

     * 主健ID (无默认值)

     */

    private Integer id;

    /**

     * 角色名称(必填项)  (默认值为: )

     */

    private String name;

    public Integer getId() {

        return id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

2、添加dao层

新建一个dao的包,然后在此包下新建一个RoleMapper的类

/**

* @Mapper 如果没有在SpringbootLearingApplication添加@MapperScan 注解的话,这里都需要一个这样的注解

*/

public interface RoleMapper {

    /**

     * 查询所有的角色

     *

     * @return

     */

    List<Role> queryAll();

    /**

     * 查询单个

     *

     * @param id

     * @return

     */

    Role selectOne(Integer id);

    /**

     * 新增

     *

     * @param role

     * @return

     */

    int add(Role role);

    /**

     * 修改

     *

     * @param role

     * @return

     */

    int update(Role role);

    /**

     * 删除

     *

     * @param id

     * @return

     */

    int delete(Integer id);

}

3、添加service层

新建一个service的包,然后在此包下新建一个RoleService的类,其中的@SuppressWarnings(“SpringJavaAutowireingInspection”) 注解是为了不让IDEA标红,可有可无

@Service

public class RoleService {

    @Autowired

    @SuppressWarnings("SpringJavaAutowiringInspection")

    private RoleMapper roleMapper;

    /**

     * 查询所有的角色

     *

     * @return

     */

    public List<Role> queryAll() {

        return this.roleMapper.queryAll();

    }

    /**

     * 查询单个

     *

     * @param id

     * @return

     */

    public Role selectOne(Integer id) {

        return this.roleMapper.selectOne(id);

    }

    /**

     * 新增

     *

     * @param role

     * @return

     */

    public int add(Role role) {

        return this.roleMapper.add(role);

    }

    /**

     * 修改

     *

     * @param role

     * @return

     */

    public int update(Role role) {

        return this.roleMapper.update(role);

    }

    /**

     * 删除

     *

     * @param id

     * @return

     */

    public int delete(Integer id) {

        return this.roleMapper.delete(id);

    }

}

4、添加控制器

在controller包下新建一个RoleController的类,其他代码省略

@RestController

@RequestMapping("/api/role")

public class RoleController {

    @Autowired

    private RoleService roleService;

    @RequestMapping("/list")

    public List<Role> queryAll() {

        return this.roleService.queryAll();

    }

}

5、配置全局Mapper包扫描

在SpringbootLearningApplication文件的头部添加如下注解:

/**
 * 这个注解是给指定包下的类自动添加@Mapper,省的com.xiaozhao.dao下的每个mapper类都得添加一个@Mapper注解了
 *
 * @author xiaozhao
 */

@SpringBootApplication
@MapperScan("com.xiaozhao.dao")
public class SpringbootMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }
}


三、配置MyBaits

1.使用xml
1.1 在resources文件夹下新建一个mybatis文件,然后新建一个核心配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer"/>
        <typeAlias alias="Long" type="java.lang.Long"/>
        <typeAlias alias="HashMap" type="java.util.HashMap"/>
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
        <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
        <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
    </typeAliases>
</configuration>

1.2然后在resources>mybatis 下再次新建一个mapper文件夹, 在这个mapper文件夹下新建一个RoleMapper.xml文件

  <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xiaozhao.dao.RoleMapper">
    <resultMap id="BaseResultMap" type="com.xiaozhao.domain.Role">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id, name
    </sql>

    <!--查询全部-->
    <select id="queryAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM role
    </select>

    <!--查询单个-->
    <select id="selectOne" parameterType="Integer" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM role
        WHERE id=#{id}
    </select>

    <!--增加-->
    <insert id="add" parameterType="com.xiaozhao.domain.Role">
        INSERT INTO role(name) VALUES (#{name})
    </insert>

    <!--修改-->
    <update id="update" parameterType="com.xiaozhao.domain.Role">
        UPDATE role set name=#{name} WHERE id=#{id}
    </update>

    <!--删除-->
    <delete id="delete" parameterType="Integer">
        DELETE  FROM role WHERE id=#{id}
    </delete>

</mapper>

1.3 把配置信息告诉spring

在application.yml文件中添加入下节点

#    配置mybatis
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.xiaozhao.domain

把最后测试运行,在浏览器中输入:http://localhost:8080/api/role/list ,得到如下结果:

image.png

2、使用注解的形式

使用注解跟xml的区别主要体现在dao层,就是把sql语句以注解的形式写到代码中。然后修改下application.yml文件中的mybatis配置即可。

2.1修改后的RoleMapper.java

package com.xiaozhao.dao;

import com.xiaozhao.domain.Role;

import org.apache.ibatis.annotations.*;

import org.apache.ibatis.type.JdbcType;

import java.util.List;

/**

* @author xiaozhao

* @date 2018/9/29上午10:40

* <p>

* 使用注解的形式

*/

/**

* @Mapper 如果没有在SpringbootLearingApplication添加@MapperScan 注解的话,这里都需要一个这样的注解

*/

public interface RoleMapper {

    /**

     * 查询所有的角色

     *

     * @return

     */

    @Select("SELECT id, name FROM role")

    @Results({

            @Result(property = "id", column = "id", jdbcType = JdbcType.INTEGER),

            @Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR)

    })

    List<Role> queryAll();

    /**

     * 查询单个

     *

     * @param id

     * @return

     */

    @Select("SELECT id, name FROM role  WHERE id=#{id}")

    @Results({

            @Result(property = "id", column = "id", jdbcType = JdbcType.INTEGER),

            @Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR)

    })

    Role selectOne(Integer id);

    /**

     * 新增

     *

     * @param role

     * @return

     */

    @Insert(" INSERT INTO role(name) VALUES (#{name})")

    int add(Role role);

    /**

     * 修改

     *

     * @param role

     * @return

     */

    @Update(" UPDATE role set name=#{name} WHERE id=#{id}")

    int update(Role role);

    /**

     * 删除

     *

     * @param id

     * @return

     */

    @Delete("  DELETE  FROM role WHERE id=#{id}")

    int delete(Integer id);

}

2.2修改后的application.yml

spring:

  # 数据库连接

  datasource:

    url: jdbc:mysql://127.0.0.1:3306/student_manage?useUnicode=true&characterEncoding=UTF-8

    username: root

    password:

    driver-class-name: com.mysql.jdbc.Driver

mybatis:

  type-aliases-package: com.xiaozhao.domain

打印sql语句

使用logback来进行打印,可以参考文章:logback

在resources文件夹下新建一个logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!-- 控制台输出 -->
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- Console 输出设置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

<!--用来设置某一个包或者具体的某一个类的日志打印级别-->
    <!--打印MyBatis的sql语句-->
    <logger name="com.xiaozhao.dao" level="DEBUG"></logger>


    <!-- 日志输出级别,生产环境下需要移除控制台输出 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

注意其中的包名要是项目中mapper所在的包名,设置为DEBUG级别,然后就可以打印sql了。

完整代码

https://github.com/xiaozhaowen/spring-boot-in-action/tree/master/springboot-mybatis

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

推荐阅读更多精彩内容