初识Spring JdbcTemplate
JdbcTemplate
概述
JdbcTemplate是Spring提供的一个模板类,它是对jdbc的封装.用于支持持久层的操作.具有简单,方便等特点.
pom.xml
<!--依赖版本-->
<properties>
<!-- spring版本 -->
<spring.version>5.0.2.RELEASE</spring.version>
<!-- mysql版本 -->
<mysql.version>5.1.30</mysql.version>
</properties>
<!--依赖包-->
<dependencies>
<!--spring ioc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring jdbc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mysql数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
入门案例
/**
* spring JdbcTemplate入门案例
*/
public class JdbcTemplateDemo {
public static void main(String[] args) {
/**
* 需求:通过JdbcTemplate实现添加一条账户记录,到账户表account中
*/
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 设置数据源对象
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("root");
jdbcTemplate.setDataSource(dataSource);
// 添加账户信息
jdbcTemplate.update("insert into account(name,money) values('小黄',2000)");
}
}
SpringIOC管理JdbcTemplate
bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置数据源对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>
案例
/**
* spring JdbcTemplate入门案例
*/
public class JdbcTemplateDemo {
public static void main(String[] args) {
/**
* 通过spring IOC容器管理JdbcTemplate对象
*/
// 1.加载spring配置文件,创建spring IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");
// 2.从spring IOC容器中,获取JdbcTemplate
JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");
// 3.添加账户
jdbcTemplate.update("insert into account(name,money) values('小敏',2000)");
}
}
整合数据源
在使用JdbcTemplate的时候,需要设置一个数据源对象才能完成数据库操作
内置数据源
<!-- 内置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
c3p0数据源
<!-- pom.xml -->
<!--c3p0版本-->
<c3p0.version>0.9.5</c3p0.version>
<!--c3p0依赖-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<!-- c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
dbcp数据源
<!-- pom.xml -->
<!--dbcp版本-->
<dbcp.version>1.4</dbcp.version>
<!--dbcp依赖-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${dbcp.version}</version>
</dependency>
<!-- dbcp数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
druid数据源
<!-- pom.xml -->
<!--druid版本-->
<druid.version>1.0.29</druid.version>
<!--druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- druid数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
RoeMapper
在JdbcTemplate中query方法有一个参数:RowMapper用于对结果集进行封装
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException{
return ....
}
BeanPropertyRowMapper
Spring框架提供的RowMapper通用实现类
// 类结构
public class BeanPropertyRowMapper<T> implements RowMapper<T>{
.....
}
/**
* 关键方法一
* 1.根据传递进来的类型信息,通过反射技术,获取类的全部成员变量,以及set方法
* 2.把类的成员变量名称,和对应的set方法,存在集合Map中
* 3.等待执行完成数据库操作后,把对应字段的值,赋值到对应的成员变量上
*/
protected void initialize(Class<T> mappedClass){
......
}
/**
* 关键方法二
* 1.执行完成数据库操作后,拿到结果集ResultSet
* 2.循环遍历ResultSet,每一行记录,调用一次该方法,进行结果集的封装
*/
public T mapRow(ResultSet rs, int rowNumber) throws SQLException{
......
}
自定义RowMapper
有时候为了代码更加简洁,会考虑使用自定义的RowMapper
/**
* 自定义结果集隐射:RowMapper
*/
public class CustomRowMapper implements RowMapper<T>{
/**
* 实现结果集封装方法: mapRow
* 该方法每一行结果集记录就调用一次
*/
public T mapRow(ResultSet rs, int rowNumber) throws SQLException{
Object object = new Object();
object.setXXX(XXX);
return object;
}
}
SpringIOC案例实现
pom.xml
<properties>
<!--spring版本-->
<spring.version>5.0.2.RELEASE</spring.version>
<!--druid版本-->
<druid.version>1.0.29</druid.version>
<!--mysql驱动版本-->
<mysql.version>5.1.30</mysql.version>
</properties>
<dependencies>
<!--spring ioc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring jdbc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
完全xml版本
bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置客户service-->
<bean id="Service" class="com.XXX.service.impl.ServiceImpl">
<!--注入客户dao-->
<property name="Dao" ref="Dao"></property>
</bean>
<!--配置客户dao-->
<bean id="Dao" class="com.XXX.dao.impl.DaoImpl">
<!--注入JdbcTemplate-->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置数据源对象DataSource-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--注入四个基本属性-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<!--数据库连接池常用属性-->
<!-- 初始化连接数量 -->
<property name="initialSize" value="6" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="3" />
<!-- 最大并发连接数(最大连接池数量) -->
<property name="maxActive" value="50" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
</bean>
</beans>
dao
public class Dao{
// 定义JdbcTemplate
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public List<T> findAll(){
// 定义sql
String sql = "select * from table";
// 返回执行结果
return jdbcTemplate.query(sql, new CustomRowMapper());
}
}
service
public class Service{
// 定义dao
private Dao dao;
public void setDao(Dao dao){
this.dao = dao;
}
public List<T> findAll(){
return dao.findAll();
}
}
Controller
public class Controller {
public static void main(String[] args) {
// 1.加载spring配置文件,创建spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");
// 2.获取客户service对象
Service Service = (Service) context.getBean("Service");
// 3.查询全部客户列表数据
List<T> list = Service.findAll();
for(T t:list){
System.out.println(t);
}
}
}
xml与注解混合版本
bean.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.xsd">
<!--配置包扫描dao/service,说明:
第一步:导入context名称空间和约束
第二步:通过<context:component-scan>标签配置包扫描,spring框架在
初始化IOC容器的时候,会扫描指定的包和它的子包
-->
<context:component-scan base-package="com.XXX"></context:component-scan>
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置数据源对象DataSource-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--注入四个基本属性-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<!--数据库连接池常用属性-->
<!-- 初始化连接数量 -->
<property name="initialSize" value="6" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="3" />
<!-- 最大并发连接数(最大连接池数量) -->
<property name="maxActive" value="50" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
</bean>
</beans>
dao
@Repository("dao")
public class Dao{
// 定义JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
public List<T> findAll(){
// 定义sql
String sql = "select * from table";
// 返回查询结果
return jdbcTemplate.query(sql, new CustomRowMapper());
}
}
service
@Service("service")
public class Service{
// 定义dao
private Dao dao;
public List<T> findAll(){
return dao.findAll();
}
}
完全注解基础版本
Spring配置类
/**
* 注解说明
* @Configuration: 标记当前java类是一个Spring的配置类
* @ComponentScan: 配置扫描包,相当于xml配置中<context:component-scan/>标签
*/
@Configuration
@ComponentScan(value = {"com.XXX"})
public class SpringConfiguration{
// 配置JdbcTemplate
@Bean(value = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 配置DataSource
@Bean(value = "dataSource")
public DataSource createDataSource(){
// 创建DataSource
DruidDataSource dataSource = new DruidDataSource();
// 注入属性
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setInitialSize(6);
dataSource.setMinIdle(3);
dataSource.setMaxActive(50);
dataSource.setMaxWait(60000);
dataSource.setTimeBetweenEvictionRunsMillis(60000);
return dataSource;
}
}
Controller
public class Controller{
public static void main(String[] args){
// 1.加载Spring配置类,创建Spring容器
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
// 2.获取service对象
Service service = (Service)context.getBean("service");
// 调用方法得到结果
List<T> list = service.findAll();
for(T t : list){
System.out.println(t);
}
}
}
完全注解优化版本
建立配置类之间关系
/**
* spring配置类:
* 注解说明:
* 1.@Configuration:标记当前java类,是一个spring的配置类
* 2.@ComponentScan:配置扫描包。相当于xml配置中<context:component-scan/>标签
* 3.@Import:导入其他模块配置类
* 4.@PropertySource:导入属性资源文件
*/
@Configuration
@ComponentScan(value = {"com.XXX"})
@Import(value={DaoConfiguration.class})
@PropertySource(value={"classpath:jdbc.properties"})
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring
jdbc.username=root
jdbc.password=root
jdbc.initialSize=6
jdbc.minIdle=3
jdbc.maxActive=50
jdbc.maxWait=60000
jdbc.timeBetweenERM=60000
Dao
public class DaoConfiguration {
@Bean(value="jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 定义连接数据库的成员变量
/**
* 使用@Value注解,进行赋值
* 使用格式:@Value("${}")
*/
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.initialSize}")
private Integer initialSize;
@Value("${jdbc.minIdle}")
private Integer minIdle;
@Value("${jdbc.maxActive}")
private Integer maxActive;
@Value("${jdbc.maxWait}")
private Integer maxWait;
@Value("${jdbc.timeBetweenERM}")
private Integer timeBetweenERM;
@Bean(value="dataSource")
public DataSource createDataSource(){
// 创建DataSource
DruidDataSource dataSource = new DruidDataSource();
// 注入属性
// 注入属性
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(initialSize);
dataSource.setMinIdle(minIdle);
dataSource.setMaxActive(maxActive);
dataSource.setMaxWait(maxWait);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenERM);
return dataSource;
}
}
初识Spring JdbcTemplate的更多相关文章
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- [转]Spring JdbcTemplate 查询分页
原文:http://blog.csdn.net/xiaofanku/article/details/4280128 现在进行的项目由于数据库的遗留原因(设计的不堪入目)不能用hibernate.所以用 ...
- spring jdbcTemplate query
1. spring jdbcTemplate query需要实现mapRow方法 package com.cdv.apolloagent.jdbc.dao.impl; import java.sql. ...
- Spring JdbcTemplate 的使用与学习(转)
紧接上一篇 (JdbcTemplate是线程安全的,因此可以配置一个简单的JdbcTemplate实例,将这个共享的实例注入到多个DAO类中.辅助的文档) Spring DAO支持 http://ww ...
- Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用--转载
原文地址: http://blog.csdn.net/will_awoke/article/details/12617383 一直用ORM,今天用JdbcTemplate再次抑郁了一次. 首先看下这个 ...
- spring jdbcTemplate源码剖析
本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...
- 使用Spring JDBCTemplate简化JDBC的操作
使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...
- Apache Phoenix JDBC 驱动和Spring JDBCTemplate的集成
介绍:Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排运行以生成标准的JDBC结果集. 直接使用HBase API.协同处理器与自己定义过滤器.对于简单查询来说,其性能 ...
- Spring JdbcTemplate用法整理
Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...
随机推荐
- Office 365 共享邮箱/日历
一.共享邮箱 Office 365共享邮箱对于客户通过电子邮箱提出的问题,共享邮箱是一个很好的处理方式,组织中的多人可以分担监控邮箱和回复的责任,使得客户的问题更快地得到答复,而相关电子邮件都存储在一 ...
- G - 旅行的意义(概率DP) (DAG图的概率与期望)
为什么有人永远渴望旅行,或许就因为,巧合和温暖会在下一秒蜂拥而至吧. 一直想去旅游的天天决定在即将到来的五一假期中安排一场环游世界的旅行.为此,他已经提前查阅了很多资料,并准备画一张旅游路线图.天天先 ...
- 吴裕雄--天生自然 HADOOP大数据分布式处理:主机与服务器时间同步设置
- nonparametric method|One-Mean t-Interval Procedure|
8.4 Confidence Intervals for One Population Mean When σ Is Unknown 原先是 standardized version of x bar ...
- linux 下安装及查看java的安装路径
一.Linux下安装JDK 1.下载文件 从官网下载合适版本如:jdk-8u191-linux-x64.tar.gz 2.安装文件 1.在 /usr/ 目录下创建 java文件夹mkdir /usr/ ...
- Mr.Yu
在linux下搭建Git服务器 git服务器环境 服务器 CentOS7 + git(version 1.8.3.1)客户端 Windows10 + git(version 2.16.0.window ...
- Nuxt.js 踩坑笔记 - 缓存向
零.前言 最近参与了一个立足 seo 的移动端项目,公司前端工程主栈 vue,所以理所当然的用上了 nuxt,UI 主要选择了 Vant. 一.公共列表页的缓存 公共列表页由于数据量较大,故需要滚 ...
- django自带数据库sqlite
python manage.py makemigrations # 记录关于models.py的所有改动,但是还没有作用的数据库文件中 python manage.py migrate # 把mode ...
- HDU-1425-sort(计数排序以及快速排序和堆排序的变种)
计数排序 Accepted 1425 483MS 5276K 997 B G++ #include "bits/stdc++.h" using namespace std; typ ...
- docker 创建实例
docker创建mysql实例要注意表名大小写和端口号映射的问题.下面是使用文件挂载解决表名大小写问题. docker run --name mysql-1 -e MYSQL_ROOT_PASSWOR ...