Spring boot之MyBatis

Posted 曹英杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring boot之MyBatis相关的知识,希望对你有一定的参考价值。

文章目录
1. 环境依赖
2. 数据源
2.1. 方案一 使用 Spring Boot 默认配置
2.2. 方案二 手动创建
3. 脚本初始化
4. MyBatis整合
4.1. 方案一 通过注解的方式
4.1.1. 实体对象
4.1.2. DAO相关
4.1.3. Service相关
4.1.4. Controller相关
4.2. 方案二 通过配置文件的方式
4.2.1. 实体对象
4.2.2. 配置相关
4.2.3. DAO相关
4.2.4. Service相关
4.2.5. Controller相关
5. 总结
 

本文讲解Spring Boot基础下,如何整合MyBatis框架,编写数据访问。

环境依赖
修改 POM 文件,添加mybatis-spring-boot-starter依赖。

值得注意的是,可以不添加spring-boot-starter-jdbc。

因为,mybatis-spring-boot-starter依赖中存在spring-boot-starter-jdbc。

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.1.1</version>
</dependency>

添加mysql依赖。

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.35</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.14</version>
</dependency>

数据源

方案一 使用 Spring Boot 默认配置
在 src/main/resources/application.properties 中配置数据源信息。

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

方案二 手动创建
在 src/main/resources/config/source.properties 中配置数据源信息。

# mysql
source.driverClassName = com.mysql.jdbc.Driver
source.url = jdbc:mysql://localhost:3306/springboot_db?useUnicode = true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
source.username = root
source.password = root

通过 Java Config 创建 dataSource 和jdbcTemplate 。

@Configuration
@EnableTransactionManagement
@PropertySource(value = {"classpath:config/source.properties"})
public class BeanConfig {
 
    @Autowired
    private Environment env;
 
    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(env.getProperty("source.driverClassName").trim());
        dataSource.setUrl(env.getProperty("source.url").trim());
        dataSource.setUsername(env.getProperty("source.username").trim());
        dataSource.setPassword(env.getProperty("source.password").trim());
        return dataSource;
    }
 
@Bean
    public JdbcTemplate jdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }
}

脚本初始化
先初始化需要用到的SQL脚本。

CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
 
USE `springboot_db`;
 
DROP TABLE IF EXISTS `t_author`;
 
CREATE TABLE `t_author` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 用户ID,
  `real_name` varchar(32) NOT NULL COMMENT 用户名称,
  `nick_name` varchar(32) NOT NULL COMMENT 用户匿名,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

MyBatis整合

方案一 通过注解的方式
实体对象

package com.boot.mybatis.entity;

import com.alibaba.fastjson.annotation.JSONField;

public class Author {
 
    private Long id;
    @JSONField(name="real_name")
    private String realName;
    @JSONField(name="nick_name")
    private String nickName;
    
    // SET和GET方法
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    } 
}

DAO相关

package com.boot.mybatis.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.boot.mybatis.entity.Author;

 
@Mapper
public interface AuthorMapper {
    
    @Insert("insert into t_author(real_name, nick_name) values(#{real_name}, #{nick_name})")
    int add(@Param("real_name") String realName, @Param("nick_name") String nickName);
    
    @Update("update t_author set real_name = #{real_name}, nick_name = #{nick_name} where id = #{id}")
    int update(@Param("real_name") String realName, @Param("nick_name") String nickName, @Param("id") Long id);
    
    @Delete("delete from t_author where id = #{id}")
    int delete(Long id);
    
    @Select("select id, real_name as realName, nick_name as nickName from t_author where id = #{id}")
    Author findAuthor(@Param("id") Long id);
    
    @Select("select id, real_name as realName, nick_name as nickName from t_author")
    List<Author> findAuthorList();
}

Service相关

package com.boot.mybatis.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.boot.mybatis.dao.AuthorMapper;
import com.boot.mybatis.entity.Author;


 
@Service
public class AuthorService {
    
    @Autowired
    private AuthorMapper authorMapper;
 
    public int add(String realName, String nickName) {
        return this.authorMapper.add(realName, nickName);
    }
 
    public int update(String realName, String nickName, Long id) {
        return this.authorMapper.update(realName, nickName, id);      
    }
 
    public int delete(Long id) {
        return this.authorMapper.delete(id);
    }
 
    public Author findAuthor(Long id) {
        return this.authorMapper.findAuthor(id);
    }
 
    public List<Author> findAuthorList() {
        return this.authorMapper.findAuthorList();
    }
}

Controller相关
为了展现效果,我们先定义一组简单的 RESTful API 接口进行测试。

package com.boot.mybatis.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

 
import com.boot.mybatis.entity.Author;
import com.boot.mybatis.service.AuthorService;

 

 
@RestController
@RequestMapping("/author")
public class AuthorController {

    @Autowired
    private AuthorService authorService;
   
    
    /**
     * 查询用户列表 
     */
 
    @GetMapping("/getAuthorList")
    public Map<String, Object> getAuthorList(HttpServletRequest request) {
         

        List<Author> authorList = this.authorService.findAuthorList();
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("total", authorList.size());
        param.put("rows", authorList);
        return param;
    }

    /**
     * 查询用户信息
     */
    //@RequestMapping(value = "/getAuthor",method = RequestMethod.GET)
    @GetMapping("/getAuthor")
    public Author getAuthor() {
        Author author = this.authorService.findAuthor(1L);
        if (author == null) {
            throw new RuntimeException("查询错误");
        }
        return author;
    }

    /**
     * 新增方法
     */
    @RequestMapping(value ="/add",method = RequestMethod.GET)
    public void add() {
         String realName = "123456"; 
         String nickName = "123456"; 
        try {
            this.authorService.add(realName, nickName);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("新增错误");
        }
    }

    /**
     * 更新方法
     */
    @RequestMapping(value ="/update")
    public void update() {
        try {
            this.authorService.update("cyj", "123456", 1L);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("更新错误");
        }
    }
    /**
     * 删除方法
     */
    @RequestMapping(value ="/delete")
    public void delete() {
        try {
            this.authorService.delete(1L);
        } catch (Exception e) {
            throw new RuntimeException("删除错误");
        }
    }
}

方案二 通过配置文件的方式
实体对象

package com.boot.mybatis.entity;

import com.alibaba.fastjson.annotation.JSONField;

public class Author {
 
    private Long id;
    @JSONField(name="real_name")
    private String realName;
    @JSONField(name="nick_name")
    private String nickName;
    
    // SET和GET方法
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    } 
}

配置相关
在 src/main/resources/mybatis/AuthorMapper.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.boot.mybatis.dao.AuthorMapper2">

    <!-- type为实体类Student,包名已经配置,可以直接写类名 -->
    <resultMap id="authorMap" type="Author">
        <id property="id" column="id" />
        <result property="realName" column="real_name" />
        <result property="nickName" column="nick_name" />
    </resultMap>

    <select id="findAuthor" resultMap="authorMap" resultType="Author">
        select id, real_name, nick_name from t_author where id = #{id}
    </select>
</mapper> 

在 src/main/resources/application.properties 中配置数据源信息。

#mybatis
mybatis.mapper-locations=classpath*:mybatis/*Mapper.xml
mybatis.type-aliases-package=com.boot.mybatis.entity

DAO相关

package com.boot.mybatis.dao;

import org.apache.ibatis.annotations.Param;

import com.boot.mybatis.entity.Author;
 
public interface AuthorMapper2 { 
    Author findAuthor(@Param("id") Long id); 
}

Service相关

package com.boot.mybatis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.boot.mybatis.dao.AuthorMapper2;
import com.boot.mybatis.entity.Author;
 
 
 
@Service
public class AuthorService2 {
    
    @Autowired
    private AuthorMapper2 authorMapper;
 
    public Author findAuthor(Long id) {
        return this.authorMapper.findAuthor(id);
    }
 
}

Controller相关

package com.boot.mybatis.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.boot.mybatis.entity.Author;
import com.boot.mybatis.service.AuthorService2;

 

 

@RestController
@RequestMapping(value=" Author2")
 
public class AuthorController2 {

    @Autowired
    private AuthorService2 authorService;

    /**
     * 查询用户信息
     */
    @RequestMapping(value = "/getuserId", method = RequestMethod.GET)
    public Author getAuthor() {
        Author author = this.authorService.findAuthor(2l);
        if (author == null) {
            throw new RuntimeException("查询错误");
        }
        return author;
    }

}

总结

上面这个简单的案例,让我们看到了 Spring Boot 整合 MyBatis 框架的大概流程。那么,复杂的场景,大家可以参考使用一些比较成熟的插件,例如com.github.pagehelper、mybatis-generator-maven-plugin等。

 




























以上是关于Spring boot之MyBatis的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 深入浅出 Spring Boot - 数据访问之 MyBatis

spring boot DAO之Mybatis

我的spring-boot-study之mybatis的应用

我的spring-boot-study之mybatis的应用

上手spring boot项目之spring boot整合mybatis进行增删改查的三种方式。

(52)java Spring Cloud+Spring boot+mybatis企业快速开发架构之Apollo在Java中的使用