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,一经查实,立即删除!

相关文章

Java多线程编程:变量共享分析(Thread)

Java多线程编程&#xff1a;变量共享分析&#xff08;Thread&#xff09; Java 创建线程的两种方法 此处只简单讲下自己对java多线程变量共享的理解&#xff1a; 按照进程和多线程的原理&#xff0c;同一进程内的多个线程之间的地址空间是共享的&#xff08;除去ThreadLocal&a…

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

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

[WPF]xml序列化以及反序列化数据

代码 XML序列化工具类 public static class XMLHelper{/// <summary>/// 将对象序列化为指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多线程的那点儿事

1. 多线程的那点儿事&#xff08;基础篇&#xff09; 多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程&#xff0c;这就要牵涉到多进程&#xff1f;当然&#xff0c;要了解到多进程&#xff0c;就要涉及到操作系统。不过大家也不要紧张&#xff0c;听我慢慢道来。…

Android应用开发—AsyncTask

摘录自 Android 多线程—–AsyncTask详解 AsyncTask AsyncTask&#xff1a;异步任务&#xff0c;从字面上来说&#xff0c;就是在我们的UI主线程运行的时候&#xff0c;异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当…

std::shared_ptr之deleter的巧妙应用

本文由作者邹启文授权网易云社区发布。std::shared_ptr一次创建&#xff0c;多处共享&#xff0c;通过引用计数控制生命周期。 实例 在邮箱大师PC版中&#xff0c;我们在实现搜索时&#xff0c;大致思路是这样的&#xff1a; 每一个账号都有一个SearchFlow&#xff0c;搜索开始…

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 技术在国内最早的布道师。我今天给大…

Android应用开发—FragmentManager如何管理fragments

本文主要摘录自Android中使用FragmentManager管理fragments 和 浅谈FragmentManager与fragment之一二事 先讲下自己对fragment的理解&#xff1a; 对于fragment&#xff0c;有太多官方文档和博文来介绍&#xff0c;此处不做转述&#xff1a;我感觉android提供fragment这种组件…

数组指针 和 指针数组

最近发现公司有些人说怎样区分 数组指针 和 指针数组 &#xff1f; 其实 很简单&#xff1b; 数组指针&#xff0c; 先是&#xff08;定语 &#xff09; &#xff08;主体&#xff09;&#xff0c; &#xff08;定语 数组&#xff09; &#xff08;主体 指针&#xff09…

在云服务器上注意GeoServer和ShadowDataMap的跨域设置

在云服务器上注意GeoServer和ShadowDataMap的跨域设置 1、对于支持cors的网络资源 可以在ShadowDataMap的devserverconfig.json里设置相应的跨域资源 提示&#xff1a;geoserver发布的地图服务虽然同在一个服务器上&#xff0c;但是端口不一样&#xff0c;同样需要设置跨域 如&…

Guava ImmutableCollection简介

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ImmutableCollection代码定义 GwtCompatible(emulatedtrue) public abstract class ImmutableCollection<E> extends AbstractCo…

Todo List

fragment里面如何处理back按键事件。 fragment里面无法Override onBackPressed接口&#xff0c;如何优雅的处理back press事件&#xff1f;activity如何获取当前活跃的fragment对象。异步网络请求如何改造成rxjava&#xff0c;rxjava有设置运行线程的能力&#xff0c;异步请求…

常见的几种负载均衡算法

1、轮询将所有请求&#xff0c;依次分发到每台服务器上&#xff0c;适合服务器硬件相同的场景。优点&#xff1a;服务器请求数目相同&#xff1b; 缺点&#xff1a;服务器压力不一样&#xff0c;不适合服务器配置不同的情况&#xff1b; 2、随机请求随机分配到各台服务器上。优…

基于 Token 的身份验证方法

基于 Token 的身份验证方法 使用基于 Token 的身份验证方法&#xff0c;在服务端不需要存储用户的登录记录。大概的流程是这样的&#xff1a;客户端使用用户名跟密码请求登录 服务端收到请求&#xff0c;去验证用户名与密码 验证成功后&#xff0c;服务端会签发一个 Token&…

Android应用开发-图片加载库Glide

Glide Picasso和Glide之间的区别&#xff1a; Picasso 仅仅缓存了全尺寸的图像&#xff1b;然而 Glide 缓存了原始图像&#xff0c;全分辨率图像和另外小版本的图像。

excel 表格导入 - java 实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp…

C语言 API

MySQL的C语言API接口 1、首先当然是连接数据库&#xff0c;函数原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

线程组之间的JMeter传递变量

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