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安装教程…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...