Java——数据库编程JDBC之JDBCTemplate的使用简化数据库操作步骤(含增删改查练习实例源码)
时间:2022-07-25
本文章向大家介绍Java——数据库编程JDBC之JDBCTemplate的使用简化数据库操作步骤(含增删改查练习实例源码),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0 引言
上一篇博文中讲解了数据库连接池技术,使用该技术代码的复用度和效率均有提高,但是在做JDBC操作时还是比较麻烦,特别是处理查询结果时,要从结果集中获取数据,再封装成对象等等。
实际上我们希望的最理想操作就是定义好sql,再把它执行了,像抽取数据再封装、释放资源等这样的体力活不希望自己来做,本文介绍一个JDBC 简单封装类Spring JDBC,简化程序开发步骤。
1 Spring JDBC
其是Spring框架对JDBC的简单封装(Spring框架是JavaEE的灵魂框架,后续再学习总结),它提供了一个JDBC Template对象来简化JDBC的开发。
1.1 JDBCTemplate使用步骤
使用步骤:
- 1)导入5个jar包(同样也需要数据库连接池和驱动的jar包);
- 2)创建JDBCTemplate对象,依赖于数据源DataSource;
- 3)调用JDBCTemplate的方法来完成CRUD的操作: update方法:执行DML增删改语句; query方法:queryForMap(),查询结果,将结果集封装为Map集合,将列名作为key,将值作为value,注意:查询的结果集长度只能是1; queryForList(),查询结果,将结果集封装为List集合,将每一条记录封装为一个Map集合,再将Map集合装载至List集合; query(),查询结果,将结果封装为JavaBean对象(最为常用),其参数:一般使用BeanPropertyRowMapper<JavaBean>(JavaBean.class),可以实现数据到JavaBean的自动封装。 queryForObject(),查询结果,将结果封装为对象。一般用于聚合函数的查询。
【举例】JdbcTemplate入门程序,实现一行数据的更新
public class JdbcTemplateDemo1 {
public static void main(String[] args) {
//1、导入jar包
//2、创建JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
//3、调用方法
String sql = "update account set balance = 5000 where id = ?";
int count = template.update(sql, 1);
System.out.println(count); //返回值为1
}
}
以上入门程序可以看出,使用JdbcTemplate极大的简化了程序,方便用户操作(其中JdbcUtils是Druid的工具类,请查看上一篇博客中有提供源码)。
1.2 JDBCTemplate练习
以本地数据库db1的emp表为练习对象,需求:
- 1)修改id=1的salary为888;
- 2)添加一条记录;
- 3)删除刚才添加的记录;
- 4)查询id=1的记录,将结果封装为Map集合;
- 5)查询所有记录,将其封装为List集合;
- 6)查询所有记录,将其封装为Emp对象的List集合;
- 7)查询总记录数。
【原表数据】:
【Junit测试用例】:
public class JdbcTemplateDemo2 {
//Juint单元测试,让方法独立执行,不依赖于主方法
//1、获取JdbcTemplate对象
private JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
// 1)修改id=1的salary为888;
@Test
public void test1(){
String sql = "update emp set salary = 888 where id = 1";
int count = template.update(sql);
System.out.println(count);
}
// 2)添加一条记录;
@Test
public void test2(){
String sql = "insert into emp(id,name,gender,salary,join_date,dept_id) values(6,'张三','男',100,'2020-01-01',1) ";
int count = template.update(sql);
System.out.println(count);
}
// 3)删除刚才添加的记录;
@Test
public void test3(){
String sql = "delete from emp where id = ?";
int count = template.update(sql,6);
System.out.println(count);
}
// 4)查询id=1的记录,将结果封装为Map集合;
@Test
public void test4(){
String sql = "select * from emp where id = ?";
Map<String, Object> map = template.queryForMap(sql, 1);
System.out.println(map);
//结果:{id=1, NAME=孙悟空, gender=男, salary=888.0, join_date=2013-02-24, dept_id=1}
}
// 5)查询所有记录,将其封装为List集合;
@Test
public void test5(){
String sql = "select * from emp";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
/* {id=1, NAME=孙悟空, gender=男, salary=888.0, join_date=2013-02-24, dept_id=1}
{id=2, NAME=猪八戒, gender=男, salary=3600.0, join_date=2010-12-02, dept_id=2}
{id=3, NAME=唐僧, gender=男, salary=9000.0, join_date=2008-08-08, dept_id=2}
{id=4, NAME=白骨精, gender=女, salary=5000.0, join_date=2015-10-07, dept_id=3}
{id=5, NAME=蜘蛛精, gender=女, salary=4500.0, join_date=2011-03-14, dept_id=1}*/
}
// 6)查询所有记录,将其封装为Emp对象的List集合;
@Test
public void test6() {
String sql = "select * from emp";
List<Emp> empList = template.query(sql, new RowMapper<Emp>() {
@Override
public Emp mapRow(ResultSet rs, int i) throws SQLException {
Emp emp = new Emp();
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
double salary = rs.getDouble("salary");
Date join_date = rs.getDate("join_date");
int dept_id = rs.getInt("dept_id");
emp.setId(id);
emp.setName(name);
emp.setGender(gender);
emp.setSalary(salary);
emp.setJoin_date(join_date);
emp.setDept_id(dept_id);
return emp;
}
});
for (Emp emp : empList) {
System.out.println(emp);
}
}
/* Emp{id=1, name='孙悟空', gender='男', salary=888.0, joindate=2013-02-24, dept_id=1}
Emp{id=2, name='猪八戒', gender='男', salary=3600.0, joindate=2010-12-02, dept_id=2}
Emp{id=3, name='唐僧', gender='男', salary=9000.0, joindate=2008-08-08, dept_id=2}
Emp{id=4, name='白骨精', gender='女', salary=5000.0, joindate=2015-10-07, dept_id=3}
Emp{id=5, name='蜘蛛精', gender='女', salary=4500.0, joindate=2011-03-14, dept_id=1}*/
// 6)查询所有记录,将其封装为Emp对象的List集合;简化的形式
@Test
public void test6_2() {
String sql = "select * from emp";
List<Emp> empList = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp : empList) {
System.out.println(emp);
}
}
//7)查询总记录数
@Test
public void test7() {
String sql = "select count(id) from emp";
Long total = template.queryForObject(sql, Long.class); //一般来执行聚合函数
System.out.println(total); //5
}
}
———————————————————————————————————————
本文为博主原创文章,转载请注明出处!
- Silverlight:双向绑定综合应用-多集合的依赖绑定
- python sorted排序用法详解
- Silverlight:MouseDragElementBehavior无法应用于ListBox的变相解决办法
- Silverlight:xap包(或本地缓存)下载版本更新的解决思路
- Web开发感悟:数据绑定是一种技术,更是一门艺术
- 我国域名注册保有量位居世界第二,顶级域名55个
- Silverlight:纠结的快捷键问题
- “default关键字”与“序列化传输”的注意事项
- 常见排序算法-Python实现
- 免费域名与收费域名的差别有哪些?
- c++学习笔记之封装篇(上)
- c++学习笔记之继承篇
- c++学习笔记之继承篇
- silverlight:对象拖动的优雅解决方案
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 图解面试题:如何找到喜欢的电影?
- Java agent 与 byte buddy
- 关于TRTC云端混流的踩坑分享
- 聊聊dubbo-go的ConsistentHashLoadBalance
- R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型
- R语言使用随机技术差分进化算法优化的Nelson
- R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析
- R语言和QuantLib中Nelson-Siegel模型收益曲线建模分析
- 用R语言用Nelson Siegel和线性插值模型对债券价格和收益率建模
- R语言LME4混合效应模型研究教师的受欢迎程度
- R语言Black Scholes和Cox-Ross-Rubinstein期权定价模型案例
- R语言中的风险价值模型度量指标TVaR与VaR
- R语言用线性回归模型预测空气质量臭氧数据
- R语言线性模型臭氧预测: 加权泊松回归,普通最小二乘,加权负二项式模型
- R语言中回归和分类模型选择的性能指标