Spring-jdbc:JdbcTemplate使用简介

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.

作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。

使用示例:

在数据库中先准备两张表:

在java工程中创建两个对应类:

 

[java] view plain copy
  1. public class Department {  
  2.     int id;  
  3.     String deptName;  
  4.     @Override  
  5.     public String toString() {  
  6.         return "Department [id=" + id + ", deptName=" + deptName + "]";  
  7.     }  
  8.       
  9. }  
[java] view plain copy
  1. public class Employee {  
  2.     int id;  
  3.     String lastName;  
  4.     String email;  
  5.     Department department;  
  6.     @Override  
  7.     public String toString() {  
  8.         return "Employee [id=" + id + ", lastName=" + lastName + ", email="  
  9.                 + email + ", department=" + department + "]";  
  10.     }  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getLastName() {  
  18.         return lastName;  
  19.     }  
  20.     public void setLastName(String lastName) {  
  21.         this.lastName = lastName;  
  22.     }  
  23.     public String getEmail() {  
  24.         return email;  
  25.     }  
  26.     public void setEmail(String email) {  
  27.         this.email = email;  
  28.     }  
  29.     public Department getDepartment() {  
  30.         return department;  
  31.     }  
  32.     public void setDepartment(Department department) {  
  33.         this.department = department;  
  34.     }  
  35.       
  36.       
  37. }  

 


引入Spring框架相关的jar包以及c3p0和mysql连接jar包。为了对方法进行测试,这里还需要引入JUnit4.这里以导入外部属性文件的方式来配置数据源:

 

 

jdbc.properties文件内容如下:

 

[plain] view plain copy
  1. user=root  
  2. password=123  
  3. driverClass=com.mysql.jdbc.Driver  
  4. jdbcUrl=jdbc:mysql:///spring  
  5.   
  6. initPoolSize=5  
  7. maxPoolSize=10  


在xml文件中,导入这个属性文件以及配置c3p0数据源:

 

 

[html] view plain copy
  1. <!-- 导入资源文件 -->  
  2. <context:property-placeholder location="classpath:jdbc.properties"/>  
  3.   
  4. <!-- 配置 c3p0 数据源 -->  
  5. <bean id="dataSource"  
  6.     class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  7.     <property name="user" value="${user}"></property>     
  8.     <property name="password" value="${password}"></property>     
  9.     <property name="jdbcUrl" value="${jdbcUrl}"></property>   
  10.     <property name="driverClass" value="${driverClass}"></property>   
  11.       
  12.     <property name="initialPoolSize" value="${initPoolSize}"></property>      
  13.     <property name="maxPoolSize" value="${maxPoolSize}"></property>   
  14. </bean>  


配置好dataSource后就可以用这个数据源来配置JdbcTemplate了,在xml文件中添加:

 

 

[html] view plain copy
  1. <!-- 配置 spring 的 JdbcTemplate -->  
  2. <bean id="jdbcTemplate"  
  3.     class="org.springframework.jdbc.core.JdbcTemplate">  
  4.     <property name="dataSource" ref="dataSource"></property>  
  5. </bean>  

接下来创建一个测试类对JdbcTemplate的方法进行测试:

 

 

[java] view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import org.junit.Test;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7. import org.springframework.jdbc.core.BeanPropertyRowMapper;  
  8. import org.springframework.jdbc.core.JdbcTemplate;  
  9. import org.springframework.jdbc.core.RowMapper;  
  10.   
  11. public class JDBCTest {  
  12.       
  13.     private ApplicationContext ctx= null;  
  14.     private JdbcTemplate jdbcTemplate = null;  
  15. //  private EmployeeDao employee;  
  16.   
  17.     {  
  18.         ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");  
  19.         jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");  
  20.     }  
  21.   
  22.     /** 
  23.      * 执行 INSERT,UPDATE,DELETE 
  24.      */  
  25.     @Test  
  26.     public void testUpdate() {  
  27.         String sql = "UPDATE employees SET last_name = ? WHERE id = ?";  
  28.         jdbcTemplate.update(sql, "Jack"5);  
  29.     }  
  30.     /** 
  31.      * 测试批量更新操作 
  32.      * 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个 List 来存放多个数组。 
  33.      */  
  34.     @Test  
  35.     public void testBatchUpdate() {  
  36.         String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";  
  37.           
  38.         List<Object[]> batchArgs = new ArrayList<>();  
  39.           
  40.         batchArgs.add(new Object[]{"AA""aa@atguigu.com"1});  
  41.         batchArgs.add(new Object[]{"BB""bb@atguigu.com"2});  
  42.         batchArgs.add(new Object[]{"CC""cc@atguigu.com"3});  
  43.         batchArgs.add(new Object[]{"DD""dd@atguigu.com"3});  
  44.         batchArgs.add(new Object[]{"EE""ee@atguigu.com"2});  
  45.           
  46.         jdbcTemplate.batchUpdate(sql, batchArgs);  
  47.     }  
  48.       
  49.     /** 
  50.      * 从数据库中获取一条记录,实际得到对应的一个对象 
  51.      * 注意:不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! 
  52.      * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) 
  53.      * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper 
  54.      * 2、使用 SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName 
  55.      * 3、不支持级联属性。 JdbcTemplate 只能作为一个 JDBC 的小工具, 而不是 ORM 框架 
  56.      */  
  57.     @Test  
  58.     public void testQueryForObject() {  
  59.         String sql = "SELECT id, last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE ID = ?";  
  60.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  61.         //在将数据装入对象时需要调用set方法。  
  62.         Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);  
  63.           
  64.         System.out.println(employee);  
  65.     }  
  66.       
  67.     /** 
  68.      * 一次查询多个对象 
  69.      * 注意:调用的不是 queryForList 方法 
  70.      */  
  71.     @Test  
  72.     public void testQueryForList() {  
  73.         String sql = "SELECT id, last_name lastName, email FROM employees WHERE id > ?";  
  74.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  75.         List<Employee> employees = jdbcTemplate.query(sql, rowMapper,5);  
  76.           
  77.         System.out.println(employees);  
  78.     }  
  79.     /** 
  80.      * 获取单个列的值或做统计查询 
  81.      * 使用 queryForObject(String sql, Class<Long> requiredType)  
  82.      */  
  83.     @Test  
  84.     public void testQueryForObject2() {  
  85.         String sql = "SELECT count(id) FROM employees";  
  86.         long count = jdbcTemplate.queryForObject(sql, Long.class);  
  87.           
  88.         System.out.println(count);  
  89.     }     
  90. }  


在实际的使用中,一般会创建一个dao类来封装对某个对象的所有增删改查操作.

 

比如,创建一个EmployeeDao类如下:

 

[java] view plain copy
  1. import org.springframework.beans.factory.annotation.Autowired;  
  2. import org.springframework.jdbc.core.BeanPropertyRowMapper;  
  3. import org.springframework.jdbc.core.JdbcTemplate;  
  4. import org.springframework.jdbc.core.RowMapper;  
  5. import org.springframework.stereotype.Repository;  
  6.   
  7. @Repository  
  8. public class EmployeeDao {  
  9.     @Autowired  
  10.     private JdbcTemplate jdbcTemplate;  
  11.       
  12.     public Employee get(Integer id) {  
  13.         String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?";  
  14.         RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);  
  15.         Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id);  
  16.           
  17.         return employee;  
  18.     }  
  19. }  


在这个Dao类中实现了通过id来获取记录并封装成对象返回的方法。如果有需要还可以实现其他操作如插入、删除、更新等。

 

由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间):

 

[html] view plain copy
  1. <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>  

测试一下EmployeeDao:

 

 

[java] view plain copy
  1. @Test  
  2. public void testEmployeeDao() {  
  3.     EmployeeDao employeeDao = (EmployeeDao) ctx.getBean("employeeDao");  
  4.     Employee employee = employeeDao.get(1);  
  5.     System.out.println(employee);  
  6. }  


打印输出如下:

 

总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。

 

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

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

相关文章

嘉益仕(Litns)带您读懂MES系统:选型篇

自从智能制造概念提出以来&#xff0c;制造执行系统MES在国内掀起了新一波的热潮。众多企业在技术发展、政策导向和自身需要的推动下&#xff0c;纷纷上马MES请添加链接描述项目。 由此也带动了MES软件开发企业的快速发展。一夜之间MES软件开发企业遍地开花&#xff0c;MES产品…

js - 执行上下文和作用域以及闭包

首先&#xff0c;咱们通常被"执行上下文"&#xff0c;"执行上下文环境"&#xff0c;"上下文环境"&#xff0c;"执行上下文栈"这些名词搞混。那我们一一来揭秘这些名字的含义。 这一块一直比较晦涩难懂&#xff0c;还是需要仔细去斟酌斟…

Spring之JDBCTemplate

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Spring对不同的持久化支持&#xff1a; Spring为各种支持的持久化技术&#xff0c;都提供了简单操作的模板和回调 ORM持久化技术模…

从蚂蚁金服实践入手,带你深入了解 Service Mesh

本文整理自蚂蚁金服高级技术专家敖小剑在 QCon 上海 2018 上的演讲。我是来自蚂蚁金服中间件团队的敖小剑&#xff0c;目前是蚂蚁金服 Service Mesh 项目的 PD。我同时也是 Servicemesher 中国技术社区的创始人&#xff0c;是 Service Mesh 技术在国内最早的布道师。我今天给大…

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组需要…

python第九天(9-33)

一&#xff1a;进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程进程一般由程序&#xff0c;数据集&#xff0c;进程控制块组成进程控制块&#xff1a; 进程控制块用来记录进程的外部特征&#xff0c;描述进程的执行变化过程&#xff0c;系统可以利用它来控…

Python 数据类型--Bytes类型

一、Bytes类型 在Python3以后&#xff0c;字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的&#xff0c;bytes类型是以字节为单位处理的。 bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样&#xff0c;也是不可变的序列对象。 bytes对象只…

文件结构

C语言文件名命名的规则 1、文件标识符分为两部分&#xff0c;即文件名前缀和后缀。文件名前缀的最前面要使用范围限定符——模块名&#xff08;文件名&#xff09;缩写。 2、采用小写字母命名文件&#xff0c;避免使用一些比较通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 陨石的秘密 (线性DP)

题意&#xff1a; 公元11380年&#xff0c;一颗巨大的陨石坠落在南极。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨石上刻…

bzoj2561 最小生成树

题意&#xff1a;给你无向图&#xff0c;给定一条边&#xff0c;求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解&#xff1a; 假装我们把边排序了&#xff0c;然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

robotframework基础学习(8)

变量的使用 在 Edit 标签页中主要分&#xff1a;加载外部文件、定义内部变量、定义元数据等三个部分。 &#xff08;1&#xff09;&#xff1a;加载外部文件Add Library&#xff1a;加载测试库&#xff0c;主要是[PYTHON 目录]\Lib\site-packages 里的测试库 Add Resource&…

[蓝桥杯]ALGO-188.算法训练_P0504

Anagrams指的是具有如下特性的两个单词&#xff1a;在这两个单词当中&#xff0c;每一个英文字母&#xff08;不区分大小写&#xff09;所出现的次数都是相同的。例如&#xff0c;Unclear和Nuclear、Rimon和MinOR都是Anagrams。编写一个程序&#xff0c;输入两个单词&#xff0…

beta第二天

团队成员 郑西坤 031602542 &#xff08;队长&#xff09; 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴&#xff1a;无 廖钰萍&#xff1a;无 吴志鸿&#xff1a;没有 雷光游&#xff1a;无 郑西坤…

C语言符号

C语言运算符的优先级 一、运算符的优先级表 C 语言的符号众多&#xff0c;由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级&#xff0c;下表就是C 语言运算符的优先级表&#xff1a; 注&#xff1a;同一优先级的运算符&#xff0c;运算次序由结合…

burp过期了,换一个

先从吾爱破解论坛下载工具&#xff1a;https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip 工具运行需要Java环境&#xff0c;请自行安装&#xff0c;此处不赘述。解压完后双击keygen 填一下License Text(随意)&#xff0c;然后点击Run…

hbase 概念

在hbase里面有几个通俗的名称会经常出现 1&#xff09;Hregion region 2&#xff09;Hregionserver regionserver 3&#xff09;Hmaster master 4&#xff09;Hmamstore memstore 5&#xff09;Hfile storeFile 1、什么是hbase&#xff1f; 1&#xff09;它是基于稀疏的、…

beta冲刺第三天

团队成员 郑西坤 031602542 &#xff08;队长&#xff09; 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴&#xff1a;理解别人的代码 廖钰萍&#xff1a; 吴志鸿&#xff1a;无 雷光游&#xff1a; …

模块化

我那进了"模块化研究"小组.所以嘞.研究模块化以及如何让项目的模块化更加合理和高效是我们小组的主要目的.首先&#xff0c;在实行模块化之前,得先巩固模块化开发的理论基础,因为理论是实践的基础。只有这样&#xff0c;在过程中理论与实践相结合,才有可能达到最满意…

1566:基础练习 十六进制转八进制

题目地址&#xff1a;https://acmore.cc/problem/LOCAL/1566 1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 string HexToBin(string s) //16进制转2进制7 {8 string str "";9 for (int i 0; i < s.size(); i) 10…

java命令--jmap命令使用(查找内存泄漏对象)

转自&#xff1a;https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安装后会自带一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行…