SpringBoot整合Mybatis
创建一个SpringBoot项目
这里我选择在Idea中的Spring Initializr进行创建,也可以在start.spring.io中配置好,下载下来。
填写好项目名称
勾选依赖,web,JDBC,MyBatis,MySQL
项目创建成功!
创建user表
这里为了简单,我在名为demo的数据库中创建了user表:
并插入三条数据:
| id | username | age | address |
|---|---|---|---|
| 1 | 张三 | 22 | 杭州 |
| 2 | 李四 | 19 | 北京 |
| 3 | 王五 | 33 | 上海 |
配置文件
打开application.properties文件,做如下配置:
# 端口
server.port=8080
# MySQL配置
spring.datasource.url=jdbc:mysql:///demo?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
或者也可以用yml进行配置,效果是一样的,application.yml:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql:///demo?serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.korilweb.demo_mybatis.entity
编写User类
新建一个entity文件夹,创建类User.java:
package com.korilweb.demo_mybatis.entity;
public class User {
public Integer id;
public String username;
public Integer age;
public String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
编写Mapper的xml文件
在resources文件夹下,新建一个文件夹,名为mapper,这里面存放所有的xml文件
在mapper文件夹下,新建一个名为user-mapper.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.korilweb.demo_mybatis.dao.UserMapper">
<select id="selectUserById" resultType="com.korilweb.demo_mybatis.entity.User">
select id, username, age, address
from user
where id = #{id}
</select>
</mapper>
这里resultType可以简写成User,但是要在application.properties中多配置一项:
mybatis.type-aliases-package=com.korilweb.demo_springcloud.entity
编写dao层
新建一个dao文件夹,创建接口UserMapper.java:
package com.korilweb.demo_mybatis.dao;
import com.korilweb.demo_mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
User selectUserById(int id);
}
这里要在UserMapper上加@Mapper的注解,但是如果每写一个Mapper都要添加一个@Mapper,取代之的方式是在启动类上加@MapperScan的注解,并在括号内表明要扫描的Mapper们所在的包路径:
package com.korilweb.demo_mybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.korilweb.demo_mybatis.dao") // 加了这个注解,就不用每个Mapper都写@Mapper了
public class DemoMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMybatisApplication.class, args);
}
}
编写service层
新建一个service文件夹,创建类UserService.java:
package com.korilweb.demo_mybatis.service;
import com.korilweb.demo_mybatis.dao.UserMapper;
import com.korilweb.demo_mybatis.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findUserById(int id) {
return userMapper.selectUserById(id);
}
}
编写测试
@Autowired
private UserService userService;
@Test
void findUserByIdTest() {
User userById = userService.findUserById(1);
System.out.println(userById);
}
测试结果:
User{id=1, username='张三', age=22, address='杭州'}
其它一些简单的功能实现(增删改查)
查找所有用户
先在UserMapper里面添加方法:
List<User> selectAllUsers();
然后,在user-mapper.xml里面写上相应的SQL语句:
<select id="selectAllUsers" resultType="com.korilweb.demo_mybatis.entity.User">
select id, username, age, address
from user
</select>
最后,在UserService里面调用UserMapper的方法:
public List<User> findAllUsers() {
return userMapper.selectAllUsers();
}
测试:
@Test
void findAllUsersTest() {
List<User> users = userService.findAllUsers();
for (User user : users) {
System.out.println(user);
}
}
测试结果:
User{id=1, username='张三', age=22, address='杭州'}
User{id=2, username='李四', age=19, address='北京'}
User{id=3, username='王五', age=33, address='上海'}
增加一个用户
UserMapper.java:
int insertUser(User user);
user-mapper.xml
<insert id="insertUser" parameterType="com.korilweb.demo_mybatis.entity.User">
insert into user (username, age, address)
values (#{username}, #{age}, #{address})
</insert>
UserService.java
public int addUser(User user) {
return userMapper.insertUser(user);
}
测试:
@Test
void addUserTest() {
User user = new User();
user.setUsername("赵六");
user.setAge(18);
user.setAddress("广州");
int result = userService.addUser(user);
System.out.println(result);
}
测试结果:
返回1,同时可以在数据库中看到增加了新的user
更新一个用户的信息
UserMapper.java:
int updateUserInfo(User user);
user-mapper.xml:
<update id="updateUserInfo" parameterType="com.korilweb.demo_mybatis.entity.User">
update user
set username = #{username}, age = #{age}, address = #{address}
where id = #{id}
</update>
UserService.java:
public int changeUserInfo(User user) {
return userMapper.updateUserInfo(user);
}
测试:
@Test
void changeUserInfoTest() {
User user = new User();
user.setId(1);
user.setUsername("张三丰");
user.setAge(88);
user.setAddress("福建");
int result = userService.changeUserInfo(user);
System.out.println(result);
}
测试结果:
返回1,同时可以在数据库中看到id=1的user信息已经发生了改变
删除一个用户
UserMapper.java:
int deleteUserById(int id);
user-mapper.xml:
<delete id="deleteUserById">
delete from user
where id = #{id}
</delete>
UserService.java:
public int deleteUserById(int id) {
return userMapper.deleteUserById(id);
}
测试:
@Test
void deleteUserByIdTest() {
int result = userService.deleteUserById(1);
System.out.println(result);
}
测试结果:
返回1,同时可以看到id=1的数据被删除了
代码
代码已上传至gitee: