您的位置:首页 > 编程语言 > Java开发

Spring第三天主要 讲解spring整合JDBC操作

2017-05-11 23:12 337 查看

一、spring 整合JDBC

前言:spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术。

JDBCTemplate jdbc模版 该对象与JDBCUtils 中的QueryRunner十分相似

2.导包:

1)导包4+2

spring-test

spring-aop

spring-jdbc

spring-tx

junit4类库

c3p0连接池jdbc驱动

spring-test

2)主配置文件

<!-- 将连接池交给spring容器管理 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="user" value="root"></property>
<property name="password" value="wdl03707552882"></property>
</bean>
<!-- 将JDBCTemplate交给spring容器进行管理 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 将userDao放入spring容器 -->
<bean name="userDao" class="com.spring.test.daoimpl.UserDao">
<property name="jt" ref="jdbcTemplate"></property>
</bean>


3)准备数据库测试


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo {

@Resource(name = "userDao")
private UserDao ud;

@Test
public void fun1() throws PropertyVetoException {
User u = new User();
u.setId(2);
u.setName("weidianlun");
ud.update(u);
}
}


3)准备jdbc实现增删改查


public class UserDao implements com.spring.test.dao.UserDao {
private JdbcTemplate jt;

public void setJt(JdbcTemplate jt) {
this.jt = jt;
}

@Override
public void save(User c) {
// TODO Auto-generated method stub
String sql = "insert into t_user value(null,?)";
jt.update(sql, c.getName());
}

@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
String sql = "delete from t_user where id=?";
jt.update(sql, id);
}

@Override
public User getById(Integer id) {
// TODO Auto-generated method stub
String sql = "select * from t_user where id=?";
return jt.queryForObject(sql, new RowMapper<User>() {

@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
// TODO Auto-generated method stub
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
return u;
}
}, id);
}

@Override
public void update(User u) {
// TODO Auto-generated method stub
String sql = "update t_user set name=? where id=?";
jt.update(sql, u.getName(), u.getId());
}

@Override
public int getTotalCount() {
// TODO Auto-generated method stub
String sql = "select count(*) from t_user";
Integer count = jt.queryForObject(sql, Integer.class);
return count;
}

@Override
public List<User> getAll() {
// TODO Auto-generated method stub
String sql = "select * from t_user";
List<User> list = jt.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
User u = new User();
u.setId(arg0.getInt("id"));
u.setName(arg0.getString("name"));
return u;
}
});

return list;

}

}


扩展知识点。如果我们用该类继承了JdbcDaoSupport类。 那么我们就不用再该类下书写
public class UserDao extends JdbcDaoSupport implements UserDao
private  JdbcTemeplate  jt;
settTemplate(){
}


在配置文件中也不用讲JdbcTemplate注入到该类的bean的属性中。
此时我们需要将该类的bean属性加上DataSource 属性


二、如何使用外部配置文件作为存储信息

1)使用Propertis来存储连接信息

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/spring

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.user=root

jdbc.password=1234

2)在配置文件中引入

<!-- 指定spring读取db.propertis配置 -->
<context:property-placeholder location="classpath:db.properties" />
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>


三、spring事务的管理

事务:

事务特性:

事务并发问题

脏读

不可重复读

幻读(虚读)

事务兵法问题的解决方法

1.读未提交

2.读已提交

3.可重复读

4。串行化

spring封装了事务管理代码(事务操作)

1.打开事务的代码

con.autoCommit(true)//默认

2.提交事务的代码

session.commit();

3.回滚事务

rollback()

事务操作对象

(一)

因为在不同平台中操作失误代码各不相同。spring提供了一个接口

PlatformTransactionManager 接口 。针对不同平台 该接口提供不同的实现类

1.jdbc平台 提供JdbcTranactionManager

2.hibearnte平台:提供HibernatTransactionManager

注意:在spring中进行事务管理 最核心的就是TransactionManager接口。

spring管理事务的属性介绍

1)事务的隔离级别

2)是否只读

3)事务传播行为

3-1)决定业务方法之间调用,事务应该如何处理。

PROPAGATION_REQUIRED:支持当前事务,如果不存在就创建一个(默认)

PROPAGATION_SUPPORTS支持当前事务。如果不存在就不使用事务

PROPGATION_HANDATARY支持当前事务,如果不存在,抛出异常

PROPAGATION_REQUIRES_NEW如果有事物存在,刮起当前事务,创建一个新事务
PROPGATION_NOT_SUPPORTED以非事务方式云心,如果有事物存在,挂起当前事务
PROPAGATION_NEVER以非事务方式运行,如果有事物存在则抛出异常
PROPAGATION)NESTED如果当前事物存在,则嵌套事务执行
spring管理事务的方式
11111111111111.编码式来管理事务。
1)将事务管理器配置到


<!-- 配置事务管理器 封装了所有事务操作,依赖于连接池。 -->
<bean name="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务模版对象 依赖于事务管理器 -->
<bean name="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>


2)进行测试
public class AccountServiceImpl implements AccountService {
private AccountDao dao;
private TransactionTemplate td;

public void setTd(TransactionTemplate td) {
this.td = td;
}

public void setDao(AccountDao dao) {
this.dao = dao;
}

@Override
public void transfer(final Integer from, final Integer to, double money) {
// TODO Auto-generated method stub
td.execute(new TransactionCallbackWithoutResult() {

@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
// TODO Auto-generated method stub
// 1.减钱
dao.decreasemoney(from, money);
//int i = 10 / 0;
// 2.加钱
dao.increaseMoney(to, money);
}
});
//基本步骤如下:
// 1.打开事务
// 2.调用doInTransactionWithountResult方法
// 3.提交事务
}

222222.xml配置(aop)
//1.导包4+2  aop   aspect  aop联盟,  weavingzh织入包。
//2.导入新的约束<tx:>
//3.配置通知:
<!-- 配置事务通知 -->
<tx:advice transaction-manager="transactionManager" id="txadvice">
<tx:attributes>
<!-- 其中isolation的属性就是隔离级别设置为可重复读 propagation设置为REQUIRED read-only设置为false -->
<!-- 以方法为单位 ,指定方法应用什么事务属性, isolatioin:隔离级别 propagation:传播行为 read-only:是否只读 -->
<tx:method name="transfer" isolation="REPEATABLE_READ"
propagation="REQUIRED" read-only="false" />
</tx:attributes>
</tx:advice>
///4.配置织入<!-- 配置织入 -->
<aop:config>
////4.1配置切点
<aop:pointcut
expression="execution(* com.spring.transaction.*serviceimpl.AccountServiceImpl.*(..))"
id="txpc" />
/////4.2配置切面<!-- 配置切面 通知+切点   advice-ref="通知名称" point-ref="切点名称"-->
<aop:advisor advice-ref="txadvice" pointcut-ref="txpc" />
</aop:config>
<!--事务核心管理器,封装了所有的事务操作,依赖于连接池 -->
<bean name="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务模版对象 -->
<bean name="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
333333333注解配置(aop)
///3.1.导包
///3.2.导入新的约束
///3.3开启注解管理事务
<!-- 开启使用注解管理aop -->
<tx:annotation-driven />
///3.4开始使用注解
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, readOnly = false)
public void transfer(final Integer from, final Integer to, double money) {
// TODO Auto-generated method stub
td.execute(new TransactionCallbackWithoutResult() {

@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
// TODO Auto-generated method stub
// 1.减钱
dao.decreasemoney(from, money);
int i = 10 / 0;
// 2.加钱
dao.increaseMoney(to, money);
}
});
////3.5注意一点我们可以将注解加到类名称上边这时候  该类下的所有服务方法都会生效,如果想要个别方法不适用类上边的属性
我们可以就可以在具体方法下加上相应的注解即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring jdbc