spring学习之三 数据库操作jdbcTemplate
概念
jdbcTemplate就Spring对数据库持久化技术的实现,通过它可以对数据库进行CRUD等操作。
JDBCTemplate和代码实现
public void jdbcadd() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
//加载数据库驱动
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///dbname");
dataSource.setUsername("root");
dataSource.setPassword("123");
//设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "insert into user values(?,?)";
jdbcTemplate.update(sql,"blue", 123);
}
}
底层JDBC实现代码
public void jdbcimpl() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///dbname", "root", "123");
String sql = "select * from user WHERE name=?";
ps = conn.prepareStatement(sql);
ps.setString(1, "blueto");
rs = ps.executeQuery(); //执行
while (rs.next()) {
String name = rs.getString("username");
User user = new User();
user.setName(name);
}
} catch (Exception e) {
e.printStackTrace();
}
}
spring 连接池配置
c3p0的连接池代码是怎么样实现的呢?红色部分为与前面第一种方式不同的部分
public void c3p0impl(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//加载数据库驱动
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql:///dbname");
dataSource.setUser("root");
dataSource.setPassword("123");
//设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "insert into user values(?,?)";
jdbcTemplate.update(sql, "blue", 123);
}
实际的spring项目开发中,是不会像前面那样创建数据库连接conn再去请求执行sql语句的,而是在配置文件中配置好连接池。
从代码的实现步骤来看,可以总结 出连接池的执行步骤:
第一步 创建连接池的ComboPooledDataSource 对象
第二步 将数据库的驱动,url,用户,密码作为属性注入到Datasource对象中
好了,现在再按上面的步骤在配置文件中配置就可以了,现在应该明白别人那样配置了吧,配置文件可写成这样
<?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"> <bean id = "dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///dbname"></property>
<property name="user" value="root"></property>
<property name="password" value="123"></property>
</bean> </beans>
注意:如果新建一个userDao类去访问数据库的话,由于在访问时需要jdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
所以,还需要在配置文件中把创建jdbcTemplate的对象配置配好,并注入dataSource属性。

数据库的事务管理
spring 为不同的持久化框架提供了不同的事务管理器的接口,共有以下几种类型
1)org.springframework.jdbc.datasource.DataSourceTransactionManager -- 用spring jdbc或ibatis进行持久化时用
2)org.springframework.orm.hibernate5.HibernateTransactionManager --用于hibernate5版本
3)org.springframework.orm.jpa.jpaTransactionManager --用于jpa持久化
4)org.springframework.transaction.jta.jtaTransactionManager --JTA管理事务时,在一个事务跨越多个资源时必须使用
在进行数据库修改操作时,经常被谈及到事务这个概念,那什么叫事务呢?事务就是指一系列的数据库操作的组合,单次对数据表的增删改查为一次操作,只有事务中所有的操作指令全部执行成功,事务才算成功,否则就算失败;如果事务失败,则在事务中已经成功的操作,统统执行回滚操作至事务执行前的状态。
为什么事务失败需要回滚,就拿举例最多的银行转帐事件来作为例子吧。
在转帐过程中,A向B转1000元,首先系统从帐户表里用户A的account里的钱减去1000元,再给B的account里加上1000元,至此整个转帐事务成功。但是在A的account里减去1000成功后,在往B帐号里执行增加1000元的操作时,系统异常退出了,你会发现,A的钱扣了,但是B却没有增加,为了保证数据的一致性,必须将恢复到扣钱前的状态,这就是回滚。事务与回滚就是为了保证数据的一致性。
在spring中,使用AOP的技术将事务管理切入到对数据库操作的dao层方法中,就将dao层中的方法用事务管理起来,如果在dao层中方法一旦有异常抛出,事务会自动让数据库进行回滚操作。配置文件参见如下
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///dbname"></property>
<property name="user" value="root"></property>
<property name="password" value="123"></property>
</bean> <!--第一步 配置事务管理-->
<bean id="transactionMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步 配置事务增强,使用AOP技术将事务管理添加到dao层-->
<tx:advice id="txadvice" transaction-manager="transactionMgr">
<tx:attributes>
<!--name 表达式表示 所有save开头的方法需要事务操作;
propagation 表示隔离级别-->
<tx:method name="save*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--第三步 配置切面-->
<aop:config>
<aop:pointcut id="pointcutdb" expression="execution(* com.blueto.*(..))"/>
<!--切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcutdb"/>
</aop:config> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
--注解方式添加事务管理
相对于上一种方式,注解方式要简单一些,在配置文件中只需要两步
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///dbname"></property>
<property name="user" value="root"></property>
<property name="password" value="123"></property>
</bean> <!--第一步 配置事务管理-->
<bean id="transactionMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步 开户事务注解-->
<tx:annotation-driven transaction-manager="transactionMgr"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
在需要使用事务管理的方法所在类前,添加上注解@Transtional即可。
@Transactional
public class UserDao {
public void add() {
System.out.print("在这里添加一个用户");
}
}
spring学习之三 数据库操作jdbcTemplate的更多相关文章
- PHP学习之-数据库操作
PHP学习之-数据库操作 1.PHP支持那些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,Db2,Or ...
- java EE学习之数据库操作
jdbc开发流程 注册驱动 建立连接(Connection) 创建运行SQL的语句(Statement) 运行语句 处理运行结果(ResultSet) 释放资源 注冊驱动有三种方式: Class.fo ...
- ThinkPHP5.1学习笔记 数据库操作
数据库 参见<Thinkphp5.1完全开发手册>学习 Mirror王宇阳 数据库连接 ThinkPHP采用内置抽象层对数据库操作进行封装处理:且基于PDO模式,可以适配各种数据库. 数据 ...
- PHP学习之数据库操作
PHP数据库操作: 一.连接数据库 mysql_connect() 例:$link=mysql_connent("localhost","root"," ...
- spring框架学习之--数据库操作增删改查
基于spring的NamedParameterJdbcTemplate操作数据库 首先在 resources 文件夹下添加数据库配置文件jdbc.properties 配置常用的数据库信息 consu ...
- spring学习笔记---数据库事务并发与锁详解
多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...
- 多事务运行并发问题spring学习笔记——数据库事务并发与锁详解
多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...
- 一、javase学习:数据库操作练习
package JDBC_TEST; import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLExcept ...
- JavaEE学习笔记---数据库操作篇
测试JDBC和SQLServer的插入操作,源码如下: import java.sql.Connection;import java.sql.DriverManager;import java.sql ...
随机推荐
- 胡小兔的NOIP2017游记【出成绩后更新版】
胡小兔的NOIP2017游记[出成绩后更新版] 2017.11.22 Update 前几天成绩出来啦,看这篇博客访问量还挺多的,下面就分享一下结果吧: 我的Day1T2和Day2T1两道最水的题都跪了 ...
- 【转】查看 Linux 发行版名称和版本号的 8 种方法
如果你加入了一家新公司,要为开发团队安装所需的软件并重启服务,这个时候首先要弄清楚它们运行在什么发行版以及哪个版本的系统上,你才能正确完成后续的工作.作为系统管理员,充分了解系统信息是首要的任务. 查 ...
- 洛谷 P1357 花园 解题报告
P1357 花园 题目描述 小\(L\)有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为\(1~N(2<=N<=10^{15})\).他的环形花园每天都会换一个新花样,但他的花园都不 ...
- android 布局的两个属性 dither 和 tileMode
tileMode(平铺)tileMode(平铺) 的效果类似于 让背景小图不是拉伸而是多个重复(类似于将一张小图设置电脑桌面时的效果) dither(抖动) Dither(图像的抖动处理,当每个颜色值 ...
- Chapter7(类) --C++Prime笔记
类(关键词):数据抽象(数据成员和函数成员),封装(private),构造函数,静态成员 1.判断一个类是否是抽象数据类型,可以看我们对这个类的操作是对你内的数据成员操作,自己编写相应的处理函数,还是 ...
- ElasticStack系列之八 & _source 字段
有很多人会有这样的一个疑问: _source字段存储的是索引的原始内容,那 store 属性的设置是为何呢?elasticsearch 为什么要把 store 的默认取值设置为 no?设置为 yes ...
- Solr常用命令总结
前提条件: 安装solr版本:4.8.0 部署solr路径:/data/solr-4.8.0 1. 通过zookeeper上传一些配置信息: 通过zk命令将配置信息上传到zk环境中: /data/so ...
- IOS TableView滑动不灵敏问题
TableView的默认的不常用的属性,我们尽量不要去改,如下面标注的几个
- 科学计算三维可视化---Mlab基础(鼠标选取交互操作)
一:鼠标选取介绍 二:选取红色小球分析 相关方法:科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数) 1.小球场景初始化建立 import numpy as np from maya ...
- Linux下U盘、SD卡挂载与卸载
1.手动挂载/卸载U盘.SD卡 对于ARM Linux来说,第一次使用U盘或SD时,U盘这个文件目录是不能直接进入的,我们需要对其进行挂载,然后再接下来的使用中就可以直接进行使用了.通过再网上查资料, ...