1.JdbcTemplate 简化 JDBC 模板查询

①每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.
②JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.
③JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发
④Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建.

applicationContext.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:component-scan base-package="com.aff.spring.jdbc"></context:component-scan>
<!-- 导入资源文件 -->
<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> <!--配置 NamedParameterJdbcTemplate ,该对象可以使用具名参数, 其没有无参数的构造器,所以必须为其构造器指定参数-->
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg> </bean> </beans>

db.properties

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

JDBCTest.java

package com.aff.spring.jdbc;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
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;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource; public class JDBCTest { private ApplicationContext ctx = null;
private JdbcTemplate jdbcTemplate;
private EmployeeDAO employeeDAO;
private DepartmentDAO departmentDAO;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
{
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
employeeDAO = ctx.getBean(EmployeeDAO.class);
departmentDAO = ctx.getBean(DepartmentDAO.class);
namedParameterJdbcTemplate =ctx.getBean(NamedParameterJdbcTemplate.class);
} /**
* 使用具名参数时 , 可以使用 NamedParameterJdbcTemplate.update(String sql, SqlParameterSource paramSource)
* 进行操作,
* 1.SQL参数名和类的属性名一致
* 2.使用 SqlParameterSource 的BeanPropertySqlParameterSource 实现类作为参数
*/

@Test
public void testNamedParameterJdbcTemplate2(){
String sql ="insert into employees(last_name,email,dept_id) values(:lastName,:email,:deptId)";
Employee employee = new Employee();
employee.setLastName("hxl");
employee.setEmail("hxl@qq.com");
employee.setDeptId(4);
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(employee);; namedParameterJdbcTemplate.update(sql, paramSource);
} /**
* 可以为参数气起名字。
* 好处: 若有多个参数, 则不用去对应位置, 直接对应参数名, 便于维护
* 缺点: 很麻烦
*/
@Test
public void testNamedParameterJdbcTemplate(){
String sql ="insert into employees(last_name,email,dept_id) values(:ln,:email,:deptid)"; HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("ln", "hh");
paramMap.put("email", "hh@qq.com");
paramMap.put("deptid", 3); namedParameterJdbcTemplate.update(sql, paramMap);
} @Test
public void testDepartmentDao(){
System.out.println(departmentDAO.get(1));
//Department [id=1, name=财务部] } @Test
public void testEmployeeDAO(){
System.out.println(employeeDAO.get(7));
//Employee [id=7, lastName=jack, email=222@QQ.COM, department=null] } /**
* 获取单个列的值, 或做统计查询
* 使用JdbcTemplate.queryForObject(String sql, Class<Long> requiredType)
*/

@Test
public void testQueryForObject2(){
String sql ="select count(id) from employees";
Long count = jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
//
} /**
* 查到实体类的集合
* 注意 调用的不是queryForList 方法
*/

@Test
public void testQueryForList(){
String sql = "select id, last_name lastName ,email from employees where id<?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
List<Employee> employees = jdbcTemplate.query(sql, rowMapper,3);
System.out.println(employees);
//[Employee [id=1, lastName=Tom, email=tom@163.com, department=null],
//Employee [id=2, lastName=Jerry, email=jerry@126.com, department=null]]
} /**
* 从数据库中获取一条记录, 实际得到对应的对象
* 注意不是调用JdbcTemplate.queryForObject(String sql, Class<Employee> requiredType, Object... args)
* 而是调用.JdbcTemplate.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 employees where id=?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(employee);
//Employee [id=1, lastName=Tom, email=tom@163.com, department=null] } /**
* 执行批量的更新: 批量的 insert update delete
* 最后一个一个参数 是Object[] 的list 类型 ,因为 修改一条记录需要一个Object数组,多条记录,就需要多个Objec数组,构成的list 集合
*/

@Test
public void testBatchUpdate() {
String sql ="insert into employees(last_name, email, dept_id) values(?,?,?)"; List<Object[]> batchArgs = new ArrayList<Object[]>();
batchArgs.add(new Object[]{"aa","aa@qq.com",2});
batchArgs.add(new Object[]{"bb","bb@qq.com",3});
batchArgs.add(new Object[]{"cc","cc@qq.com",3});
batchArgs.add(new Object[]{"dd","dd@qq.com",3}); //一条记录三个字段构成一个Object数组,多条记录构成Object 数组的集合
jdbcTemplate.batchUpdate(sql, batchArgs); } /**
* 执行 insert update delete
*/
@Test
public void testUpdate() {
String sql = "update employees set last_name = ? where id=?";
jdbcTemplate.update(sql, "jack", 7);
} // 测试连接
@Test
public void test() throws SQLException {
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getConnection()); } }

EmployeeDAO.java

package com.aff.spring.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;
}
}

DepartmentDAO.java

package com.aff.spring.jdbc;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository; //不推荐使用
@Repository
public class DepartmentDAO extends JdbcDaoSupport {
@Autowired
private void setDataSource2(DataSource dataSource) {
setDataSource(dataSource);
} public Department get(Integer id) {
String sql = "select id ,dept_name name from departments where id=?";
RowMapper<Department> rowMapper = new BeanPropertyRowMapper<>(Department.class);
return getJdbcTemplate().queryForObject(sql, rowMapper, id);
}
}

 Department.java

package com.aff.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 + "]";
}
public Department(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Department() {
super();
// TODO Auto-generated constructor stub
} }

Employee.java

package com.aff.spring.jdbc;

public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer deptId;
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 Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", deptId=" + deptId + "]";
} }

目录

Spring_使用JdbcTemplate和JdbcDaoSupport的更多相关文章

  1. Spring_使用 JdbcTemplate和JdbcDaoSupport

  2. spring使用JdbcTemplate和jdbcDaosupport及具名参数使用

    关于jdbctemplate: 个人感觉比Java链接mysql那一套方便好维护多了,只需在配置文件维护即可 需要的包: com.springsource.net.sf.cglib-2.2.0.jar ...

  3. Spring_使用 JdbcTemplate和JdbcDaoSupport-代码

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...

  4. 23Spring使用JdbcTemplate和JdbcDaoSupport

    首先需要添加c3p0包和jdbc包 数据库: CREATE DATABASE IF NOT EXISTS `spring` /*!40100 DEFAULT CHARACTER SET utf8 */ ...

  5. spring使用jdbcTemplate和jdbcdaosupport和namedparameter

    jdbcTemplate: 首先连接数据库 <!-- 导入外部文件 --> <context:property-placeholder location="classpat ...

  6. 使用JdbcTemplate和JdbcDaoSupport

    [Spring对JDBC的支持] [JDBCTemplate简介] 1.为了是JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架. 2.作为Sprin ...

  7. spring 课程

    官网 参考文档 // 1. Spring_HelloWorld 20:22 // 2. Spring_IOC&DI概述 08:07 // 3. Spring_配置 Bean 21:58 // ...

  8. Spring + JdbcTemplate + JdbcDaoSupport examples

    In Spring JDBC development, you can use JdbcTemplate and JdbcDaoSupport classes to simplify the over ...

  9. ref:Spring JdbcTemplate+JdbcDaoSupport实例

    ref:https://www.yiibai.com/spring/spring-jdbctemplate-jdbcdaosupport-examples.html 在Spring JDBC开发中,可 ...

随机推荐

  1. spring boot项目中无法访问resources文件夹问题

    如图,浏览器默认访问static文件下的内容,无法访问templates文件下的html文件. 解决方法: 在application.properties文件中添加静态资源目录的配置即可.

  2. 深入理解Mybatis插件

    Mybatis插件实现原理 本文如有任何纰漏.错误,请不吝指出,谢谢! 首先,我并没有使用过 Mybatis的插件,但是这个和我写这篇文章并不冲突,估计能真正使用到插件的人也比较少,写这篇文章的目的主 ...

  3. 折腾了好久的vscode配置c/c++语言环境(Windows环境下)

    最近有c语言相关的作业,但是突然再次拿起大一的时候那些c语言编辑器的时候,总觉得不智能,于是下了一个vscode,准备配一个c语言的环境 步骤如下: 1.vs官网下载好vscode,安装好以后再下载一 ...

  4. 【Kafka】Producer API

    Producer API Kafka官网文档给了基本格式 地址:http://kafka.apachecn.org/10/javadoc/index.html?org/apache/kafka/cli ...

  5. Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig

    文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...

  6. 生产者消费者问题中的同步机制JAVA设计和实现

    目录 问题描述 问题分析 利用记录型信号量解决 运行环境 实现思路 代码实现 运行截图 过程中出现的问题和注意点 利用AND信号集解决 运行环境 实现思路 代码实现 运行截图 问题描述 若干进程通过有 ...

  7. vtk学习记录(三)——初识vtkRenderer

    目录 前言 vtkRenderer 引入vtk窗口 小结 前言 一场疫情打乱了好多人的节奏,我也一样,一不留神半年都快过去了,这期间虽说一直在鼓捣东西吧,不过确实是没啥实质性的进展,索性就继续把vtk ...

  8. java ->IO流_File类

    IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...

  9. Java -> 构造器(构造方法)

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  10. Codeforces 1105D(Kilani and the Game,双队列bfs)

    AC代码: #include<bits/stdc++.h> #define ll long long #define endl '\n' #define mem(a,b) memset(a ...