在Spring Boot的应用程序开发中,数据访问是不可或缺的一部分。Spring Boot通过整合多种数据访问技术,如JPA(Java Persistence API)和MyBatis,为开发者提供了灵活而强大的数据库操作能力。本文将对Spring Boot中JPA关联映射与MyBatis的使用进行总结,探讨它们的特点、优势、应用场景及在Spring Boot中的整合方式。
JPA关联映射
1. JPA简介
JPA是一种Java ORM技术标准,旨在简化数据库访问,减少开发者直接编写SQL语句的需要。它通过注解将Java对象映射到数据库表,并管理对象之间的关系。在Spring Boot中,JPA的实现通常依赖于Hibernate等ORM框架。
2. 关联映射
JPA的关联映射是ORM技术的重要组成部分,它允许开发者在Java对象中定义实体间的关系,并自动映射到数据库表之间的关系。常见的关联类型包括一对一、一对多/多对一和多对多。关联映射的实现主要通过注解来完成,如@OneToOne
、@OneToMany
、@ManyToOne
和@ManyToMany
。
在Spring Boot中,通过定义实体类并使用这些注解,可以轻松地实现实体间的关联。例如,一个用户(User)可以拥有多个角色(Role),这种一对多的关系可以通过在User实体中使用@OneToMany
注解,并在Role实体中使用@ManyToOne
注解来定义。
3. JPA在Spring Boot中的优势
- 简化开发:JPA的ORM特性使得开发者可以使用Java对象来操作数据库,减少了SQL语句的编写量。
- 标准化:JPA是Java EE的一部分,遵循Java标准,具有良好的跨平台性和可移植性。
- 集成简便:Spring Boot提供了对JPA的自动配置支持,使得集成JPA变得非常简便。
MyBatis
1. MyBatis简介
MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,通过使用简单的XML或注解将接口和Java的POJOs映射成数据库中的记录。
2. MyBatis在Spring Boot中的使用
在Spring Boot中,MyBatis的使用通常通过引入mybatis-spring-boot-starter
依赖来实现。该依赖提供了对MyBatis的自动配置支持,使得开发者可以更加方便地集成MyBatis。
MyBatis在Spring Boot中的应用主要分为以下几个步骤:
- 引入依赖:在
pom.xml
或build.gradle
中添加mybatis-spring-boot-starter
依赖。 - 配置Mapper:编写Mapper接口,并通过XML文件或注解定义SQL语句的映射关系。
- 配置application.properties或application.yml:指定Mapper文件的位置和其他MyBatis相关配置。
- 使用Mapper:在Service层中注入Mapper接口,并调用其方法来执行数据库操作。
3. MyBatis的优势
- 灵活性高:MyBatis允许开发者直接编写SQL语句,提供了对数据库操作的完全控制权。
- 动态SQL:MyBatis提供了强大的动态SQL功能,可以根据不同的条件动态构建SQL语句。
- 性能优越:在需要执行复杂查询或优化性能的场合,MyBatis通常比JPA表现更好。
JPA关联与MyBatis的对比
- 开发效率:JPA通过ORM技术简化了数据库操作,提高了开发效率;而MyBatis则需要开发者编写更多的SQL语句和映射配置,但提供了更高的灵活性。
- 性能:在大多数情况下,JPA的性能足够满足需求;但在执行复杂查询或大量数据操作时,MyBatis可能表现更优。
- 适用场景:JPA适用于快速开发和标准化ORM支持的场景;MyBatis则更适用于需要高性能和灵活SQL控制的场景。
spring.application.name=SpringBoot3
mybatis.type-aliases-package=com.ty.springboot3.crm.pojo
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=sasa
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
logging.level.root=warn
logging.level.com.ty.springboot3.crm.mapper=trace
logging.pattern.console=%p%m%n
<?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.ty.springboot3.crm.mapper.UserMapper">
<resultMap id="userResultMap" type="User">
<id column="usr_id" property="usrId"/>
<result column="usr_name" property="usrName"/>
<result column="usr_password" property="usrPassword"/>
<result column="usr_role_id" property="usrRoleId"/>
<result column="usr_flag" property="usrFlag"/>
</resultMap>
<sql id="columns">
usr_id,usr_name,usr_password,usr_role_id,usr_flag
</sql>
<insert id="insert">
insert into sys_user(usr_name,usr_password,usr_role_id,usr_flag)
values
(#{usrName},#{usrPassword},#{usrRoleId},#{usrFlag})
</insert>
<!--<update id="update">
update sys_user
<set>
<if test="usrName != null">usr_name=#{usrName},</if>
<if test="usrPassword != null">usr_password=#{usrPassword},</if>
<if test="usrRoleId != null">usr_role_id=#{usrRoleId},</if>
<if test="usrFlag != null">usr_flag=#{usrFlag},</if>
</set>
where usr_id=#{usrId}
</update>-->
<delete id="delete" parameterType="java.lang.Long">
delete from
sys_user
where usr_id=#{usrId}
</delete>
<select id="get" parameterType="java.lang.Long" resultMap="userResultMap">
select <include refid="columns"/>
from sys_user
where usr_id=#{id}
</select>
<!--<select id="finAll" resultType="User">
select <include refid="columns"/>
from sys_user
</select>-->
</mapper>
<?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">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
</configuration>
@SpringBootTest
@MapperScan("com.ty.springboot3.crm.mapper")
class SpringBoot3ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() throws Exception{
userMapper.insert(new User("kt","123456",9L,1L));
System.out.println("插入成功");
}
@Test
public void testGet(){
User user = userMapper.get(2L);
System.out.println("usrName:"+user.getUsrName());
}
@Test
public void testFindAll(){
List<User> users = userMapper.finAll();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testUpdate(){
User user = new User();
user.setUsrId(2L);
user.setUsrName("ktjy");
userMapper.update(user);
System.out.println("更新成功");
}
@Test
public void testDelete(){
userMapper.delete(86L);
System.out.println("删除成功");
}
结论
在Spring Boot中,JPA和MyBatis都是优秀的数据访问技术。选择哪种技术取决于项目的具体需求、团队的技术栈以及开发者的偏好。对于需要快速开发和标准化ORM支持的场景,JPA是一个不错的选择;而对于需要高性能和灵活SQL控制的场景,MyBatis则更加适合。在实际应用中,也可以根据项目的具体情况将JPA和MyBatis结合使用,以达到最佳的开发效率和系统性能。