SpringBoot整合Mybatis(注解+xml)
文章目录
官方文档:
https://mybatis.org/mybatis-3/zh/getting-started.html
建议简单sql用注解,复杂sql用xml
SpringBoot整合Mybatis(注解开发 )
引入maven依赖
(IDEA建项目的时候直接选就可以了)
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
配置application.yml文件
server:
port: 8144
spring:
#redis
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 3000
datasource:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hellomybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
建实体类、Controller类、Service类
- 实体类
package com.example.mybatisDemo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private long id;
private String name;
private String pwd;
}
- Controller类
package com.example.mybatisDemo.controller;
import com.example.mybatisDemo.entity.User;
import com.example.mybatisDemo.service.UserService;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("api/user")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping()
public List<User> getAllUsers(){
return userService.getUsers();
}
@DeleteMapping("{id}")
public int deleteUser(@PathVariable long id){
return userService.deleteUser(id);
}
@PostMapping
public int saveUser(@RequestBody User user){
return userService.insertUser(user);
}
@PutMapping
public int updateUser(@RequestBody User user){
return userService.updateUser(user);
}
@GetMapping("{id}")
public User getUser(@PathVariable long id){
return userService.getUser(id);
}
}
- Service类
Service层最好还是定义一个接口然后实现不同的实现类,这里偷个懒就直接写一个实现类了
package com.example.mybatisDemo.service;
import com.example.mybatisDemo.entity.User;
import com.example.mybatisDemo.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getUsers(){
return userRepository.getUsers();
}
public int deleteUser(long id){
return userRepository.deleteUser(id);
}
public User getUser(long id){
return userRepository.getUser(id);
}
public int updateUser(User user){
return userRepository.updateUser(user);
}
public int insertUser(User user){
return userRepository.addUser(user);
}
}
建Repository类
package com.example.mybatisDemo.repository;
import com.example.mybatisDemo.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.*;
/**
* Mapper注解能省去以前复杂的xml配置,直接用注解写sql语句
* 不添加Repository注解依赖注入会报错(不影响运行),强迫症还是加上吧
*/
@Mapper
@Repository
public interface UserRepository {
@Select("select * from user")
List<User> getUsers();
@Delete("delete from user where id = #{id}")
int deleteUser(long id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
@Select("select * from user where id = #{id}")
User getUser(long id);
}
- 然后直接调用即可
注解实现批量插入
- 在Repository类中加入如下方法
/**
* 批量插入
* @param users
* @return
* @author Breeze
* @Description collection对应的是传入的参数名,要跟@Param注解规定的参数名对应上,item是集合中每个成员变量的名字,这里实际是使用了mybatis的动态sql特性
*/
@Insert({
"<script>","insert into user(id,name,pwd)",
"values <foreach collection='users' item='user' index='index' separator=','>",
"(#{user.id},#{user.name},#{user.pwd})",
"</foreach>","</script>"
})
int addUsers(@Param("users")List<User> users);
- 更新和插入同理,方法直接调用即可
SpringBoot整合Mybatis(xml开发 )
- Controller层和Service层不变,实体类也同上
配置文件中添加mybatis相应配置
server:
port: 8144
spring:
#redis
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 3000
datasource:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hellomybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
## springboot整合mybatis
mybatis:
mapper-locations: classpath:mapper/*.xml #注意:一定要对应mapper映射xml文件的所在路径
type-aliases-package: com.example.mybatisDemo.entity
- 这里的配置是用来绑定写sql语句用的xml文件的,下面的type-aliases-package绑定的是需要用到的实体类的路径名,这样xml里只要写实体类类名就可以了。这里改成自己的即可。
在Repository文件夹中添加UserMapper接口文件
package com.example.mybatisDemo.repository;
import com.example.mybatisDemo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Package: com.example.mybatisDemo.repository
* @Class: Usermapper
* @Author: Breeze
* @Date: 2020/12/1 11:45
*/
@Mapper
@Repository
public interface UserMapper {
List<User> queryUserList();
User selectUserById(int id);
int addUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
在Resources文件夹下新建一个专门放×××Mapper.xml文件的mapper文件夹,然后新建一个UserMapper.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.example.mybatisDemo.repository.UserMapper">
<select id="queryUserList" resultType="User">
select * from user
</select>
<select id="selectUserById" resultType="User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="User">
insert into user(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="User">
update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<select id="selectUserBy" parameterType="User">
select * from user where
</select>
</mapper>
- namespace绑定的是这个xml文件所匹配的mapper类
创建MyBatis核心配置文件(选)
- 在resources文件夹下创建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">
<!--MyBatis核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
- 一般比较简单的需求在没有核心配置文件的情况下也是可以实现的,创建这个文件的目的是进行更定制化的配置以便满足更复杂的需求,具体见官方文档
如图是现在的文件结构
- 到这一步xml开发和注解开发的配置就都完成了,Service层调用Dao层的代码相应进行调整即可。
注解开发和xml开发的区别只局限于Repository层(Dao层),往上的Controller层和Service层都是通用的。