Spring对 JDBC 的支持,JdbcTemplate类的使用
导包:spring框架的包 和 连接数据库连接池的c3p0包 连接mysql数据库的包;
在src目录下建立jdbc.properties文件:存放连接数据库的属性值

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

在src目录下建立spring bean configuration file的xml文件:applicationContext.xml

<!-- 基于注解的,导入标识的包,可以识别本包,或其自包,其只对带有指定注解的类,方法有效,不是对这个包中的所有类和方法有效 -->
<context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan> <!-- 导入资源文件 ,classpath.jdbc.properties 为类路径下的文件名为 jdbc.properties-->
<context:property-placeholder location="classpath:jdbc.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="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></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>

建立test类中可能用到的Employee,Department类,这里,只有属性,set,get,tostring等方法就。。。
Employee类的属性:
private Integer id;
private String lastName;
private String email;
private Department department;
Department类的属性:
private Integer id;
private String name;
建立类:EmployeeDao,基于注解的查询方法

package com.atguigu.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.Component; @Component//基本注解
public class EmployeeDao { @Autowired
public JdbcTemplate jdbcTemplate; public Employee get(Integer id){
String sql="select id,last_name,email from tables where id=?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
Employee employee=jdbcTemplate.queryForObject(sql, rowMapper, id);
return employee;
}
}

建立一个JUtil Test测试类:JDBCTest

package com.atguigu.spring.jdbc; import static org.junit.Assert.*; import java.util.List;
import java.sql.SQLException;
import java.util.ArrayList; 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;
private EmployeeDao employeeDao;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
{
ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
employeeDao=ctx.getBean(EmployeeDao.class);
namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class);
}
@Test
/**
* 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
* 1. SQL 语句中的参数名和类的属性一致!即上边employee中属性一致
* 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
*/
public void testNamedParameterJdbcTemplate2(){
String sql="insert into tables(last_name,email,dept_id) values(:lastName,:email,:deptId)";
Employee employee=new Employee();
employee.setLastName("panpan");
employee.setEmail("@panpan");
employee.setDeptId(4);
SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
namedParameterJdbcTemplate.update(sql, paramSource);
}
//可以为参数起名字
//好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护
//缺点: 较为麻烦.
public void testNamedParameterJdbcTemplate(){
String sql="insert into tables(last_name,email,dept_id) values(:la,:em,:de)";
Map<String, Object> paramMap=new HashMap<String, Object>();
paramMap.put("la", "fsd");
paramMap.put("em", "@ji");
paramMap.put("de", 3);
namedParameterJdbcTemplate.update(sql, paramMap);
}
@Test
//对基于注解的方法测试
public void testEmployeeDao(){
System.out.println(employeeDao.get(1));
}
//获取单个列的值, 或做统计查询
//使用 queryForObject(String sql, Class<Long> requiredType)
public void testQueryForObject2(){
String sql="select count(id) from tables";
long count=jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
}
//查到实体类的集合
//注意调用的不是 queryForList 方法
public void testQueryForList(){
String sql="select id,last_name,email from tables where id>?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
List<Employee> employees=jdbcTemplate.query(sql, rowMapper, 1);
System.out.println(employees);
}
/**
* 从数据库中获取一条记录, 实际得到对应的一个对象
* 注意不是调用 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 框架
*/
public void testQueryForObject(){
String sql="select id,last_name lastName,email,dept_id as \"department.id\" from tables where id=?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1);
System.out.println(employee);
}
//执行批量更新: 批量的 INSERT, UPDATE, DELETE
//最后一个参数是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组,
//那么多条不就需要多个 Object 的数组
public void testBatchUpdate(){
String sql="insert into tables(last_name,email,dept_id) values(?,?,?)";
List<Object[]> batchArgs=new ArrayList<>();
batchArgs.add(new Object[]{"AAA","testa",5});
batchArgs.add(new Object[]{"BBB","JIJK",6});
batchArgs.add(new Object[]{"CCC","panpN",3});
batchArgs.add(new Object[]{"DDD","jfids",2});
batchArgs.add(new Object[]{"EEE","tfsd",4});
jdbcTemplate.batchUpdate(sql,batchArgs);
}
//执行 INSERT, UPDATE, DELETE,只修改sql语句,即可
public void testUpdate(){
String sql="update tables set last_name=? where id=?";
jdbcTemplate.update(sql, "权", "1");
}
//测试数据库连接池是否连接成功
public void testDataSource() throws SQLException {
DataSource dataSource=ctx.getBean(DataSource.class);
System.out.println(dataSource.getConnection());
}
}

Spring对 JDBC 的支持,JdbcTemplate类的使用的更多相关文章
- 1.Spring对JDBC整合支持
1.Spring对JDBC整合支持 Spring对DAO提供哪些支持 1)Spring对DAO异常提供统一处理 2)Spring对DAO编写提供支持的抽象类 3)提高编程效率,减少DAO编码量 Spr ...
- 8.Spring对JDBC的支持和事务
1.Spring对JDBC的支持 DAO : Spring中对数据访问对象(DAO)的支持旨在简化Spring与数据访问技术的操作,使JDBC.Hibernate.JPA和JDO等采用统一的方式访问 ...
- Spring对jdbc的支持
Spring对jdbc技术提供了很好的支持. 体现在: 1)Spring对c3p连接池的支持很完善: 2)Spring对jdbc提供了JdbcTemplate,来简化jdbc操作: 1.使用步骤 1) ...
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring JDBC 框架使用JdbcTemplate 类的一个实例
JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Java进阶知识23 Spring对JDBC的支持
1.最主要的代码 Spring 配置文件(beans.xml) <!-- 连接池 --> <bean id="dataSource" class="co ...
- Spring对Jdbc的封装——JdbcTemplate的使用
链接:https://pan.baidu.com/s/15luDElW4oeEaP0nvEQ_40w 提取码:i2r1 JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于 ...
- spring 对JDBC的支持 (8)
目录 一.jdbc的简介 二.jdbcTemplate 的使用 2.1 maven 引入spring - jdbc ,c3p0 ,数据库mysql驱动 2.2 配置 数据源以及jdbcTemplate ...
随机推荐
- VS 2005 修复重置(深度重置)
/resetuserdata 参数 如果 Visual Studio 在运行时被损坏,且无法从损坏状态进行恢复,您可以使用此参数将 Visual Studio 重置到其使用之初的状态.这些问题的例子可 ...
- ado.net五大对象
五大对象分别是: 1. Connection:与数据源建立连接. 2. Command:对数据源执行SQL命令并返回结果. 3. DataReader:读取数据源的数据,只允许对将数据源以只读.顺向的 ...
- cellmap for iphone
说明:Cellmap的Iphone版本已经上架APP Store. 如需下载,可以登陆app store,然后搜索cellmap进行下载. 或者直接登陆以下地址下载: https://itunes.a ...
- 股票数据调用示例代码php
<!--?php // +---------------------------------------------------------------------- // | JuhePHP ...
- SQLAlchemy 几种查询方式总结
转自:http://blog.csdn.net/shudaqi2010/article/details/51568219 几种常见sqlalchemy查询:#简单查询 print(session ...
- 用msbuild构建应用
msbuild是微软提供的一个用于生成应用程序的平台,你可以通过一个xml配置文件来控制和处理你的软件工程.它也集成到了vs里面,它不依赖于vs. xml配置(架构)的组成元素: 项目文件 属性 项 ...
- java内存的那些事
在Java中,内存的管理分为以下几个部分: Heap:堆区域,存放对象实例,凡是New出来的东西都存放在此. Stack:栈区域,存放基本数据类型.常量.局部变量.对象的引用地址 Data Segme ...
- Rails 之微信开发 : OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
微信公众平台,使用Ruby On Rails + Win7 在取得OpenID时,如果简单的使用http.get方法,会出现如下 SSL_connect returned=1 errno=0 stat ...
- 小表驱动大表, 兼论exists和in
给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...
- Linux运行与控制后台进程的方法:nohup, setsid, &, disown, screen
我们经常会碰到这样的问题,用ssh登录了远程的Linux服务器,运行了一些耗时较长的任务,结果却由于网络等的不稳定导致任务中途失败.这是由于在用户注销(logout)或者网络断开时,终端会收到 HUP ...