Spring的数据库编程

Spring框架提供了JDBC模板模式------>JdbcTemplate

简化了开发,在开发中并不经常是使用

实际开发更多使用的是Hibernate和MyBatis

1).Spring JDBCp配置

如果使用Spring JDBC操作数据库,要有如下的配置:

在xml配置文件

<!-- 配置数据源:可以使用各种数据源如c3p0.... -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
<property name="username" value="root" />
<property name="password" value="" />
</bean> <!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

配置JDBC模板需要将dataSource注入到jdbcTemplate

有时候也需要将JdbcTemplate注入到相应的Bean中可以使用:

@Autowired
private JdbcTemplate jdbcTemplate ;

2).JdbcTemplate  常用方法

--->public int update(String sql,Object args []):l=可以对数据库进行增加、修改、删除等操作...

--->public List<T> query (String sql,RowMapper<T> rowMapper,Object args[]):该方法执行对数据库的查询...

相关jar:

-logging

-mysql-connector-java-

-aop

-beans

-context

-core

-expression

-jdbc

tx

注:在dao方法中的操作可以使用@Componment、@Respository、@Service、@controller进行对包扫描,使用@Autowire进行自动注入!

 3).测试:

新建数据库

数据库对应的实体类:

User.java

public class User {
private Integer id;
private String name;
private String pw;
//....
}

tx.xml

<!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
<property name="username" value="root" />
<property name="password" value="" />
</bean> <!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

测试:

 public ApplicationContext getapp(){
return new
ClassPathXmlApplicationContext("tx.xml");
} //增删改....
@Test
public void test1(){
JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");
System.out.println(jdbcTemplate);
Object a [] = {4,"user4","pwd4"};
Object b [] = {5,"user5","pwd5"}; String sql = "insert into user values(?,?,?)"; //添加用户
jdbcTemplate.update(sql, a);
jdbcTemplate.update(sql, b); //查询
sql = "select * from user"; RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
List<User> users = jdbcTemplate.query(sql, rowMapper, null);
for(User user : users){
System.out.println(user);
}
}

编程式事务管理

 1).基于底层API的编程式事务管理

基于底层API的编程式事务管理就是根据PlatformTransactionManager、TransactionDefinition和

TransactionStatus几个核心接口,通过编程的方式解决来进行事务处理。

需要在spring的配置文件中:

<!-- 配置数据源 -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tx" />
<property name="username" value="root" />
<property name="password" value="" />
</bean> <!-- 配置jdbc模块 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 为数据源添加事物管理 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

test

    //事务管理...
@Test
public void test2(){
JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");
//事物管理器
DataSourceTransactionManager tx = (DataSourceTransactionManager) getapp().getBean("dataSourceTransactionManager");
//默认事物定义,隔离级别、传播行为....
TransactionDefinition tf = new DefaultTransactionDefinition();
//开启事物
TransactionStatus ts = tx.getTransaction(tf);

     String res = tx(jdbcTemplate, tx, tf, ts);
System.out.println(res);
} public String tx(JdbcTemplate jdbcTemplate,DataSourceTransactionManager tx,
TransactionDefinition tf,TransactionStatus ts){ String msg = "执行成功,没有事物回滚!"; try{
Object a [] = {,"user2","pwd2"};
String sql = "insert into user values(?,?,?)"; //添加用户
//主键重复
jdbcTemplate.update(sql, a);
//提交事务
tx.commit(ts); }catch(Exception e){
//出现异常,事物回滚
tx.rollback(ts);
msg= "主键重复!!!";
e.printStackTrace();
}
return msg;
}

以上的这种操作会让事物处理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且让每一个业务方法都包含了

类似启动事物、提交以及回滚事务的样板式代码。

TransactionTemplate的execute方法有一个TransactionCallback接口类型的参数,该接口定义了doInTransaction方法、通常

以匿名内部类的方式实现TransactionCallback接口,在doInTransaction方法中写业务逻辑代码

 public T doInTransaction(TransactionStatus arg0)

TransactionStatus类型参数、可以在方法的任何位置调用该参数方法的setRollbackOnly方法将事务标识为回滚、以执行事务回滚

根据默认规则:

如果在执行回调方法过程中如果抛出未检查异常或者显示调用setRollbackOnly方法,则回滚事物

如果事务执行完成或抛出了checked类型的异常,则提交事务

代码待完成......

8.spring:事务管理(上):Spring的数据库编程、编程式事务管理的更多相关文章

  1. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  2. spring事务管理——编程式事务、声明式事务

    本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...

  3. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

  4. spring 编程式事务管理和声明式事务管理

    编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...

  5. Spring 声明式事务与编程式事务详解

    本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...

  6. 【spring 6】Spring和Hibernate的整合:编程式事务

    一.编程式事务简介 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用beginTransaction() ...

  7. spring的声明式事务和编程式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它可以保证数据的一致性. Spring事务管理的两种方式 1.编程式事务 使用Transaction Ttempleate或者直接使用底层的Pl ...

  8. 春天的事务之9.3编程式事务 - 跟我学spring3

    9.3编程式事务 9.3.1编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同 ...

  9. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

随机推荐

  1. Linux文件上传下载sz 和 rz 命令

    windows系统和linux系统之间文件上传和下载用到 rz 和 sz 命令.rz: 上传文件sz:下载文件 先检查是否安装rz,sz模块 安装rz,sz 模块yum search sz安装yum ...

  2. C#语言-08.序列化与反序列化

    a. 序列化:是将对象的状态存储到特定存储介质中的过程 i. 语法:public void Serialize(序列化过程的文件流,保存的对象) b. 返序列化:是从特定存储介质中将数据重新构建对象的 ...

  3. .net core 填坑记之二目录问题(获取当前目录、创建目录)

    1.获取应用程序运行当前目录Directory.GetCurrentDirectory(). System.IO命名空间中存在Directory类,提供了获取应用程序运行当前目录的静态方法GetCur ...

  4. Go.基础篇-1

    package main import "fmt" import "math" import "errors" func main(){ f ...

  5. [android] 标题部分管理

    标题分类 1.1 普通标题 1.1.1 标题内容管理 1.1.2 帮助和返回的按钮 1.2 未登录的标题 1.3 登陆中的标题 1.4 登陆完成后的标题 package com.tsh.lottery ...

  6. 互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)

    简言:今天进行第八天的记录(只是写了八天).有的时候看的多,有的时候看的少,看的少的时候就攒几天一起写了.而今天这个插件我昨天写了一下午,下班没写完就回去了,今天把尾收了,再加上一个过程图方便下面原理 ...

  7. js基本数据类型和引用类型的区别详解-笔记

    原文参考http://mp.weixin.qq.com/s/apFyUgqT5N-bsDUjP4Eryg 笔记总结 首先记住js中的基础数据类型undefined,null,boolean,strin ...

  8. linux下nginx的安装及配置

    一.安装nginx前,我们首先要确保系统安装了g++.gcc.openssl-devel.pcre-devel和zlib-devel软件,可通过如图所示命令进行检测,如果以安装我们可以通过图二所示卸载 ...

  9. Docker常用操作指令

    1.查看正在运行的容器 docker ps 2.查看所有容器 docker ps -a 3.停用所有正在运行的容器 docker stop $(docker ps -q) 4.删除所有容器 docke ...

  10. C# ——窗体和控件随着分辨率的变化自适应大小

    一.说明 我们自己编写程序的界面,会遇到各种屏幕分辨 率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比 ...