mybaits动态代理实验

实验目的

  1. 掌握MyBaits动态代理的使用
  2. log4j日志的使用
  3. Lombk的使用
  4. 单元测试的使用
  5. SqlSessionFactory单例模式
  6. 预处理语句的使用

实验内容

完成学生表的增删改查,学生表信息如下

CREATE TABLE tb_student(  sno  INT AUTO_INCREMENT PRIMARY KEY,  student_name VARCHAR(20) NULL,  student_age  INT         NULL  
);

实验步骤

  1. log4j日志文件的配置与使用
    在pom文件中添加下述坐标,获取log4j依赖包
<dependency>  <groupId>log4j</groupId>  <artifactId>log4j</artifactId>  <version>1.2.16</version>  
</dependency>  

在resources目录下添加配置文件log4j.properties,其代码如下

# log4j的全局配置  
log4j.rootLogger=ERROR, stdout  
# MyBatis日志配置 
log4j.logger.com.bjwl=DEBUG  
# 控制台输出格式  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

在mybaits的主配文件中,添加日志的配置,代码如下

<settings>    ...  <!--配置SQL输出文件-->  <setting name="logImpl" value="LOG4J" />  
</settings>  
  1. Lombok的配置与使用
    Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,就有一个功能齐全的构建器、自动记录变量等。使用Maven坐标导入使用Lombok的依赖包,坐标如下。
<dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  <version>1.18.24</version>  <scope>compile</scope>  
</dependency>

编写实体类时,只需要在类上加@Data注解符,即可,无需程序员编写getter和setter代码,示例代码如下。

@Data  
public class Student {  private Integer sno;  private String studentName;  private Integer studentAge;  
} 
  1. 单元测试junit的使用
    使用单元测试工具junit,在pom文件中,增加以下maven坐标,完成依赖包的导入后,在类的方法上加注解夫@test,就可以进行运行测试。maven坐标如下所示
    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency>
  1. SqlSessionFactory单例模式
    在myBatis框架的使用中,每次执行持久化化访问操作时,需要读入主配文件创建sqlSessionFactory实例,可以将其中共用部分提取到一个公用类,实现复用。由于SqlSessionFactory可以被多个线程共享,避免资源浪费,应该保证SqlSessionFactory的在一个系统中仅有一个实例,其代码如下
public class BatisUtils {  private static SqlSessionFactory sqlSessionFactory;  private BatisUtils() {};  public static synchronized SqlSessionFactory getSqlSessionFactory() throws IOException {  if (sqlSessionFactory == null) {  InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  }  return sqlSessionFactory;  }  
}
  1. 定义持久化接口StudentDao ,代码如下:
  public interface StudentDao {  List<StudentPOJO> getAllStudent();  int addStudent(StudentPOJO student);  int updateStudent(StudentPOJO student);  int deleteStudent(Integer sno);  }   
  1. 不使用动态代理时,需要开发人员编写持久化接口的实现类,代码如下。
 public class StudentDaoImpl implements StudentDao {  private SqlSessionFactory factory;  public StudentDaoImpl(SqlSessionFactory factory) {  this.factory = factory;  }  @Override  public List<Student> getAllStudent() {  SqlSession sqlSession = factory.openSession();  List<Student> students = sqlSession.selectList("com.bjwl.dao.StudentDao.getAllStudent");  return students;  }  @Override  public int addStudent(Student student) {  SqlSession sqlSession = factory.openSession();  Integer flag = sqlSession.insert("com.bjwl.dao.StudentDao.addStudent",student);  sqlSession.commit();  return flag;  }  @Override  public int updateStudent(Student student) {  SqlSession sqlSession = factory.openSession();  Integer flag = sqlSession.update("com.bjwl.dao.StudentDao.updateStudent",student);  sqlSession.commit();  return flag;  }  @Override  public int deleteStudent(Integer sno) {  SqlSession sqlSession = factory.openSession();  Integer flag = sqlSession.delete("com.bjwl.dao.StudentDao.deleteStudent",sno);  sqlSession.commit();  return flag;  }  
} 

需要注意的是增加、删除、修改必须使用 sqlSession.commit()提交修改信息,才能将维护信息写入数据库中,编写测试类,代码如下。

//不使用动态代理模式  
public class MyBatisTest0 {  private StudentDao dao;  public MyBatisTest0() throws IOException {  SqlSessionFactory sqlSessionFactory = BatisUtils.getSqlSessionFactory();  this.dao = new StudentDaoImpl(sqlSessionFactory);  }  @Test  public void getAllStudentTest()  {  List<Student> students = dao.getAllStudent();  for (int i = 0; i < students.size(); i++) {  System.out.println(students.get(i).toString());  }  }  @Test  public void addStudentTest() {  Student student = new Student();  student.setStudentName("陆雪琪");  student.setStudentAge(19);  dao.addStudent(student);  }  @Test  public void updateStudentTest()  {  Student student = new Student();  student.setSno(3);  student.setStudentName("黑山老妖");  student.setStudentAge(299);  dao.updateStudent(student);  }  @Test  public void deleteStudentTest()  {  dao.deleteStudent(8);  }  
} 

代码中方法上的@Test 注解符,就是使用junit提供的测试功能,运行结果如下图所示。
在这里插入图片描述
图中显示的sql语句就是通过log4j在控制台显示的内容
9. 使用动态代理
不使用动态代理时,开发人员必须编写每个持久化接口的实现类,分析这些实现类中代码,其执行过程非常相似,如果这部分代码由计算机自动生成,则可大大减轻开发人员的工作量,动态代理方式就是由计算机生成持久化实现类的方式。添加一个测试类MyBatisTest,在此类中直接使用动态代理方式,示例代码如下。

public class MyBaitsTest {  public void getAllStudentTest() throws Exception {  SqlSession session = getSqlSession();  System.out.println(StudentDao.class);  StudentDao dao = session.getMapper(StudentDao.class);  System.out.println(dao.getClass());  List<Student> students = dao.getAllStudent();  for (int i = 0; i < students.size(); i++) {  System.out.println(students.get(i).toString());  }  session.close();  }  private SqlSession getSqlSession() throws IOException {  SqlSessionFactory sqlSessionFactory = BatisUtils.getSqlSessionFactory();  SqlSession session = sqlSessionFactory.openSession();  return session;  }  
} 

运行过如下:
在这里插入图片描述
由运行图可以看到,通过传入接口com.bjwl.dao.StudentDao,生成的StudentDao 为代理对象,无需开发人员编写接口的实现类。

使用动态代理是使用mybaits框架常用方式,要求必须掌握

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Coresight SoC-400/SoC-600 专栏导读】

文章目录 1. ARM Coresight SoC-400/SoC-600 专栏导读目录1.1 Coresight 专题1.1.1 Performance Profiling1.1.2 ARM Coresight DS-5 系列 1. ARM Coresight SoC-400/SoC-600 专栏导读目录 本专栏全面介绍 ARM Coresight 系统 及SoC-400, SoC-600 中的各个组件。 1.1 Coresigh…

零基础Linux_17(进程间通信)VSCode环境安装+进程间通信介绍+pipe管道mkfifo

目录 1. VSCode环境安装 1.1 使用VSCode 1.2 远程链接到Linux机器 1.3 VSCode调试 2. 进程间通讯介绍 2.1 进程间通讯的概念和意义 2.2 进程间通讯的策略和本质 3. 管道 3.1 管道介绍 3.2 匿名管道介绍 3.3 匿名管道示例代码 3.3.1 建立管道的pipe 3.3.2 匿名管道…

论文阅读:Offboard 3D Object Detection from Point Cloud Sequences

目录 概要 Motivation 整体架构流程 技术细节 3D Auto Labeling Pipeline The static object auto labeling model The dynamic object auto labeling model 小结 论文地址&#xff1a;[2103.05073] Offboard 3D Object Detection from Point Cloud Sequences (arxiv.o…

电压放大器在电子实验中有哪些作用

电压放大器在电子实验中扮演着重要的角色&#xff0c;它可以实现对电压信号的放大&#xff0c;为实验提供所需的电压级别。下面是电压放大器在电子实验中的几个常见作用&#xff1a; 信号放大&#xff1a;电压放大器的主要作用是将输入信号的幅度放大&#xff0c;以便进行更准确…

在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(一)

环境&#xff1a;win10 64&#xff0c;雷电模拟器9.0.60(9)&#xff0c;Android 9。 之前我都是用雷电模拟器版本4.0.78&#xff0c;Android版本7.1.2&#xff0c;为什么本篇要使用9了呢&#xff1f;先解答下这个问题。原因如下&#xff1a;经过我的测试&#xff0c;LSPosed不支…

Android查看签名信息系列 · 使用逆向分析工具JadxGUI获取签名

前言 Android查看签名信息系列之使用逆向分析工具JadxGUI获取签名&#xff0c;通过这种方式&#xff0c;可以获取到的签名信息包括&#xff1a;MD5、SHA1、SHA-256、公钥(模数)等信息 实现方法 1、进入JadxGUI目录下的lib文件夹内&#xff0c;找到jadx-gui-1.4.7.jar文件 2、…

界面组件DevExpress WPF v23.1 - 全面升级文档处理功能

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【设计模式-1】UML和设计原则

说明&#xff1a;设计模式&#xff08;Design Pattern&#xff09;对于软件开发&#xff0c;简单来说&#xff0c;就是软件开发的套路&#xff0c;固定模板。在学习设计模式之前&#xff0c;需要首先学习UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&…

vueday02——使用NTableData

1.下载naivueui 2.按需导入&#xff0c;不要全局导入 注意不要导入错误组件或者写错组件名称 import { NDataTable } from naive-ui 3.定义表头和数据&#xff01;&#xff01;&#xff01; n-data-table标签必须要使用数据和数据 少一个都不能正确渲染&#xff01;&#xf…

CSS阶详细解析一

CSS进阶 目标&#xff1a;掌握复合选择器作用和写法&#xff1b;使用background属性添加背景效果 01-复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。…

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…

哨兵1号后向散射系数土壤水分反演

哨兵1号后向散射系数土壤水分反演 数据导入 打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件 导入实测点 选择KML转图层 kml文件是由奥维地图导出的.ovkml格式改后缀名得到的 提取采样点的后向散射系数 选择多值提取至点 右键打开点图层的属性表,发现…

k8s-18 认证授权

Authentication (认证) 认证方式现共有8种&#xff0c;可以启用一种或多种认证方式&#xff0c;只要有一种认证方式通过&#xff0c;就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式 Kubernetes集群有两类用户:由Kubernetes管理的Ser…

Oracle database 开启归档日志 archivelog

Oracle database 开启归档日志 archivelog 归档日志模式 (Archivelog Mode)。归档日志模式是一种数据库运行模式&#xff0c;它允许数据库将日志文件保存到归档日志目录中&#xff0c;以便在需要时进行恢复和还原操作。通过开启归档日志模式&#xff0c;可以提高数据库的可靠性…

服务器中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

最近一段时间内&#xff0c;相信很多使用金蝶或用友的办公软件的企业&#xff0c;有很多都经历了locked勒索病毒的攻击&#xff0c;导致企业服务器被加密无法正常使用&#xff0c;严重影响了企业的正常工作。通过云天数据恢复中心的解密恢复发现&#xff0c;在今年locked勒索病…

缓解Oracles数据库内存不足的问题

解决思路&#xff0c;调整内存参数&#xff1b; 安装Oracle时&#xff0c;为了均衡电脑性能和数据库性能&#xff0c;Oracle一个实例默认内存占用大小为物理内存的1/8。 如环境不需要分配那么大的内存来支撑Oracle&#xff0c;可通过修改 sga_max_size 的值来减少系统中内存占…

通信设备为什么需要接地阻?

在现代社会&#xff0c;通信设备已经成为我们生活中不可或缺的一部分。无论是手机、电视、计算机还是互联网路由器&#xff0c;它们都在不断地演进&#xff0c;以满足我们日益增长的通信需求。 实际应用中&#xff0c;我们都会了解到通信设备在正常运行时产生的电磁波辐射和电…

4K壁纸小程序源码 全内容自动采集

全内容自动采集 4K壁纸小程序源码&#xff0c;带流量主。用的都是一个接口&#xff0c;不过这个不知是谁改的&#xff0c;成了LSP版&#xff0c;是真色啊&#xff0c;专搜小姐姐。 4K壁纸&#xff0c;静态壁纸&#xff0c;头像等都有保留&#xff0c;界面广告位很多&#xff0c…

线性回归原理

1、 线性回归的原理 1.1 线性回归应用场景 房价预测 销售额度预测 金融&#xff1a;贷款额度预测、利用线性回归以及系数分析因子1.2 什么是线性回归 1.2.1定义与公式 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系…

Unity3D Shader新手入门教程:3D溶解与腐蚀特效详解

引言 在游戏开发中&#xff0c;特效是非常重要的一部分&#xff0c;它能够增加游戏的趣味性和可玩性。其中&#xff0c;Shader特效是一种非常常见和常用的特效&#xff0c;它能够通过改变物体表面的渲染方式来实现各种各样的特效效果。本文将详细介绍Unity3D中的Shader 3D溶解与…