本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.JdbcTemplate 简介

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

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

本篇主要讲述JdbcTemplate 相关的API,主要以代码为例

2.构建工程 及 部分代码

    

  1)导入spring jar,额外加入  mysql c3p0 jar包

      

  2)在配置文件中配置c3p0数据源

    db.properties

 jdbc.user=root
jdbc.password=zhangzhen
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///spring jdbc.initPoolSize=5
jdbc.maxPoolSize=10

      

    在配置文件中配置c3p0文件

 <!-- 导入资源文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置c3p0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>

    

    3)配置 Spring 的jdbcTemplate

 <!-- 配置Spring 的jdbcTemplate  -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

3.完整代码

  application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 导入资源文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置c3p0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean> <!-- 配置Spring 的jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> </beans>

  

Department.java
 package com.jason.spring.jdbc;

 public class Department {

     private Integer id;
private String name; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Department [id=" + id + ", name=" + name + "]";
} }

  

Employee.java
 package com.jason.spring.jdbc;

 public class Employee {

     private Integer id;
private String lastName;
private String email; private Department department; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Department getDepartment() {
return department;
} public void setDepartment(Department department) {
this.department = department;
} @Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email="
+ email + ", department=" + department + "]";
} }

单元测试类

  

 package com.jason.spring.jdbc;

 import static org.junit.Assert.*;

 import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import javax.sql.DataSource; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper; public class JDBCTest { private ApplicationContext ctx = null;
private JdbcTemplate jdbcTemplate; {
ctx = new ClassPathXmlApplicationContext("application.xml");
jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); } /**
*
* @Author:jason_zhangz@163.com
* @Title: testQueryForObject2
* @Time:2016年12月6日
* @Description: 获取单个列的值,或做统计查询
* 使用 queryForObject(String sql, Class<Long> requiredType) 方法
*
*/
@Test
public void testQueryForObject2(){
String sql ="SELECT count(id) FROM employee ";
long count = jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
} /**
*
* @Author:jason_zhangz@163.com
* @Title: testQueryForList
* @Time:2016年12月6日
* @Description: 查到实体类的集合
* 注意:调用的方法不是queryForList
*
*/
@Test
public void testQueryForList(){
String sql = "SELECT id, last_name lastName, email FROM employee WHERE id > ?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
List<Employee> employees = jdbcTemplate.query(sql, rowMapper, 5);
System.out.println(employees);
} /**
*
* @Author:jason_zhangz@163.com
* @Title: testQueryForObject
* @Time:2016年12月6日
* @Description: 从数据库中获取一条记录,实际得到对应的对象
* 注意:.queryForObject(String sql, Class<Employee> requiredType, Object... args) 返回的是一个字段
* 需要使用:queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
* 1.RowMapper 指定如何映射结果的行,常用的实现类为 BeanPropertyRowMapper
* 2.使用SQL 中列的别名完成列名 和 类的属性名的映射:last_name lastName
* 3.不支持级联属性,jdbcTemplate 是一个JDBC的小工具,不是ORM框架
*
*/
@Test
public void testQueryForObject(){
String sql = "SELECT id, last_name lastName, email, dept_id as \"department.id\" FROM employee WHERE id = ?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);
System.out.println(employee);
} /**
*
* @Author:jason_zhangz@163.com
* @Title: testBatchUpdate
* @Time:2016年12月6日
* @Description: 执行批量的 INSERT, UPDATE, DELETE
* 最后一个参数是Object[] 的list 类型:因为修改一条记录需要一个Object 数据,多条记录 对应多个Object 形成数组
*/
@Test
public void testBatchUpdate(){
String sql = "INSERT INTO employee(last_name, email, dept_id) VALUES(?,?,?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"AA","AA@163.com",1});
batchArgs.add(new Object[]{"bb","bb@163.com",2});
batchArgs.add(new Object[]{"cc","cc@163.com",3});
batchArgs.add(new Object[]{"dd","dd@163.com",4});
batchArgs.add(new Object[]{"ee","ee@163.com",5});
batchArgs.add(new Object[]{"ff","ff@163.com",1});
jdbcTemplate.batchUpdate(sql, batchArgs); } /**
*
* @Author:jason_zhangz@163.com
* @Title: testUpdate
* @Time:2016年12月6日
* @Description: 执行 INSERT, UPDATE, DELETE
*
*/
@Test
public void testUpdate(){
String sql = "UPDATE employee SET last_name = ? WHERE id = ?";
jdbcTemplate.update(sql,"JACK",4); } @Test
public void testDataSource() throws SQLException {
DataSource dataSources = ctx.getBean(DataSource.class);
System.out.println(dataSources.getConnection());
} }

  

  

4.简化 JDBC 模板查询

  1)每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.

  2)JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.

  3)JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发

  注入JDBC 模板

  

注解方式实现自动注入 

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository; @Repository
public class EmployeeDao { @Autowired
private JdbcTemplate jdbcTemplate; public Employee get(Integer id){
String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id); return employee;
}
}

5.在 JDBC 模板中使用具名参数

  1)在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.

  2)在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).

  3)具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代

  4)具名参数只在 NamedParameterJdbcTemplate 中得到支持

  

  具体实现

  5)在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键

  6)也可以使用 SqlParameterSource 参数

   7)批量更新时可以提供 Map 或 SqlParameterSource 的数组

 public class JDBCTest {

     private ApplicationContext ctx = null;
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate; {
ctx = new ClassPathXmlApplicationContext("application.xml");
jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); } /*
* 使用具名参数使用这个方法:update(String sql, SqlParameterSource paramSource)
* 1.sql 语句中的参数名 和 类的属性一致
* 2.使用 SqlParameterSource 的 BeanPropertySqlParameterSource实现类,作为参数
*/
@Test
public void testNamedParameterJdbcTemplate2(){
String sql = "INSERT INTO employee(last_name, email, dept_id) VALUES(:lastName, :email, :deptId)";
Employee employee = new Employee();
employee.setLastName("wl");
employee.setEmail("wl@sina.com");
employee.setDeptId(5); SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(employee);
namedParameterJdbcTemplate.update(sql, parameterSource); } /**
*
* @Author:jason_zhangz@163.com
* @Title: testNamedParameterJdbcTemplate
* @Time:2016年12月6日
* @Description: 使用具名参数
* 可以为参数起名
* 1.好处:若有多个参数,则不用再去对应位置,直接对应参数名,便于维护
* 2.缺点:较为麻烦一台
*
*/
@Test
public void testNamedParameterJdbcTemplate(){
String sql = "INSERT INTO employee(last_name, email, dept_id) VALUES(:ln, :email, :deptid)";
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("ln", "FF");
paramMap.put("email", "ff@163.com");
paramMap.put("deptid", 5);
namedParameterJdbcTemplate.update(sql, paramMap);
}
}

配置namedParameterJdbcTemplate 的bean  

 <!-- 配置具名参数 namedParameterJdbcTemplate,该对象可以使用具名参数,其没有无参数的构造器,必须为其构造器指定参数,一般为dataSource -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>

  

  

[原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现的更多相关文章

  1. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  6. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  7. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

  8. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

  9. 学习笔记:CentOS7学习之二十:shell脚本的基础

    目录 学习笔记:CentOS7学习之二十:shell脚本的基础 20.1 shell 基本语法 20.1.1 什么是shell? 20.1.2 编程语言分类 20.1.3 什么是shell脚本 20. ...

随机推荐

  1. asp.net c# 网上搜集面试题目大全(附答案)

    1.String str=new String("a")和String str = "a"有什么区别? String str = "a"; ...

  2. jQueryt过滤选择器

    jQueryt过滤选择器 基本过滤选择器 选择器 描述 返回 示例 重要 :first 返回第一个元素 单个元素     :last 返回最后一个元素 单个元素     :not(selector) ...

  3. /usr文件系统

    /usr文件系统  /usr 文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution:本地安装的程序和其他东西在/usr/local 下.这样可 ...

  4. linux 内核cache

    写驱动总会碰到和cache相关的东西 记录下用到的接口: 驱动中用的内存地址一般为内核地址,用户调用驱动接口时,有时候会把自己申请的地址赋给驱动,此时用户kmalloc得到内核地址, 再用mmap获得 ...

  5. 在docker 中配置hadoop1.2.1 cluser

    最近一直在找工作,比较空闲,就没事研究一下hadoop,网上的视频及书,讲的差不多都是1.2.1这个版本,然后就试着在docker中搭建了一个hadoop集群, 项目已经放到了github上面了,供新 ...

  6. listview改变单个单元格的背景色

    ListViewItem lvi = listView1.Items[1]; lvi.UseItemStyleForSubItems = false; System.Windows.Forms.Lis ...

  7. mount windows-linux文件共享

    . (2)在linux下访问windows共享: smbclient -L 192.168.2.12 -U admin   //查看共享了那些目录,由此知道主机名为XIAOXING-PC smbcli ...

  8. 引用log4j.jar包后,出现告警

    问题现象:在引用log4j包后,使用自己导出的jar包,编译测试例代码,在启动浏览器时出现以下告警:log4j:WARN No appenders could be found for logger ...

  9. CACHE COHERENCE AND THE MESI PROTOCOL

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In contemporary multi ...

  10. 群晖SVN Server远程访问

    打开路由器访问界面 选择转发规则->端口映射-新建 在弹出的界面中填写相应的端口号了内网ip 填写svn所在地址的IP,比如:192.168.30.2 添加映射端口,比如svn的默认端口是330 ...