Spring Boot-02 SpringBoot整合MyBatis

一、数据准备

此处使用MySQL数据库

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `age` int(11) NOT NULL COMMENT '年龄',
  `ctm` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('张三', '18', NOW()) ;
INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('李四', '20', NOW()) ;
INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('王五', '19', NOW()) ;

二、引入依赖

 		<!-- Spring-Mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

三、数据库配置文件

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_user?serverTimezone=GMT%2B8
    username: root
    password: 1234

四、编写代码

1、在application.yml文件中配置JavaBean别名

mybatis:
  type-aliases-package: cn.demo.po

实体类User.java

package cn.demo.po;

import java.util.Date;

/**
 * 用户类
 */
public class User {

    private int id; //用户编号
    private String username;    //姓名
    private int age;            //年龄
    private Date ctm;           //创建日期

    public User(){}
	
	//带参构造
    public User(String username, int age) {
        this.username = username;
        this.age = age;
        this.ctm=new Date();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getCtm() {
        return ctm;
    }

    public void setCtm(Date ctm) {
        this.ctm = ctm;
    }
}

UserMapper.java

package cn.demo.dao;

import cn.demo.po.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 用户信息 数据访问层
 */
public interface UserMapper {

    /**
     * 根据id获取用户
     * @param id 用户编号
     * @return User对象
     */
    @Select("SELECT * FROM tb_user WHERE id = #{id}")
    User getUserById(Integer id);

    /**
     * 获取所有用户信息
     * @return User集合
     */
    @Select("SELECT * FROM tb_user")
    public List<User> getUserList();

    /**
     * 新增用户
     * @param user
     * @return 受影响的行数
     */
    @Insert("insert into tb_user(username, age, ctm) values(#{username}, #{age}, now())")
    public int add(User user);

    /**
     * 修改用户信息
     * @param id 用户编号
     * @param  user 用户对象
     * @return 受影响的行数
     */
    @Update("UPDATE tb_user SET username = #{user.username} , age = #{user.age} WHERE id = #{id}")
    public int update(@Param("id") Integer id, @Param("user") User user);

    /**
     * 删除指定用户
     * @param id 用户编号
     * @return
     */
    @Delete("DELETE from tb_user where id = #{id} ")
    public int delete(Integer id);

}

UserService.java

package cn.demo.service;

import cn.demo.po.User;

import java.util.List;

/**
 * 用户信息 业务操作类
 */
public interface UserService {

    /**
     * 获取指定用户信息
     * @param id
     * @return
     */
    public User getUserById(Integer id);

    /**
     * 获取所有用户
     * @return
     */
    public List<User> getUserList();

    /**
     * 保存用户信息
     * @param user
     * @return
     */
    public int add(User user);

    /**
     * 更新用户信息
     * @param id
     * @param user
     * @return
     */
    public int update(Integer id, User user);

    /**
     * 删除用户信息
     * @param id
     * @return
     */
    public int delete(Integer id);

}

UserServiceImpl.java

package cn.demo.service;

import cn.demo.dao.UserMapper;
import cn.demo.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户业务操作实现类
 */
@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public User getUserById(Integer id) {
        return userMapper.getUserById(id);
    }

    @Override
    public List<User> getUserList() {
        return userMapper.getUserList();
    }

    @Override
    public int add(User user) {
        return userMapper.add(user);
    }

    @Override
    public int update(Integer id, User user) {
        return userMapper.update(id, user);
    }

    @Override
    public int delete(Integer id) {
        return userMapper.delete(id);
    }
}

UserController.java (Restful风格)

package cn.demo.controller;

import cn.demo.po.User;
import cn.demo.service.UserService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

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

@RestController
public class UserController {

    private Logger logger=Logger.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 根据id获取用户
     * @param id
     * @return
     */
    @RequestMapping(value="/user/{id}",method = RequestMethod.GET)
    public Object getUserById(@PathVariable(value ="id")Integer id){
        User user=null;
        try {
           user=userService.getUserById(id);
        }catch (Exception e){
            e.printStackTrace();
        }
        return user;
    }

    /**
     * 获取所有用户
     * @return
     */
    @RequestMapping(value="/users",method = RequestMethod.GET)
    public Object getUserList(){
        List<User> userList=new ArrayList<>();
        try {
            userList=userService.getUserList();
        }catch (Exception e){
            e.printStackTrace();
        }
        return userList;
    }

    /**
     * 添加用户
     * @return
     */
    @RequestMapping(value="/add",method = RequestMethod.POST)
    public Object addUser(@RequestBody User user){
        Map<String,Object> resultMap=new HashMap<String,Object>();
        try {
            int count=userService.add(user);
            if(count>0){
                resultMap.put("result","ok");
            }
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("result","error");
        }
        return resultMap;
    }

    /**
     * 修改用户
     * @return
     */
    @RequestMapping(value="/update{id}",method = RequestMethod.POST)
    public Object updateUser(@PathVariable("id")Integer id,@RequestBody User user){
        Map<String,Object> resultMap=new HashMap<String,Object>();
        try {
            int count=userService.update(id,user);
            if(count>0){
                resultMap.put("result","ok");
            }
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("result","error");
        }
        return resultMap;
    }


    /**
     * 删除用户
     * @return
     */
    @RequestMapping(value="/delete",method = RequestMethod.POST)
    public Object updateUser(@RequestParam("id")String id){
        Map<String,Object> resultMap=new HashMap<String,Object>();
        try {
            int count=userService.delete(id==null?0:Integer.parseInt(id));
            if(count>0){
                resultMap.put("result","ok");
            }else{
				resultMap.put("result","error");
			}
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("result","error");
        }
        return resultMap;
    }

}

说明:整合过程中使用到的注解

1、@RequestBody: 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用: 用于读取Request请求的body部分数据,使用系统默认配置的
HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上。再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

2、@Mapper: 为了使接口被其他类引用,需要使用@Mapper注解,这种方式要求每一个mapper类都需要添加此注解。
例:

	@Mapper
	public interface UserMapper{
		//省略部分代码
	}

3、@MapperScan: 一次性配置指定包下的所有接口
使用方式: 在SpringBoot工程入口添加@MapperScan,并指定需要注解的包名
例:

	@ComponentScan("com.example.demo")
	@MapperScan("com.example.demo.dao")   
	@SpringBootApplication
	public class DemoApplication {
    	        public static void main(String[] args) {
        		SpringApplication.run(DemoApplication.class, args);
   	        }
	}

Application.java

package com.demo.springboot.springboot01;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("cn.demo")
@SpringBootApplication
//扫描cn.demo.dao包下的所有mapper,并将其注册到Spring容器中
@MapperScan("cn.demo.dao")	
public class Springboot01Application {

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

}

测试:
Spring Boot-02 SpringBoot整合MyBatis

五、注意点

引入Springboot-mybatis依赖的时候,并不是spring官方的starter,往常的springboot集成的依赖,比如web,redis等,groupId以及artifactId的地址如下:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

而这里是mybatis为spring提供的starter依赖,所以依赖地址是:

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

这里必须要指定版本号,往常我们使用springboot之所以不需要指定版本号,是因为我们引入的Maven Parent 中指定了SpringBoot的依赖,SpringBoot官方依赖Pom文件中已经指定了它自己集成的第三方依赖的版本号,对于Mybatis,Spring官方并没有提供自己的starter,所以必须跟正常的maven依赖一样,要加版本号。