携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
目录
spring boot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过 JdbcTemplete 和 JPA 的整合,本次分享下Mybatis的整合。对于 mybatis 的使用,需要创建mapper类和mapper.xml文件,这种创建比较烦,并且基本都是模板样式的,回头会介绍 mybatis 的插件自动生成代码。由于本次是一个演示的demo,就直接手写相关代码。
整合mybatis
加入依赖
在 pom.xml 中加入以下依赖 ( 注意:上面两种注释了的,不是 springboot 的依赖 )
<!-- mybatis的依赖
-->
<!-- <dependency>-->
<!-- <groupId>org.mybatis</groupId>-->
<!-- <artifactId>mybatis</artifactId>-->
<!-- <version>3.5.3</version>-->
<!-- </dependency>-->
<!--mybatis和spring集成的依赖
-->
<!-- <dependency>-->
<!-- <groupId>org.mybatis</groupId>-->
<!-- <artifactId>mybatis-spring</artifactId>-->
<!-- <version>2.0.3</version>-->
<!-- </dependency>-->
<!--SpringBoot的Mybatis启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
编写Mapper
和之前的方式一样,只是多了两个注解
@Mapper:声明Mapper接口
@Select:声明这个接口所需要使用的sql,当然,有查询的注解,肯定就有增删改的注解
package com.example.demo.dao;
import com.example.demo.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 使用mybatis实现对数据库的操作接口
* @Author yyh
*/
@Mapper //要求mybatis的版本3.3及以上
public interface IUserMapper {
//${value}:${}是mybatis的占位符,value即为传过来的name的值
@Select("select * from user where name like '%${value}%'")
public List<User> findAllByName(String name);
}
之前使用 jpa 的方式
用户的持久层接口
package com.example.demo.dao;
import com.example.demo.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 用户的持久层接口
* @author yyh
*
* JpaRepository<User,Long>:
* 两个泛型是指 1、你要操作那个类 2、你的实体类主键的数据类型
*
* @Repository 没有持久层,持久层是继承的,所以加此注解即可
*/
@Repository("userDao")
public interface IUserDao extends JpaRepository<User,Long> {
/**
* 查询所有用户
* 如果用的是spring data jpa,然后也不想写这些方法,
* 这个时候我们可以选择,让spring data jpa来帮我们实现,
* 我们可以继承 JpaRepository<User,Long>
* @return
*/
//public List<User> findAll();
}
用户的业务层接口
用户的业务层接口,查询所有用户,根据名称查询用户信息
package com.example.demo.service;
import com.example.demo.bean.User;
import java.util.List;
/**
* 用户的业务层接口
* @author yyh
*/
public interface IUserService {
/**
* 查询所有用户
* @return
*/
List<User> findAllUser();
/**
* 根据名称查询用户信息
* @param name
* @return
*/
List<User> findAllUserByName(String name);
}
用户的业务层实现类
用户的业务层实现类,由 jpa 升级为 mybatis 的实现
package com.example.demo.service.impl;
import com.example.demo.bean.User;
import com.example.demo.dao.IUserDao;
import com.example.demo.dao.IUserMapper;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户的业务层实现类
* @Author yyh
*/
@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;//spring data jpa的实现
@Autowired
private IUserMapper userMapper;// 由 jpa 升级为 mybatis 的实现
@Override
public List<User> findAllUser() {
return userDao.findAll();
}
@Override
public List<User> findAllUserByName(String name) {
System.out.println("name:"+name);
return userMapper.findAllByName(name);
}
}
用户的实体类(注:属性与对应数据库字段一样)
用户的实体类
package com.example.demo.bean;
import lombok.Data;
import javax.persistence.*;
/**
* 用户的实体类
* @author yyh
*
* Not a managed type
* https://www.cnblogs.com/gaoqiao/p/10862176.html
*/
//导包 javax.persistence 包下的,代表是jpa规范
@Entity //表示当前类是一个实体类
@Table(name = "user") //表示跟哪一个表进行对应
@Data //提高代码的简洁,使用这个注解可以省去代码中大量的getter/setter、toString等方法;
public class User {
@Id //表示当前这个属性是一个主键
@Column(name="id") //表示跟数据库哪一列相对应
@GeneratedValue(strategy = GenerationType.IDENTITY) //表示你这个id的值,如何得到
//GenerationType.IDENTITY 表示为自增长。它的数据类型要求为:int、long、short 其中之一
private Long id;
// @Column(name="user_name")//在windows系统下mysql不区分大小写,在linux系统下严格区分
// private String userName;//对应数据库字段user_name
//jpa方式上面驼峰形式能查到,mybatis方式要跟数据库对应一样才能查到
private String user_name;//对应数据库字段user_name
private String passWord;//对应数据库字段pass_word
private String name;//对应数据库字段name
}
用户的控制器(表现层)
用户的控制器(表现层),业务层调用持久层去查询
package com.example.demo.web.controller;
import com.example.demo.bean.User;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 用户的控制器(表现层)
* @author yyh
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
//http://localhost:8080/user/findAll
@RequestMapping("/findAll")
// @RequestMapping("/searchlgbByIds")
public List<User> findAllUser(){
return userService.findAllUser();//业务层调用持久层去查询
}
//http://localhost:8080/user/findAllByName/张三
/**
* Spring REST编程风格
* https://blog.csdn.net/qq_36697880/article/details/81630840
* @param name
* @return
*/
@RequestMapping("/findAllByName/{name}")
public List<User> findAllUserByName(@PathVariable("name")String name){
return userService.findAllUserByName(name);
}
}