Spring第三天主要 讲解spring整合JDBC操作
来源:互联网 发布:护手霜 知乎 编辑:程序博客网 时间:2024/06/06 02:05
一、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第三天主要 讲解spring整合JDBC操作
- Spring、整合Spring+JDBC
- spring的第三天
- Spring第三天
- Spring框架第三天
- Spring第三天
- Spring第三天AOP
- Spring-JDBC+Spring整合开发
- spring整合jdbc
- spring整合jdbc
- spring整合jdbc
- spring整合jdbc配置文件
- Spring整合JDBC
- spring整合jdbc
- spring整合jdbc
- spring整合jdbc
- spring 整合JDBC
- Spring整合JDBC
- 函数调用
- Numpy练习100题--难度★★★
- L1-033. 出生年
- springboot学习
- 0511
- Spring第三天主要 讲解spring整合JDBC操作
- 面试6
- MyBatis框架的学习(一)——MyBatis介绍
- NDK探究之旅《五》——指针和数组之间的关系
- ArcGIS Web客户端开发(四)处理事件和消息
- 服务器环境搭建【三】
- 并查集入门 hud1213 poj2236
- inet_addr函数、inet_aton函数、inet_network函数
- 动物识别专家系统