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);
}
}
测试:
五、注意点
引入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依赖一样,要加版本号。