数据访问:JPA关联MyBatis

2024-09-03 23:44
文章标签 数据 访问 关联 mybatis jpa

本文主要是介绍数据访问: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 mapperPUBLIC "-//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@Resourceprivate UserMapper userMapper;@Testpublic void testSelectById(){//主键查询User user=userMapper.selectById(1L);System.out.println("usrName: "+user.getUsrName());}@Testpublic void testInsert() {//添加userMapper.insert(new User("李荣华","123456",9L,1));}@Testpublic 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 关联

  1. 实体关系映射

    • JPA 提供了强大的实体关系映射功能,可以轻松地表示数据库中的各种关系,如一对一、一对多、多对一和多对多关系。
    • 通过在实体类中使用注解来定义关系,例如 @OneToOne@OneToMany@ManyToOne 和 @ManyToMany,可以清晰地表达实体之间的关联。
    • 例如,一个订单实体可能与多个订单项实体存在一对多关系,使用 JPA 可以很方便地进行映射和管理这种关系。
  2. 关联查询

    • JPA 可以自动生成关联查询的 SQL 语句,使得在查询一个实体时,可以同时获取与之相关联的其他实体的数据。
    • 通过使用 JPQL(Java Persistence Query Language)或 Criteria API,可以进行复杂的关联查询,轻松获取多个实体之间的关联数据。
    • 例如,可以查询一个用户的所有订单,并同时获取每个订单的详细信息。
  3. 级联操作

    • JPA 支持级联操作,可以在对一个实体进行操作时,自动对与之相关联的实体进行相应的操作。
    • 例如,当删除一个用户实体时,可以设置级联删除该用户的所有订单和订单项实体。
    • 通过设置 @OneToOne@OneToMany 等注解的 cascade 属性,可以指定级联操作的类型,如 CascadeType.PERSIST(级联保存)、CascadeType.REMOVE(级联删除)等。
  4. 懒加载和预加载

    • JPA 支持懒加载和预加载策略,可以根据实际需求选择在何时加载关联实体的数据。
    • 懒加载意味着关联实体的数据只有在实际被访问时才会被加载,这可以提高性能,避免不必要的数据加载。
    • 预加载则是在查询主实体时,同时加载与之相关联的实体数据,可以避免在后续访问关联实体时产生额外的数据库查询。

二、MyBatis

  1. 灵活的 SQL 编写

    • MyBatis 允许开发人员直接编写 SQL 语句,提供了极大的灵活性。可以根据具体的业务需求编写复杂的 SQL 查询、插入、更新和删除语句。
    • 对于一些特殊的数据库操作或复杂的业务逻辑,开发人员可以精确地控制 SQL 的执行,以获得最佳的性能和结果。
  2. 结果映射

    • MyBatis 提供了丰富的结果映射方式,可以将查询结果映射到 Java 对象中。可以使用 XML 配置文件或注解来定义结果映射规则。
    • 例如,可以将数据库中的列名映射到 Java 对象的属性名,或者进行复杂的结果集转换和聚合操作。
  3. 动态 SQL

    • MyBatis 支持动态 SQL,可以根据不同的条件动态生成 SQL 语句。这对于处理复杂的查询条件和动态数据非常有用。
    • 使用 MyBatis 的动态 SQL 标签,如 <if><choose><foreach> 等,可以根据条件拼接 SQL 语句,提高代码的可维护性和灵活性。
  4. 与数据库的良好兼容性

    • MyBatis 可以与各种数据库进行良好的兼容,支持不同数据库的特性和语法。
    • 可以通过配置不同的数据库驱动和连接参数,轻松地切换数据库,而无需修改大量的代码。
  5. 开发效率

    • JPA 提供了高级的对象关系映射功能,减少了手动编写 SQL 的工作量,对于简单的数据库操作和标准的关系模型,开发效率较高。
    • MyBatis 需要手动编写 SQL,但提供了更多的灵活性和控制力,对于复杂的业务逻辑和特殊的数据库需求,开发效率可能更高。
  6. 性能优化

    • MyBatis 允许开发人员直接控制 SQL 的执行,可以进行更精细的性能优化,例如调整查询语句、使用数据库特定的功能等。
    • JPA 在某些情况下可能会生成复杂的 SQL 语句,对于性能要求极高的场景,可能需要进行额外的性能调优。

这篇关于数据访问:JPA关联MyBatis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134389

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X