当前位置: 首页 > news >正文

Spring IOC使用DButil实现对数据库的操作

一、DButil、lombok、junit的简单介绍
1.dbutil

dbutil是由阿帕奇提供操作数据库的插件,其核心类为QueryRunner,存在方法 .query() 查询,.update() 增删改;

<!-- dbutil -->
<dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.4</version>
</dependency>
2.lombok插件

功能:对实体类自动、动态生成get、set方法,无参有参构造方法

步骤:

1.idea安装插件(只做一次)

2.添加坐标

<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version>
</dependency>

3.编写注解

3.junit测试

1.坐标

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

2.注解(修饰方法)

@Test======>可以运行的方法

@Before====>@Test运行之前

@After=====>@Test运行之后


测试类的两种方法:

public class test01 {ClassPathXmlApplicationContext applicationContext =null;IAccountController controller=null;@Beforepublic void before(){applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");controller = (IAccountController)applicationContext.getBean("controller");}@Testpublic void show1(){List<Account> list = controller.findAll();for (int i = 0; i < list.size(); i++) {Account account = list.get(i);System.out.println(account);}}@Afterpublic void after(){applicationContext.close();}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class test02 {@AutowiredIAccountController controller;@Testpublic void show2(){List<Account> all = controller.findAll();for (int i = 0; i < all.size(); i++) {Account account =  all.get(i);System.out.println(account);}}}

在配置文件pom.xml中写出相关坐标

<!--Spring-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.27</version>
</dependency><!--MySQL-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency><!--数据源-->
<dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version>
</dependency><!--junit-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency><!-- spring测试包 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.27</version>
</dependency><!-- dbutil -->
<dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.4</version>
</dependency>
二、使用XML配置文件

1.java对象(pojo)

实现get、set方法

public class Account implements Serializable {public int aid;public String aname;public int amoney;public Account(String aname, int amoney) {this.aname = aname;this.amoney = amoney;}public Account(int aid, String aname, int amoney) {this.aid = aid;this.aname = aname;this.amoney = amoney;}public Account() {}@Overridepublic String toString() {return "Account{" +"aid=" + aid +", aname='" + aname + '\'' +", amoney=" + amoney +'}';}public void setAid(int aid) {this.aid = aid;}public void setAname(String aname) {this.aname = aname;}public void setAmoney(int amoney) {this.amoney = amoney;}public int getAid() {return aid;}public String getAname() {return aname;}public int getAmoney() {return amoney;}
}

使用lombok插件会方便很多,不用自己写set\get方法以及构造方法,直接使用注解实现

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Account implements Serializable {public int aid;public String aname;public int amoney;public Account(String aname, int amoney) {this.aname = aname;this.amoney = amoney;}
}

2.控制层(controller)

  • 接口中定义了增删改查的方法
  • controller层需传入service层的对象,使用xml配置文件时,要对实现传入对象的set方法
  • 重写接口的方法
//接口中定义了增删改查的方法
public interface IAccountController {//查询全部账户public List<Account> findAll();//根据姓名查找账户public Account findByname(String name);//添加账户public void add(Account account);//修改账户public void update(Account account);//删除账户public void delete(int aid);}//实现类
public class AccountControllerImp implements  IAccountController{IAccountService service;public void setService(IAccountService service) {this.service = service;}@Overridepublic List<Account> findAll() {return service.findAll();}@Overridepublic Account findByname(String name) {return service.findByname(name);}@Overridepublic void add(Account account) {service.add(account);}@Overridepublic void update(Account account) {service.update(account);}@Overridepublic void delete(int aid) {service.delete(aid);}
}

3.业务层(service)

  • 接口中定义了增删改查的方法
  • service层需传入dao层的对象,使用xml配置文件时,要对实现传入对象的set方法
  • 重写接口的方法
public interface IAccountService {public List<Account> findAll();public Account findByname(String name);public void add(Account account);public void update(Account account);public void delete(int aid);public void transfer(String sourcename,String targetname,int money);
}public class AccountServiceImp  implements  IAccountService{IAccountDao dao;public void setDao(IAccountDao dao) {this.dao = dao;}@Overridepublic List<Account> findAll() {return dao.findAll();}@Overridepublic Account findByname(String name) {return dao.findByname(name);}@Overridepublic void add(Account account) {dao.add(account);}@Overridepublic void update(Account account) {dao.update(account);}@Overridepublic void delete(int aid) {dao.delete(aid);}
}

4.数据访问层(dao)

  • 接口中定义了增删改查的方法
  • dao层使用dbutil插件,故传入QueryRunner的对象,实现传入对象的set方法
  • 重写接口的方法,分别使用了QueryRunner类下的update方法和query方法
public interface IAccountDao {public List<Account> findAll();public Account findByname(String name);public void add(Account account);public void update(Account account);public void delete(int aid);
}

查询使用query方法,创建了BeanListHandler<类>(类.class),BeanHandler<类>(类.class)

增删改使用update方法

public class AccountDaoImp implements IAccountDao{QueryRunner run;public void setRun(QueryRunner run) {this.run = run;}@Overridepublic List<Account> findAll() {try {return run.query("select * from Account",new BeanListHandler<Account>(Account.class));} catch (SQLException throwables) {throwables.printStackTrace();}return  null;}@Overridepublic Account findByaid(int aid) {try {return run.query("select * from Account where aid=?",new BeanHandler<Account>(Account.class),aid);} catch (SQLException throwables) {throwables.printStackTrace();}return null;}@Overridepublic void add(Account account) {try {run.update("insert into Account(aname,amoney) value(?,?)",account.getAname(),account.getAmoney());} catch (SQLException throwables) {throwables.printStackTrace();}}@Overridepublic void update(Account account) {try {run.update("update Account set aname=?,amoney=?  where aid=?",account.getAname(),account.getAmoney(),account.getAid());} catch (SQLException throwables) {throwables.printStackTrace();}}@Overridepublic void delete(int aid) {try {run.update("delete from Account where aid=?",aid);} catch (SQLException throwables) {throwables.printStackTrace();}}
}

5.写配置文件applicationcontext.xml

<!--加载资源文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder><!--注入数据源-->
<!--将数据库的相关配置写在jdbc.properties文件中-->
<bean id="datasourse" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${msg1}"></property><property name="jdbcUrl" value="${msg2}"></property><property name="user" value="${msg3}"></property><property name="password" value="${msg4}"></property>
</bean><!--注入QueryRunner-->
<bean id="run" class="org.apache.commons.dbutils.QueryRunner"><constructor-arg name="ds" ref="datasourse"></constructor-arg>
</bean><!--注入Dao-->
<bean id="Dao" class="com.apesourse.dao.AccountDaoImp"><property name="run" ref="run"></property>
</bean><!--注入service-->
<bean id="Service" class="com.apesourse.service.AccountServiceImp"><property name="dao" ref="Dao"></property>
</bean><!--注入controller-->
<bean id="controller" class="com.apesourse.controller.AccountControllerImp"><property name="service" ref="Service"></property>
</bean>
三、使用注解和XML文件

1.java对象(pojo)

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Account implements Serializable {public int aid;public String aname;public int amoney;public Account(String aname, int amoney) {this.aname = aname;this.amoney = amoney;}
}

2.控制层(controller)

//接口中定义了增删改查的方法
public interface IAccountController {//查询全部账户public List<Account> findAll();//根据姓名查找账户public Account findByname(String name);//添加账户public void add(Account account);//修改账户public void update(Account account);//删除账户public void delete(int aid);}//实现类
@Controller("controller")
public class AccountControllerImp implements  IAccountController{@AutowiredIAccountService service;@Overridepublic List<Account> findAll() {return service.findAll();}@Overridepublic Account findByaid(int aid) {return service.findByaid(aid);}@Overridepublic void add(Account account) {service.add(account);}@Overridepublic void update(Account account) {service.update(account);}@Overridepublic void delete(int aid) {service.delete(aid);}
}

3.业务层(service)

public interface IAccountService {public List<Account> findAll();public Account findByname(String name);public void add(Account account);public void update(Account account);public void delete(int aid);public void transfer(String sourcename,String targetname,int money);
}@Service("service")
public class AccountServiceImp  implements  IAccountService{@AutowiredIAccountDao dao;@Overridepublic List<Account> findAll() {return dao.findAll();}@Overridepublic Account findByname(String name) {return dao.findByname(name);}@Overridepublic void add(Account account) {dao.add(account);}@Overridepublic void update(Account account) {dao.update(account);}@Overridepublic void delete(int aid) {dao.delete(aid);}
}

4.数据访问层(dao)

public interface IAccountDao {public List<Account> findAll();public Account findByname(String name);public void add(Account account);public void update(Account account);public void delete(int aid);
}
@Repository
public class AccountDaoImp implements IAccountDao{@AutowiredQueryRunner run;@Overridepublic List<Account> findAll() {try {return run.query("select * from Account",new BeanListHandler<Account>(Account.class));} catch (SQLException throwables) {throwables.printStackTrace();}return  null;}@Overridepublic Account findByaid(int aid) {try {return run.query("select * from Account where aid=?",new BeanHandler<Account>(Account.class),aid);} catch (SQLException throwables) {throwables.printStackTrace();}return null;}@Overridepublic void add(Account account) {try {run.update("insert into Account(aname,amoney) value(?,?)",account.getAname(),account.getAmoney());} catch (SQLException throwables) {throwables.printStackTrace();}}@Overridepublic void update(Account account) {try {run.update("update Account set aname=?,amoney=?  where aid=?",account.getAname(),account.getAmoney(),account.getAid());} catch (SQLException throwables) {throwables.printStackTrace();}}@Overridepublic void delete(int aid) {try {run.update("delete from Account where aid=?",aid);} catch (SQLException throwables) {throwables.printStackTrace();}}
}

5.写配置文件applicationcontext.xml

<!--加载资源文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--注入数据源-->
<bean id="datasourse" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${msg1}"></property><property name="jdbcUrl" value="${msg2}"></property><property name="user" value="${msg3}"></property><property name="password" value="${msg4}"></property>
</bean><!--注入QueryRunner-->
<bean id="run" class="org.apache.commons.dbutils.QueryRunner"><constructor-arg name="ds" ref="datasourse"></constructor-arg>
</bean><!--扫描-->
<context:component-scan base-package="com.apesourse"></context:component-scan>
四、使用注解(annoation)和配置类(Config)

1.配置类config

@Configuration
@PropertySource(value = "classpath:jdbc.properties")
public class DataConfig {@Value("${msg1}")private String driverClass;@Value("${msg2}")private String jdbcUrl;@Value("${msg3}")private String user;@Value("${msg4}")private String password;@Beanpublic DataSource datasourse(){try {ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();comboPooledDataSource.setDriverClass(driverClass);comboPooledDataSource.setJdbcUrl(jdbcUrl);comboPooledDataSource.setUser(user);comboPooledDataSource.setPassword(password);return comboPooledDataSource;} catch (PropertyVetoException e) {e.printStackTrace();}return null;}@Beanpublic QueryRunner queryRunner(){return new QueryRunner(datasourse());}
}
@Configuration
@ComponentScan(basePackages = "com.apesourse")
@Import(DataConfig.class)
public class applicationConfig {
}

2.配置文件只有jdbc.properties,数据库的driver,URL,user,password

3.控制层、业务层、数据访问层的代码同上(使用注解完成)

相关文章:

Spring IOC使用DButil实现对数据库的操作

一、DButil、lombok、junit的简单介绍 1.dbutil dbutil是由阿帕奇提供操作数据库的插件&#xff0c;其核心类为QueryRunner&#xff0c;存在方法 .query() 查询&#xff0c;.update() 增删改&#xff1b; <!-- dbutil --> <dependency><groupId>commons-d…...

Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…...

vue中怎么自定义组件

目录 一&#xff1a;功能描述 二&#xff1a;实现过程 一&#xff1a;功能描述 在开发过程中我们经常需要自定义组件完成特定的功能&#xff0c;比如用户详情页&#xff0c;我增加一个调整余额的按钮&#xff0c;点击以后需要打开一个调整余额对话框&#xff0c;输入调整的金…...

BM1反转链表[栈+头插法]

题目要求如下: 问题比较简单,就是将链表中的值进行反转即可。 一种比较简单的方式是使用栈链表的方式来实现,下面是相应的代码: #include <stdio.h> #include <stdlib.h> int arr[10001] {0}; struct ListNode* ReverseList(struct ListNode* head ) {if (head …...

VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔

使用 PMAlign和Fixture固定Blob工具检测孔 这个示例演示了如何使用 PMAlign 工具和 Fixture 工具来夹持一个 Blob 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时&#xff0c;将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换…...

学单片机怎么在3-5个月内找到工作?

每个初学者&#xff0c;都如履薄冰&#xff0c;10几年前&#xff0c;我自学单片机时&#xff0c;也一样。 想通过学习&#xff0c;找一份体面点的工作&#xff0c;又害怕辛辛苦苦学出来&#xff0c;找不到工作。 好在&#xff0c;当初执行力&#xff0c;还算可以&#xff0c;自…...

探索设计模式:观察者模式

探索设计模式&#xff1a;观察者模式 &#x1f9d0;观察者模式简介:gem:核心概念:rainbow:观察者模式的优点:truck:实现步骤1. 定义主题接口2. 实现观察者接口3. 具体主题实现4. 具体观察者实现5. 调用 :triangular_flag_on_post:总结 在实际开发过程中&#xff0c;设计模式的作…...

gradio之持续输入,持续输出(流式)

流式输出yield,比如一个输出控件&#xff0c;想要实时显示内容&#xff0c;用return for循环一次就返回去了。而用yield会持续更新往下执行 for i in range(length):time.sleep(8)yield 总共str(length)条语料&#xff0c;已运行str(i1)条 在Gradio中&#xff0c;某些组件&am…...

Git 常用命令指南:从入门到精通

文章目录 前言1. 初始化一个Git仓库2. 克隆远程仓库3. 查看仓库状态4. 添加文件到暂存区5. 提交代码6. 推送到远程仓库7. 拉取远程仓库的更改8. 分支管理9. 查看提交历史10. 回退到某个版本结语 前言 如果你是一位开发者或者对代码感兴趣&#xff0c;那么你一定听说过Git。Git…...

Camera驱动 汇总表【小驰行动派】

在做Camera BringUp的时候&#xff0c;如果有已经点亮过的驱动源码&#xff0c;对我们的帮助将会非常的大&#xff0c;可以大大加快我们点亮进度。 所以我决定整理汇总接触过得Camera驱动信息。如果你刚好有需要&#xff0c;可以加我薇咨询&#xff08;该资料整理比较花时间&a…...

SSRS rdlc报表 九 在.net core中使用RDLC报表

开发环境 vs 2022企业版 SqlServer数据库 Win11 前言 rdlc报表在aspx中集成的很好,很容易实现,并且功能强大,但随着技术的发展,aspx慢慢的被淘汰,现在已经发展到.net8了,aspx基本上很少用,出的新框架基本上也都是前后端分离,没了aspx的控件加持,rdlc这么厉害的报…...

力扣(2024.08.10)

1. 222&#xff1a;完全二叉树的节点个数 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(…...

Django-文件上传

## Django文件上传需要考虑的重要事项 > 文件或图片一般通过表单进行。用户在前端点击文件上传&#xff0c;然后以POST方式将数据和文件提交到服务器。服务器在接收到POST请求后需要将其存储在服务器上的某个地方。Django默认的存储地址是相对于根目录的/media/文件夹&…...

[Meachines] [Easy] valentine SSL心脏滴血+SSH-RSA解密+trp00f自动化权限提升+Tmux进程劫持权限提升

信息收集 IP AddressOpening Ports10.10.10.79TCP:22,80,443 $ nmap 10.10.10.79 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 96:4c:51:42:…...

利用单张/多张图内参数标定 OpenCV Python

E:\OpenCV_py_ws\opencv相机标定\图片\calib-JT.py #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2023/11/21 16:05 # @File : calib.py # @Software: import cv2 import numpy as np import glob from datetime import datetimenp.set_printoptions(supp…...

The Llama 3 Herd of Models 第7部分视觉实验部分全文

第1,2,3部分,介绍、概览和预训练 第4部分,后训练 第5部分,结果 第6部分,推理 7 Vision Experiments 我们进行了一系列的实验,在这些实验中,我们通过一种由两个主要阶段组成的合成方法将视觉识别能力整合到Llama 3中。首先,我们通过在大量图像-文本对上引入和训练两种…...

亚信安慧AntDB-T:使用Brin索引提升OLAP查询性能以及节省磁盘空间

前 言 在这个信息量爆炸的时代&#xff0c;数据库面临着海量数据的挑战&#xff0c;如何提升OLAP业务的查询性能、如何节省磁盘空间等问题已经成为了数据库的痛点之所在。本篇着重介绍亚信安慧AntDB-T中Brin索引的实现过程以及应用在OLAP业务中带来的性能提升和存储降低。 亚…...

web渗透测试常用命令

Web Application TTPs HPING3 DoS hping3 targetiP --flood --frag --spoof ip --destport # --synHydra Online Brute Force hydra -1 ftp -P words -v targetiP ftpDownload HTTP File and Execute...

Kylin系列(二)使用

接上一章《Kylin系列(一)入门》 1. Kylin使用 1.1. 数据准备 1.1.1. 数据导入 在使用Apache Kylin时,数据导入是一个非常重要的环节,因为它直接影响到Kylin的性能、稳定性和易用性。以下是关于Apache Kylin数据导入的一些详细介绍: 导入数据的准备 在开始导入数据之前…...

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…...

2.4 大模型数据基础:预训练阶段数据详解 ——《带你自学大语言模型》系列

​本系列目录 《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a;带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型 1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xf…...

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…...

UML建模-测试用例

用例可用于测试系统的正确性和有效性。 正确性表明系统的实现符合规格说明。有效性保证开发的系统是用户真正需要的系统。有效性检查一般在 系统开发之前进行。当用例模型构造完成后&#xff0c;开发者将模型交给用户讨论&#xff0c;由用户检查模型能否满足他们对系统的需求。…...

Python知识点:如何使用Socket模块进行网络编程

Python 的 socket 模块提供了一个底层网络接口&#xff0c;允许你通过编程进行网络通信。使用 socket 模块可以编写客户端和服务器端程序&#xff0c;从而实现数据在网络上的传输。以下是如何使用 socket 模块进行网络编程的详细说明。 1. 创建一个 Socket 首先&#xff0c;你…...

培训第二十一天(mysql用户创建与授权、角色创建)

上午 1、环境准备 [rootmysql ~]# rm -rf /etc/my.cnf //清空/etc目录下的my.cnf[rootmysql ~]# yum -y remove mariadb //移除mariadb[rootmysql ~]# find / -name "*mysql*" -exec rm -rf {} \; //删除mysql所有遗留文件 2、安装mysql绿包 [rootmysql ~]…...

makefile基本语法

在编写复杂的程序项目时&#xff0c;Makefile 是一个非常有用的工具&#xff0c;它能自动化构建过程。以下是一些基本的 Makefile 语法介绍&#xff1a; 基本结构&#xff1a; target: dependenciescommandtarget&#xff1a;构建目标&#xff0c;通常是一个文件&#xff0c;如…...

白骑士的PyCharm教学实战项目篇 4.4 大数据处理与分析

系列目录 上一篇&#xff1a;白骑士的PyCharm教学实战项目篇 4.3 自动化测试与持续集成​​​​​​​ 随着数据量的爆炸性增长&#xff0c;大数据处理与分析成为现代数据科学的重要课题。PyCharm提供了强大的功能&#xff0c;可以帮助开发者高效地进行大数据环境的配置与连接…...

无人机之民用无人机用途分类篇

一、航拍无人机 用于航拍摄影和电影制作&#xff0c;提供空中视角的拍摄服务。可用于电影制作、广告拍摄、房地产销售等。 二、物流无人机 用于快递和货物运输&#xff0c;提高物流效率&#xff0c;可以到达传统配送方式难以覆盖的地区&#xff0c;在突发事件如自然灾害、疫…...

Android10 修改设备名称

A10和A12的设备名称修改是不同的&#xff0c;A10设备名称修改分好几个位置 修改wifi默认名称 在framework/base模块下 diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9041a7c3a14..7a1e63688c4 100644 --- a/core/res/res/values/…...

go testing 包

Go语言的testing包提供了一套丰富的测试工具&#xff0c;用于编写和运行测试用例。以下是testing包中一些常用的函数和类型&#xff1a; func TestMain(m *testing.M): 这是一个特殊的函数&#xff0c;用于执行测试的主函数。如果定义了TestMain&#xff0c;那么在运行go test时…...