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是由阿帕奇提供操作数据库的插件,其核心类为QueryRunner,存在方法 .query() 查询,.update() 增删改; <!-- dbutil --> <dependency><groupId>commons-d…...
Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…...
vue中怎么自定义组件
目录 一:功能描述 二:实现过程 一:功能描述 在开发过程中我们经常需要自定义组件完成特定的功能,比如用户详情页,我增加一个调整余额的按钮,点击以后需要打开一个调整余额对话框,输入调整的金…...
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 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时,将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换…...
学单片机怎么在3-5个月内找到工作?
每个初学者,都如履薄冰,10几年前,我自学单片机时,也一样。 想通过学习,找一份体面点的工作,又害怕辛辛苦苦学出来,找不到工作。 好在,当初执行力,还算可以,自…...
探索设计模式:观察者模式
探索设计模式:观察者模式 🧐观察者模式简介:gem:核心概念:rainbow:观察者模式的优点:truck:实现步骤1. 定义主题接口2. 实现观察者接口3. 具体主题实现4. 具体观察者实现5. 调用 :triangular_flag_on_post:总结 在实际开发过程中,设计模式的作…...
gradio之持续输入,持续输出(流式)
流式输出yield,比如一个输出控件,想要实时显示内容,用return for循环一次就返回去了。而用yield会持续更新往下执行 for i in range(length):time.sleep(8)yield 总共str(length)条语料,已运行str(i1)条 在Gradio中,某些组件&am…...
Git 常用命令指南:从入门到精通
文章目录 前言1. 初始化一个Git仓库2. 克隆远程仓库3. 查看仓库状态4. 添加文件到暂存区5. 提交代码6. 推送到远程仓库7. 拉取远程仓库的更改8. 分支管理9. 查看提交历史10. 回退到某个版本结语 前言 如果你是一位开发者或者对代码感兴趣,那么你一定听说过Git。Git…...
Camera驱动 汇总表【小驰行动派】
在做Camera BringUp的时候,如果有已经点亮过的驱动源码,对我们的帮助将会非常的大,可以大大加快我们点亮进度。 所以我决定整理汇总接触过得Camera驱动信息。如果你刚好有需要,可以加我薇咨询(该资料整理比较花时间&a…...
SSRS rdlc报表 九 在.net core中使用RDLC报表
开发环境 vs 2022企业版 SqlServer数据库 Win11 前言 rdlc报表在aspx中集成的很好,很容易实现,并且功能强大,但随着技术的发展,aspx慢慢的被淘汰,现在已经发展到.net8了,aspx基本上很少用,出的新框架基本上也都是前后端分离,没了aspx的控件加持,rdlc这么厉害的报…...
力扣(2024.08.10)
1. 222:完全二叉树的节点个数 # 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文件上传需要考虑的重要事项 > 文件或图片一般通过表单进行。用户在前端点击文件上传,然后以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查询性能以及节省磁盘空间
前 言 在这个信息量爆炸的时代,数据库面临着海量数据的挑战,如何提升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安装教程…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
