栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

SpringBoot从入门到精通系列五:访问SQL数据库Mybatis和MyBatis-plus

SpringBoot从入门到精通系列五:访问SQL数据库Mybatis和MyBatis-plus

SpringBoot从入门到精通系列五:访问SQL数据库Mybatis和MyBatis-plus
  • 一、整合MyBatis
    • 1.创建pom.xml
    • 2.application.properties配置文件
    • 3.数据类User
    • 4.定义所使用的Mapper组件的接口
    • 5.UserMapper组件的测试用例类
  • 二、直接使用SqlSession
    • 1.数据类User
    • 2.DAO组件的接口
    • 3.UserDaoImpl实现类
    • 4.UserMapper.xml
    • 5.application.properties
    • 6.UserDao组件的测试用例类
  • 三、Springboot整合MyBatis-plus框架

一、整合MyBatis

SpringBoot整合Mybatis相关博文:

  • Springboot整合Mybatis框架

MyBatis只需要定义Mapper接口,MyBatis就能动态地为Mapper生成实现类,这些Mapper组件就相当于DAO组件。

当MyBatis整合SpringBoot时,Spring容器会负责生成Mapper组件,并能将Mapper组件注入其他组件(如Service组件)

SpringBoot识别Mapper方式:

  • 为每个Mapper接口添加@Mapper注解即可
1.创建pom.xml

继承spring-boot-starter-parent,并添加mybatis-spring-boot-starter.jar依赖。本例使用SpringBoot的测试支持测试DAO组件,添加spring-boot-starter-test.jar依赖。




	4.0.0

	
	
		org.springframework.boot
		spring-boot-starter-parent
		2.4.2
		
	

	org.crazyit
	mybatis
	1.0-SNAPSHOT
	mybatis

	
		UTF-8
		11
	

	
		
		
			org.mybatis.spring.boot
			mybatis-spring-boot-starter
			2.1.4
		
		
		
			mysql
			mysql-connector-java
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
		
			org.springframework.boot
			spring-boot-devtools
			true
		
	

	
		
			
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

2.application.properties配置文件
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库URL
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
# 连接数据库的用户名
spring.datasource.username=root
# 连接数据库的密码
spring.datasource.password=32147
# 指定HikariCP最大连接数为20
spring.datasource.hikari.maximum-pool-size=20
# 为Mapper组件指定日志级别为DEBUG,用于输出Mapper组件执行的SQL语句
logging.level.org.crazyit.app.dao=debug
3.数据类User

mybatissrcmainjavaorgcrazyitappdomainUser.java

public class User
{
	private Integer id;
	private String name;
	private  String password;
	private int age;
	public User(){}
	public User(String name, String password, int age)
	{
		this.name = name;
		this.password = password;
		this.age = age;
	}
	public Integer getId()
	{
		return id;
	}
	public void setId(Integer id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	@Override
	public String toString()
	{
		return "User{" +
				"id=" + id +
				", name='" + name + ''' +
				", password='" + password + ''' +
				", age=" + age +
				'}';
	}
}
4.定义所使用的Mapper组件的接口
import java.util.List;

import org.apache.ibatis.annotations.*;
import org.crazyit.app.domain.User;

@Mapper
public interface UserMapper
{
	@Select(value="select user_id id, name, password, age from " +
			"user_inf where user_id = #{b}")
	User get(Integer id);

	@Insert("insert into user_inf values "
			+ "(null, #{name}, #{password}, #{age})")
	int save(User user);

	@Update("update user_inf set name=#{name}, "
			+ "password=#{password} where user_id=#{id}")
	int update(User user);

	@Delete("delete from user_inf where user_id=#{a}")
	int delete(Integer id);

	@Select("select user_id id, name, password, age from " +
			"user_inf where age between #{startAge} and #{endAge}")
	List findByAgeBetween(int startAge, int endAge);

	@Select(value="select user_id id, name, password, age from " +
			"user_inf where name like #{name}")
	List findByNameLike(String name);
}

  • 上面的Mapper组件添加了@Mapper注解修饰,这样Spring就能识别出它是Mapper组件,从而在Spring容器中创建该Mapper组件,并能将该Mapper组件注入其他任何组件(比如Service组件)
  • 上面Mapper接口用到了@Insert、@Update、@Delete、@Select等注解,都属于MyBatis本身的用法。
  • MyBatis的Mapper组件其实就相当于DAO组件,当SpringBoot为这些Mapper接口生成Mapper组件之后,SpringBoot自然能将它们注入Service组件,当然也能注入测试用例。
5.UserMapper组件的测试用例类
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import org.crazyit.app.domain.User;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserMapperTest
{
	@Autowired
	private UserMapper userMapper;

	@ParameterizedTest
	@ValueSource(ints = {3, 4})
	public void testGet(Integer id)
	{
		System.out.println(userMapper.get(id));
	}

	@ParameterizedTest
	@CsvSource({"fkjava, fkjava123, 23", "crazyit, crazyit23, 24"})
	public void testSave(String name, String password, int age)
	{
		var user = new User(name, password, age);
		System.out.println("受影响的记录条数:" + userMapper.save(user));
	}

	@ParameterizedTest
	@CsvSource({"3, foo", "4, bar"})
	public void testUpdate(Integer id, String name)
	{
		var user = userMapper.get(id);
		user.setName(name);
		System.out.println("受影响的记录条数:" + userMapper.update(user));
	}

	@ParameterizedTest
	@ValueSource(ints = {1, 2})
	public void testDelete(Integer id)
	{
		System.out.println("受影响的记录条数:" + userMapper.delete(id));
	}

	@ParameterizedTest
	@CsvSource({"18, 20", "22, 25"})
	public void testFindByAgeBetween(int startAge, int endAge)
	{
		userMapper.findByAgeBetween(startAge, endAge).forEach(System.out::println);
	}

	@ParameterizedTest
	@ValueSource(strings = {"玉面%", "白%"})
	public void testFindByNameLike(String name)
	{
		userMapper.findByNameLike(name)
				.forEach(System.out::println);
	}
}

  • 上面测试用例类的各测试方法依次测试了UserMapper组件的每个数据访问方法
  • 执行UserMapper中的get()方法,就是执行该方法上@Select注解指定的SQL指定的SQL查询语句的效果。
二、直接使用SqlSession

Mybatis会自动在Spring容器中配置SqlSession(其实是SqlSessionTemplate实现类),并能将它注入其他组件(如DAO组件),DAO组件就能直接调用SqlSession的方法来操作数据库。

1.数据类User
public class User
{
	private Integer id;
	private String name;
	private  String password;
	private int age;
	public User(){}
	public User(String name, String password, int age)
	{
		this.name = name;
		this.password = password;
		this.age = age;
	}
	public Integer getId()
	{
		return id;
	}
	public void setId(Integer id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	@Override
	public String toString()
	{
		return "User{" +
				"id=" + id +
				", name='" + name + ''' +
				", password='" + password + ''' +
				", age=" + age +
				'}';
	}
}
2.DAO组件的接口
import java.util.List;

import org.apache.ibatis.annotations.*;
import org.crazyit.app.domain.User;

public interface UserDao
{
	int delete(Integer id);
	List findByAgeBetween(int startAge, int endAge);
}
  • 本例需要自行使用SqlSession来实现所有的Dao方法,这里只为DAO接口定义两个方法,接下来在DAO组件实现类中使用SqlSession实现这些方法即可。
  • 此处的DAO组件就相当于前一个示例的Mapper组件,只不过该DAO组件的接口没有使用任何注解修饰。
  • 接下来为该DAO接口编写实现类,该实现类需要实现接口中的每一个方法——使用SqlSession来操作数据库。
3.UserDaoImpl实现类
import org.apache.ibatis.session.SqlSession;
import org.crazyit.app.dao.UserDao;
import org.crazyit.app.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public class UserDaoImpl implements UserDao
{
	@Autowired
	private SqlSession sqlSession;
	@Override
	public int delete(Integer id)
	{
		return sqlSession.delete("org.crazyit.app.dao.UserMapper.delete", id);
	}
	@Override
	public List findByAgeBetween(int startAge, int endAge)
	{
		return sqlSession.selectList("org.crazyit.app.dao.UserMapper.findByAgeBetween",
				Map.of("startAge", startAge, "endAge", endAge));
	}
}
  • 从上面的方法实现来看,程序调用SqlSession操作数据库非常简单,调用SqlSession的insert()、update()、delete()来执行DML语句,调用selectList()或selectOne()来执行查询语句,这种用法是MyBatis最简单的也是最传统的用法
  • SqlSession调用insert()、update()、delete()、selectList()、selectOne()执行SQL语句时,如果SQL语句中没有占位符参数,就只需要传入第一个参数——该参数代表要执行的SQL语句。如果要执行的SQL语句中带一个占位符参数,那么就传入第2个参数——该参数用于为SQL语句中的占位符参数设置值。如果要执行的SQL语句中带多个占位符参数,那么第2个参数可使用Map来传入多个值。
4.UserMapper.xml

上面程序中的sqlSession调用delete()、selectList()方法的第1个参数并不是SQL语句本身,而是来自XML Mapper定义这些SQL语句。




	
		delete from user_inf where user_id=#{a}
	
	

  • 上面XML Mapper的作用就是定义SQL语句,并为SQL语句指定id。
  • 在指定了id属性之后,接下来MyBatis组件即可通过"namespace+id"的形式来引用这些SQL语句—如UserDaoImpl实现类中的代码所示。
  • 在定义了UserMapper.xml之后,还要告诉SpringBoot到哪个路径下加载XML Mapper文件。
  • 因此,本例在application.properties文件中增加如下两行。
5.application.properties
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库URL
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
# 连接数据库的用户名
spring.datasource.username=root
# 连接数据库的密码
spring.datasource.password=32147
# 指定HikariCP最大连接数为20
spring.datasource.hikari.maximum-pool-size=20
# 为Mapper组件指定日志级别为DEBUG,用于输出Mapper组件执行的SQL语句
logging.level.org.crazyit.app.dao=debug
#===========================================
# 设置Mapper XML配置文件的位置
mybatis.mapper-locations=classpath*:org/crazyit/app/dao/*.xml
# 设置为指定包下所有类型分配别名
mybatis.type-aliases-package=org.crazyit.app.domain
6.UserDao组件的测试用例类

sqlsessionsrctestjavaorgcrazyitappdaoUserDaoTest.java

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import org.crazyit.app.domain.User;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserDaoTest
{
	@Autowired
	private UserDao userDao;

	@ParameterizedTest
	@ValueSource(ints = {1, 2})
	public void testDelete(Integer id)
	{
		System.out.println("受影响的记录条数:" + userDao.delete(id));[添加链接描述](https://blog.csdn.net/zhengzaifeidelushang/article/details/115166913?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163310456816780269872437%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163310456816780269872437&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-11-115166913.pc_v2_rank_blog_default&utm_term=mybatis&spm=1018.2226.3001.4450)
	}
[添加链接描述](https://blog.csdn.net/zhengzaifeidelushang/article/details/115275360?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163310456816780269872437%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163310456816780269872437&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-10-115275360.pc_v2_rank_blog_default&utm_term=mybatis&spm=1018.2226.3001.4450)
	@ParameterizedTest
	@CsvSource({"18, 20", "22, 25"})
	public void testFindNameByAgeBetween(int startAge, int endAge)
	{
		userDao.findByAgeBetween(startAge, endAge).forEach(System.out::println);
	}
}

测试用例类的各测试方法依次测试了UserDao组件的两个数据访问方法。

三、Springboot整合MyBatis-plus框架

SpringBoot整合MyBatis-plus相关博客:

  • Springboot整合MyBatis-plus:完整代码
  • Springboot整合MyBatis-plus
  • Springboot整合MyBatis-plus:单条数据删除、批量删除、条件删除、逻辑删除
  • Springboot整合MyBatis-plus:数据库增删改查
  • Springboot整合MyBatis-plus:单条数据查询,批量查询,条件查询,分页查询
  • Springboot整合MyBatis-plus:代码生成器
  • Springboot整合MyBatis-plus:日志配置查看SQL执行过程
  • Springboot整合MyBatis-plus:数据库主键生成策略
  • Springboot整合MyBatis-plus:乐观锁和悲观锁
  • Springboot整合MyBatis-plus:条件构造器
  • Springboot整合MyBatis-plus:自动填充时间字段
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/285670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号