Spring JDBC - Spring JDBC模版使用

news2024/11/24 16:08:49

前言

        Spring JdbcTemplate是Spring Framework提供的一个强大的数据库访问工具,它简化了数据库操作的过程,为开发者提供了一个高级的数据库访问抽象层。

        JdbcTemplate是Spring JDBC模块中的一个核心类,它位于org.springframework.jdbc.core包中。

        JdbcTemplate通过封装JDBC的核心功能,如数据库连接管理、SQL执行、参数绑定、结果集提取、异常处理等,使得数据库操作变得更加简单和高效。

1 使用Spring JDBC 模版

  • Spring的JDBC框架将数据访问的过程中获取连接、释放资源、异常处理、遍历查询结果等必须的样板代码封装隐藏到模板类之下,从而简化我们的JDBC 代码.
  • Spring针对JDBC提供了3个模板类
    • JdbcTemplate:Spring 里最基本的 JDBC 模板,利用 JDBC 和简单的索引参数查询提供对数据库的简单访问。
    • NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数,这有利于简化动态组合条件查询的实现,也不容易搞混参数
    • SimpleJdbcTemplate:利用Java 5的特性,比如自动装箱、泛型(generic)和可变参数列表来简化JDBC模板的使用。

1.1 使用JdbcTemplate

  • 将JdbcTemplate配置成bean
  • 注入DataSource
<bean id="jdbcTemplate" class="….jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"/>
</bean>
  • 案例:完成scott中员工信息的增删查改操作

EmpDao:

public interface EmpDao {

	List<Emp> search();
	List<Emp> search(Emp e);
	Emp findById(int empno);
	void save(Emp e);
	void update(Emp e);
	void delete(int empno);
}

Dao的实现类: 

public class EmpDaoJdbcTemplate implements EmpDao {
 
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
    	……
}
  • 案例:员工信息的插入操作
  • JdbcTemplate
    • public int update(String sql,Object...args)
public void save(Emp e) {
     String sql = "insert into emp (empno,ename,deptno) values (?,?,?)";
     Object[] params = 
	newObject[]{e.getEmpno(), e.getEname(), e.getDept().getDeptno()};
     jdbcTemplate.update(sql, params);
}

传递参数时,可以按顺序依次传参,也可以封装成一个Object数组进行传参。

测试类:

@Test
public void testSave() throws Exception {
	Emp emp = new Emp(1012,"员工测试",new Dept(40));
	dao.save(emp);
}
  •  案例:实现无参的search方法
  • JdbcTemplate的query方法
    • 一个字符串,SQL语句
    • 一个RowMapper对象,从ResultSet里提取数值并构造一个实体对象返回,在这里就是员工对象。
public List<Emp> search() {
	String sql = "select e.empno,e.ename,d.deptno,d.dname from emp e inner join dept d on e.deptno = d.deptno ";
	RowMapper rowMapper = new ParameterizedRowMapper<Emp>() 
	{
		@Override
		public Emp mapRow(ResultSet rs, int rowNum) …{
			Emp e = new Emp();
			e.setEmpno(rs.getInt("empno"));
			e.setEname(rs.getString("ename"));
			Dept d = new Dept();
			d.setDeptno(rs.getInt("deptno"));
			d.setDname(rs.getString("dname"));
			e.setDept(d);
			return e;
		}
	};
	List<Emp> list = jdbcTemplate.query(sql,rowMapper);	
	return list;
}
  • search()、findById()和search(Emp e)都需要使用同一个RowMapper对象
  • 定义成EmpDao接口的一个公共静态常量属性
public static final RowMapper rowMapper = new ParameterizedRowMapper<Emp>() {
	@Override
	public Emp mapRow(ResultSet rs, int rowNum) throws SQLException {
		Emp e = new Emp();
		e.setEmpno(rs.getInt("empno"));
		e.setEname(rs.getString("ename"));
		Dept d = new Dept();
		d.setDeptno(rs.getInt("deptno"));
		d.setDname(rs.getString("dname"));
		e.setDept(d);
		return e;
	}
};
List<Emp> list = jdbcTemplate.query(sql,rowMapper);//精减后的代码
  • 案例:实现findById方法
  • findById方法与search相同,仅有两点不同
    • 需要传递查询条件
    • 仅返回一个员工对象而不是一个员工对象集合
public Emp findById(int empno) {
	String sql = "select e.empno,e.ename,d.deptno,d.dname from emp e 
	inner join dept d on e.deptno = d.deptno where empno = ?";
 
	List<Emp> list = jdbcTemplate.query(sql, rowMapper,empno);
	return list.size()>0?(Emp)list.get(0):null;
}
  • 案例:实现search(Emp e)方法
  • 根据用户在多个查询条件中选填后得到动态组合查询的效果。
  • 两个查询条件,员工姓名和所属部门。
    • 无条件查询
    • 仅填写姓名,进行模糊查询
    • 仅选择部门,查询谋部门的所有员工
    • 既填写姓名又选择部门,查询谋部门符合姓名条件的员工信息

public List<Emp> search(Emp e) {
StringBuilder sql = new StringBuilder("select empno,ename,d.deptno,dname from…");
 
List plist = new ArrayList();
if(e!=null){
	if(e.getEname()!=null && e.getEname().trim().length()!=0){
		sql.append(" and e.ename like ?");
		plist.add("%"+e.getEname()+"%");
	}
	if(e.getDept()!=null && e.getDept().getDeptno()!=null 
			&&  e.getDept().getDeptno()>0){
		sql.append(" and d.deptno = ?");
		plist.add(e.getDept().getDeptno());
}}
Object[] params = plist.toArray();
List<Emp> list = jdbcTemplate.query(sql.toString(),params,rowMapper);
return list;}

如果符合条件就拼接对应的where条件,达到多条件查询的效果。

 1.2 使用NamedParameterJdbcTemplate

  • 案例:save方法实现中使用了索引参数
  • 注意参数在SQL语句里的次序
  • 以正确次序设置对应参数的值
  • 改变参数的次序,值的次序也必须随之改变
  • 使用命名参数
insert into emp ( empno , ename , deptno ) 
values ( :empno, :ename, :deptno)
  • 次序是没有关系的
  • 用名称绑定每个值
  • 参数次序改变,不需要修改参数绑定的代码

代码实现:

  • JDBC 模板:NamedParameterJdbcTemplate

spring.xml(spring的配置文件):

<bean id="namedParameterJdbcTemplate"
	class="…jdbc.core.namedparam.NamedParameterJdbcTemplate">
	<constructor-arg ref="dataSource"/>
</bean>

 java代码:

@Component("empDaoNamedParam")
public class EmpDaoNamedParameter implements EmpDao {
 
	@Resource(name="namedParameterJdbcTemplate")
	private NamedParameterJdbcTemplate  jdbcTemplate;
	……
}

案例: 

  •  案例:使用命名参数的save方法
  • 案例:只有一个参数的findById方法
  • 案例:search方法,查询所有员工
public int save(Emp e) {
String sql = "insert into emp (empno,ename,deptno) " +
	     "values (:empno,:ename,:deptno)";		
	Map params = new HashMap();
	params.put("empno", e.getEmpno());
	params.put("ename", e.getEname());
	params.put("deptno", e.getDept().getDeptno());
	return jdbcTemplate.update(sql, params);
}
public Emp findById(int empno) {
 
	String sql = "select e.empno,e.ename,d.deptno,d.dname from emp e inner join dept d on e.deptno = d.deptno where empno = :empno";
		
	Map params = new HashMap();
	params.put("empno", empno);
		
	List<Emp> list = jdbcTemplate.query(sql, params,rowMapper);
	return list.size()>0?(Emp)list.get(0):null;
}
public List<Emp> search() {

String sql = "select e.empno,e.ename,d.deptno,d.dname from 
emp e inner join dept d on e.deptno = d.deptno ";

List<Emp> list = jdbcTemplate.query(sql,new HashMap(),rowMapper);
		
return list;
}

2 使用Spring 对 JDBC的 DAO支持类

  • 存在问题
    • JDBC的全部DAO类,需要一个JdbcTemplate属性和一个设置方法
    • 把JdbcTemplate Bean装配到每个DAO的JdbcTemplate属性
    • 多个DAO,产生很多重复代码
  • 解决方案
    • 全部DAO 对象创建一个通用父类 在其中设置 JdbcTemplate 属性,
    • 全部 DAO 继承这个类,使用父类的JdbcTemplate进行数据访问,
    • Spring恰好提供了这样一些基类。

2.1 使用JdbcDaoSupport

  • Spring 的 JdbcDaoSupport 就是用于编写基于JDBC 的DAO 类的基类
  • 自己的DAO类继承它即可
package dao.support;
public class EmpDaoJdbcSupport extends JdbcDaoSupport implements EmpDao{
     ……省略方法
}
public int save(Emp e) {
	String sql = "insert into emp (empno,ename,deptno) values (?,?,?)";
		
	Object[] params = new Object[]{
		e.getEmpno(),e.getEname(),e.getDept().getDeptno()};
 	//调用父类的方法
	return getJdbcTemplate().update(sql, params);
}
  • JdbcTemplate属性定义在父类JdbcDaoSupport中
  • 无法使用注解,因为添加注解需要修改源代码
  • 只能使用xml方式配置
<bean id="empDaoJdbcSupport" class="dao.support.EmpDaoJdbcSupport">
	<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

2.2 使用NamedParameterJdbcDaoSupport

  • 使用命名参数形式
  • 让Dao类继承NamedParameterJdbcDaoSupport类
package dao.support;
public class EmpDaoNamedJdbcSupport extends NamedParameterJdbcDaoSupport
implements EmpDao{
     ……省略方法
}
  •  调用父类的getNamedParameterJdbcTemplate()方法返回一个NamedParameterJdbcTemplate对象
  • 可以使用命名参数的形式编写dao操作
public int save(Emp e) {
	String sql = "insert into emp (empno,ename,deptno) values "+
		   "(:empno,:ename,:deptno)";
	Map params = new HashMap();
	params.put("empno", e.getEmpno());
	params.put("ename", e.getEname());
	params.put("deptno", e.getDept().getDeptno());
 
	return getNamedParameterJdbcTemplate().update(sql, params);
}
  • bean配置
<bean id="empDaoNamedJdbcSupport" 	class="dao.support.EmpDaoNamedJdbcSupport">
		<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

总结

主要介绍如何使用Spring JDBC模版,以及使用Spring对JDBC的DAO支持类

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

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

相关文章

开源项目都是怎么推广的?

大家好&#xff0c;我是爱折腾的刘大逵。跟我接触过的技术们都知道&#xff0c;一年一年的都在折腾着做一些项目&#xff0c;年年有进步&#xff0c;年年有想法&#xff0c;年年在折腾。今天给大家分享GITEE如何上推荐&#xff01; GITEE推荐有什么用&#xff1f; 众所周知&a…

C++版iwanna2

第二篇目录 程序的流程图程序游玩的效果下一篇博客要说的东西 程序的流程图 #mermaid-svg-lFW0ZjCdi5Xvl3gE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lFW0ZjCdi5Xvl3gE .error-icon{fill:#552222;}#mermaid-s…

《神经网络》—— 循环神经网络RNN(Recurrent Neural Network)

文章目录 一、RNN 简单介绍二、RNN 基本结构1.隐藏中的计算2.输出层的计算3.循环 三、RNN 优缺点1.优点2.缺点 一、RNN 简单介绍 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据的神经网络架构。 与传统的前馈神经网络&#xff08…

聆听国宝“心声” 《寻找国宝传颂人——中国国宝大会》走进辽宁

热爱不止&#xff0c;传颂不停。近日&#xff0c;中央广播电视总台《寻找国宝传颂人——中国国宝大会》大型融媒体活动在辽宁省博物馆开展第二场地方展演。辽宁省博物馆是新中国成立后的第一座博物馆&#xff0c;馆藏文物近12万件&#xff0c;珍贵文物数万件&#xff0c;且以藏…

计算机网络:数据链路层详解

目录 一、点对点信道&#xff1a; &#xff08;1&#xff09;封装成帧 &#xff08;2&#xff09;透明传输 &#xff08;3&#xff09;差错检测 二、点对点协议 &#xff08;1&#xff09;数据链路层的特点 &#xff08;2&#xff09;PPP协议的组成 &#xff08;3&…

“我养你啊“英语怎么说?别说成I raise you!成人学英语到蓝天广场附近

“我养你啊”这句经典台词出自周星驰自导自演的电影《喜剧之王》。在这部电影中&#xff0c;周星驰饰演的尹天仇对张柏芝饰演的柳飘飘说出了这句深情而动人的台词。这句台词出现在柳飘飘即将离去之时&#xff0c;尹天仇鼓起勇气&#xff0c;用它作为对柳飘飘个人困境的承诺&…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

pycharm生成的exe执行后报错

元素 application 显示为元素 urn:schemas-microsoft-com:asm.v1^dependentAssembly (此版本的 Windows 不支持)的子元素。 日志名称: Application 来源: SideBySide 日期: 2024/10/8 14:14:12 事件 ID: 72 任务类别: 无 级别…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

UE4 材质学习笔记05(凹凸偏移和视差映射/扭曲着色器)

一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低&#xff0c;只有256*256&#xff0c;事实上&#xff0c;如果高度图的分辨率比较低并且有点模糊&#xff0c;效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中&#xff0c; 之后利用得到…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构&#xff0c;CSS美化界面&#xff0c;点击注册&#xff0c;跳转到注册界面&#xff0c;均为静态网页&#xff0c;是课上的一个小作业~ 使用正则表达式对输入进行验证&#xff0c;包括邮箱格式验证&#xff0c;用户名格式验证。 正则…

MATLAB数字水印系统

课题介绍 本课题为基于MATLAB的小波变换dwt和离散余弦dct的多方法对比数字水印系统。带GUI交互界面。有一个主界面GUI&#xff0c;可以调用dwt方法的子界面和dct方法的子界面。流程包括&#xff0c;读取宿主图像和水印图像&#xff0c;嵌入&#xff0c;多种方法的攻击&#xf…

九、4 串口接收(代码)

&#xff08;1&#xff09;在发送的基础上加上接收的部分 RX对应PA10&#xff0c;需要初始化PA10 &#xff08;2&#xff09;串口配置 如果使用查询&#xff0c;到这里就结束了&#xff0c;如果使用中断还需要在串口配置下面开启中断&#xff0c;配置NVIC &#xff08;3&…

《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

目录 一、关于word2vec 1、什么是word2vec 2、常用训练算法 1&#xff09;CBOW 2&#xff09;SkipGram 二、关于npy、npz文件 1、npy文件 1&#xff09;定义 2&#xff09;特性 3&#xff09;用途 4&#xff09;保存及读取 运行结果&#xff1a; 运行结果&#xf…

使用.mdf及.ldf恢复SQL SERVER数据库

文章目录 [toc]1.使用.mdf和对应的.ldf文件恢复数据库1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下1.2 打开SSMS 1.使用.mdf和对应的.ldf文件恢复数据库 1.1 将对应的.mdf和.ldf复制到SQL SERVER路径下 一般默认路径是&#xff1a;C:\Program Files\Microsoft SQL Server\MS…

【源码+文档】基于Java的新能源停车场管理系统的设计与实现

&#x1f6a9;如何选题&#xff1f; 如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;这些问题是需要大家在选题前需要考虑的&#xff0c;具体的方法我会在文末详细为你解答。 &#x1f6ad;如何快速熟悉一个项…

Pywinauto,一款 Win 自动化利器!

1.安装 pywinauto是一个用于自动化Python模块&#xff0c;适合Windows系统的软件&#xff08;GUI&#xff09;&#xff0c;可以通过Pywinauto遍历窗口&#xff08;对话框&#xff09;和窗口里的控件&#xff0c;也可以控制鼠标和键盘输入&#xff0c;所以它能做的事情比之前介…

Python酷库之旅-第三方库Pandas(137)

目录 一、用法精讲 616、pandas.plotting.andrews_curves方法 616-1、语法 616-2、参数 616-3、功能 616-4、返回值 616-5、说明 616-6、用法 616-6-1、数据准备 616-6-2、代码示例 616-6-3、结果输出 617、pandas.plotting.autocorrelation_plot方法 617-1、语法…

机器学习篇-day03-线性回归-正规方程与梯度下降-模型评估-正则化解决模型拟合问题

一. 线性回归简介 定义 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 回归方程(函数) 一元线性回归: y kx b > wx b k: 斜率, 在机器学习中叫 权重(weight), 简称: w b: 截距, 在机…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定&#xff0c;最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…