数据访问:JPA关联MyBatis
创建项目:
添加关键依赖包:
任何使用方式都需要首先在pom.xml中引入mybatis-spring-boot-starter的启动器
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
注意需要将MySQL驱动包的版本设置为5.x版本,否则在IDEA中会报错:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
application.properties配置相关信息
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=123456
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.ktjiaoyu.crm.pojo
启动类:
在启动类中添加对Mapper包扫描@MapperScan,Spring Boot启动的时候会自动加载包路径下的Mapper
package com.ktjiaoyu.crm;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.ktjiaoyu.crm.mapper")
public class SpringBootMyBatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMyBatisApplication.class, args);
}
}
框架全局设置: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">
<configuration>
<!-- 全局配置文件 -->
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 开启控制台日志 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 全自动映射级别 -->
<setting name="autoMappingBehavior" value="FULL" />
</settings>
<typeAliases>
<package name="com.ktjiaoyu.crm.pojo" />
</typeAliases>
</configuration>
编写实体类User
package com.ktjiaoyu.crm.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("sys_user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
@TableField("usr_id")
private Long usrId;
@TableField("usr_name")
private String usrName;
private String usrPassword;
private Long usrRoleId;
private Integer usrFlag;
// public User() {
// }
//
public User(String usrName, String usrPassword, Long usrRoleId, Integer usrFlag) {
this.usrName = usrName;
this.usrPassword = usrPassword;
this.usrRoleId = usrRoleId;
this.usrFlag = usrFlag;
}
//
// public Long getUsrId() {
// return usrId;
// }
//
// public void setUsrId(Long usrId) {
// this.usrId = usrId;
// }
//
// public String getUsrName() {
// return usrName;
// }
//
// public void setUsrName(String usrName) {
// this.usrName = usrName;
// }
//
// public String getUsrPassword() {
// return usrPassword;
// }
//
// public void setUsrPassword(String usrPassword) {
// this.usrPassword = usrPassword;
// }
//
// public Long getUsrRoleId() {
// return usrRoleId;
// }
//
// public void setUsrRoleId(Long usrRoleId) {
// this.usrRoleId = usrRoleId;
// }
//
// public Integer getUsrFlag() {
// return usrFlag;
// }
//
// public void setUsrFlag(Integer usrFlag) {
// this.usrFlag = usrFlag;
// }
}
编写Mapper接口: UserMapper
public interface UserMapper{
public void insert(User user);
public void delete(Long id);
public void update(User user);
public void get(Long id);
public List<User> findAll();
}
resources/mybatis/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.ktjiaoyu.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" parameterType="User">-->
<!-- INSERT INTO-->
<!-- sys_user-->
<!-- (usr_name,usr_password,usr_role_id,usr_flag)-->
<!-- VALUES-->
<!-- (#{usrName},#{usrPassword},#{usrRoleId},#{usrFlag})-->
<!-- </insert>-->
<!-- <delete id="delete" parameterType="java.lang.Long">-->
<!-- DELETE FROM sys_user WHERE usr_id=#{usrId}-->
<!-- </delete>-->
<!-- <update id="update" parameterType="User">-->
<!-- 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>-->
<!--<select id="get" parameterType="java.lang.Long" resultType="long" resultMap="UserResultMap">-->
<!-- SELECT-->
<!-- <include refid="columns"/>-->
<!-- FROM sys_user WHERE usr_id=#{id}-->
<!--</select>-->
<!-- <select id="findAll" resultType="User">-->
<!-- SELECT-->
<!-- <include refid="columns"/>-->
<!-- FROM sys_user-->
<!-- </select>-->
</mapper>
测试类:
编写junit测试类UserMapperTest
package com.ktjiaoyu.crm;
import com.ktjiaoyu.crm.mapper.UserMapper;
import com.ktjiaoyu.crm.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
public class UserMapperTestr {
// @Autowired
@Resource
private UserMapper userMapper;
@Test
public void testSelectById(){//主键查询
User user=userMapper.selectById(1L);
System.out.println("usrName: "+user.getUsrName());
}
@Test
public void testInsert() {//添加
userMapper.insert(new User("李荣华","123456",9L,1));
}
@Test
public void testFindAll() {//查询所有
List<User> list=userMapper.selectList(null);
for (User user:list){
System.out.println("usrName: "+user.getUsrName());
}
}
// @Test
// public void test(){
// userMapper.insert(new User("ct","123456",9L,1));
// }
// @Test
// public void test2(){
// User user=userMapper.get(4L);
// System.out.println("usrName"+user.getUsrName());
// }
//
// @Test
// public void testDelete() {
// userMapper.delete(84L);
// }
//
// @Test
// public void testUpdate() {
// User userToUpdate = new User();
// userToUpdate.setUsrId(6L);
// userToUpdate.setUsrName("updatedName");
// userMapper.update(userToUpdate);
// }
}
运行效果: 第一个测试方法
总结:
一、JPA 关联
-
实体关系映射:
- JPA 提供了强大的实体关系映射功能,可以轻松地表示数据库中的各种关系,如一对一、一对多、多对一和多对多关系。
- 通过在实体类中使用注解来定义关系,例如
@OneToOne
、@OneToMany
、@ManyToOne
和@ManyToMany
,可以清晰地表达实体之间的关联。 - 例如,一个订单实体可能与多个订单项实体存在一对多关系,使用 JPA 可以很方便地进行映射和管理这种关系。
-
关联查询:
- JPA 可以自动生成关联查询的 SQL 语句,使得在查询一个实体时,可以同时获取与之相关联的其他实体的数据。
- 通过使用 JPQL(Java Persistence Query Language)或 Criteria API,可以进行复杂的关联查询,轻松获取多个实体之间的关联数据。
- 例如,可以查询一个用户的所有订单,并同时获取每个订单的详细信息。
-
级联操作:
- JPA 支持级联操作,可以在对一个实体进行操作时,自动对与之相关联的实体进行相应的操作。
- 例如,当删除一个用户实体时,可以设置级联删除该用户的所有订单和订单项实体。
- 通过设置
@OneToOne
、@OneToMany
等注解的cascade
属性,可以指定级联操作的类型,如CascadeType.PERSIST
(级联保存)、CascadeType.REMOVE
(级联删除)等。
-
懒加载和预加载:
- JPA 支持懒加载和预加载策略,可以根据实际需求选择在何时加载关联实体的数据。
- 懒加载意味着关联实体的数据只有在实际被访问时才会被加载,这可以提高性能,避免不必要的数据加载。
- 预加载则是在查询主实体时,同时加载与之相关联的实体数据,可以避免在后续访问关联实体时产生额外的数据库查询。
二、MyBatis
-
灵活的 SQL 编写:
- MyBatis 允许开发人员直接编写 SQL 语句,提供了极大的灵活性。可以根据具体的业务需求编写复杂的 SQL 查询、插入、更新和删除语句。
- 对于一些特殊的数据库操作或复杂的业务逻辑,开发人员可以精确地控制 SQL 的执行,以获得最佳的性能和结果。
-
结果映射:
- MyBatis 提供了丰富的结果映射方式,可以将查询结果映射到 Java 对象中。可以使用 XML 配置文件或注解来定义结果映射规则。
- 例如,可以将数据库中的列名映射到 Java 对象的属性名,或者进行复杂的结果集转换和聚合操作。
-
动态 SQL:
- MyBatis 支持动态 SQL,可以根据不同的条件动态生成 SQL 语句。这对于处理复杂的查询条件和动态数据非常有用。
- 使用 MyBatis 的动态 SQL 标签,如
<if>
、<choose>
、<foreach>
等,可以根据条件拼接 SQL 语句,提高代码的可维护性和灵活性。
-
与数据库的良好兼容性:
- MyBatis 可以与各种数据库进行良好的兼容,支持不同数据库的特性和语法。
- 可以通过配置不同的数据库驱动和连接参数,轻松地切换数据库,而无需修改大量的代码。
-
开发效率:
- JPA 提供了高级的对象关系映射功能,减少了手动编写 SQL 的工作量,对于简单的数据库操作和标准的关系模型,开发效率较高。
- MyBatis 需要手动编写 SQL,但提供了更多的灵活性和控制力,对于复杂的业务逻辑和特殊的数据库需求,开发效率可能更高。
-
性能优化:
- MyBatis 允许开发人员直接控制 SQL 的执行,可以进行更精细的性能优化,例如调整查询语句、使用数据库特定的功能等。
- JPA 在某些情况下可能会生成复杂的 SQL 语句,对于性能要求极高的场景,可能需要进行额外的性能调优。