前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring框架(V1.3)

Spring框架(V1.3)

作者头像
软件小生活
发布2021-10-20 15:51:42
3220
发布2021-10-20 15:51:42
举报
文章被收录于专栏:软件小生活软件小生活

SSM框架-Spring框架

spring提供了很多模板整合Dao技术

1.SpringTemplate

1.1.SpringTemplate概述

spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.

JDBCTemplate => JDBC模板对象

与DBUtils中的QueryRunner非常相似.

1.2.入门案例

1.2.1.添加功能

User对象入参

步骤:

导入jar包

基本jar包 4+2

aop包

操作jdbc

数据库

总体jar包图

插入数据

@Test public void fun1() throws PropertyVetoException { ComboPooledDataSource cbd = new ComboPooledDataSource(); cbd.setDriverClass("com.mysql.jdbc.Driver"); cbd.setJdbcUrl("jdbc:mysql://localhost:3306/demo"); cbd.setUser("root"); cbd.setPassword("12345"); // 创建模板对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(cbd); // 编写sql String sql = "INSERT INTO tb_user VALUES(null,'杰克');"; jdbcTemplate.update(sql); }

1.2.2.查询

1.2.2.1.根据id查询
1.2.2.2.查询返回list集合
1.2.2.3.查询统计记录数

1.2.3.修改

User对象入参

1.2.4.删除

根据id删除

2.Spring整合jdbc

2.1.思路分析

连接池

Jdbc模板

dao

2.2.编写dao层

2.2.1.编写UserDao接口

public interface UserDao { // 添加用户 void addUser(User user); //删除用户 public void deleteUser(Integer id); // 改 public void updateUser(User id); // 根据id查询单个用户 public User findUserById(Integer id); //返回用户的记录数 public Integer getUserCount(); //返回user列表 public ListgetUserList(); }

2.2.2.编写UserDaoImpl

public class UserDaoImpl implements UserDao { private JdbcTemplate jd;public void setJd(JdbcTemplate jd) { this.jd = jd; } public JdbcTemplate getJd() { return jd; } @Override public void addUser(User user) { String sql = "INSERT INTO tb_user VALUES(null,?)"; jd.update(sql, user.getName()); } @Override public void deleteUser(Integer id) { String sql = "delete from tb_user where id=?"; jd.update(sql, id); } @Override public void updateUser(User user) { String sql = "UPDATE tb_user SET `name` = ? WHERE id =?"; jd.update(sql, user.getName(), user.getId()); } @Override public User findUserById(Integer id) { String sql = "select * from tb_user where id=?"; User user = jd.queryForObject(sql, new RowMapper() { @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; } }, id); return user; } @Override public ListgetUserList() { String sql = "select * from tb_user"; Listlist = jd.query(sql,new RowMapper() { @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; } }); return list; }@Overridepublic Integer getUserCount() { String sql = "select count(*) from tb_user"; Integer integer = jdbcTemplate.queryForObject(sql, Integer.class); return integer;}}

2.2.3.编写Spring核心配置文件

xml version="1.0" encoding="UTF-8"?><< span="">beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><< span="">bean name="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> << span="">property name="driverClass" value="com.mysql.jdbc.Driver">property> << span="">property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo">property> << span="">property name="user" value="root">property> << span="">property name="password" value="12345">property>bean> << span="">bean name="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="DataSource" ref="datasource">property>bean><< span="">bean name="userDao" class="com.shop.dao.UserDaoImpl"> << span="">property name="jd" ref="jdbcTemplete">property>bean>beans>

2.2.4.编写测试代码

@Test public void fun2() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userdao = (UserDao) ac.getBean("userDao"); User user = new User(); user.setName("lucy"); userdao.addUser(user); }

3.Spring整合事务操作

3.3.事务案例介绍

转账操作

3.4.事务案例准备

3.4.1.Dao层

package com.shop.dao;public interface AaccountDao { // 加钱 void jiaqian(Integer id,double money); // 减钱 void jianqian(Integer id,double money);}

public class AccountDaoImpl implements AaccountDao { private JdbcTemplate jd; @Override public void jiaqian(Integer id, double money) { String sql = "update tb_account set money=money+? where id=?"; jd.update(sql,money,id); } @Override public void jianqian(Integer id, double money) { String sql = "update tb_account set money=money-? where id=?"; jd.update(sql, money,id); } public JdbcTemplate getJd() { return jd; } public void setJd(JdbcTemplate jd) { this.jd = jd; }}

3.4.2.service层

package com.shop.service;public interface AccountService { void zhuanzhang(Integer from,Integer to,double money);}

package com.shop.service;import com.shop.dao.AaccountDao;public class AccountServiceImpl implements AccountService{ private AaccountDao dao; @Override public void zhuanzhang(Integer from, Integer to, double money) { //减钱 dao.jianqian(from, money); //加钱 dao.jiaqian(to, money); } public AaccountDao getDao() { return dao; } public void setDao(AaccountDao dao) { this.dao = dao; }}

3.5.Spring核心配置文件

<< span="">bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> << span="">property name="driverClass" value="com.mysql.jdbc.Driver">property> << span="">property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo">property> << span="">property name="user" value="root">property> << span="">property name="password" value="12345">property>bean><< span="">bean name="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="DataSource" ref="dataSource">property>bean> << span="">bean name="accountDao" class="com.shop.dao.AccountDaoImpl"> << span="">property name="jd" ref="jdbcTemplete">property>bean><< span="">bean name="accountService" class="com.shop.service.AccountServiceImpl"> << span="">property name="dao" ref="accountDao">property>bean>

3.6.测试

public class Demo1 {@Test public void fun1(){ ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); AccountService as = (AccountService) ac.getBean("accountService"); as.zhuanzhang(1, 2, 100d);}}

3.7.测试没有事务问题

4.Spring整合事务

4.0.事务回顾

事务特性:acid

事务并发问题

脏读

不可重复读

幻读

事务的隔离级别

1 读未提交

2 读已提交

4 可重复读

8 串行化

4.1.Spring中事务介绍

spring封装了事务管理代码

事务操作

打开事务

提交事务

回滚事务

事务操作对象

因为在不同平台,操作事务的代码各不相同.spring提供了一个接口

PlatformTransactionManager 接口

事务传播行为:

4.2.Spring整合事务方式

方式1 模板方式

1.将核心事务管理器配置到spring容器

<< span="">bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> << span="">property name="dataSource" ref="dataSource">property>bean>

2.配置TransactionTemplate模板

<< span="">bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> << span="">property name="transactionManager" ref="transactionManager">property>bean>

3.将事务模板注入Service

<< span="">bean name="accountService" class="com.shop.service.AccountServiceImpl"> << span="">property name="accountDao" ref="accountDao">property> << span="">property name="tt" ref="transactionTemplate">property>bean>

完整xml配置参考:

<< span="">beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> << span="">bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> << span="">property name="driverClass" value="com.mysql.jdbc.Driver">property> << span="">property name="jdbcUrl" value="jdbc:mysql://localhost:3306/gz1960">property> << span="">property name="user" value="root">property> << span="">property name="password" value="12345">property> bean> << span="">bean name="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">bean name="template" class="org.springframework.transaction.support.TransactionTemplate"> << span="">property name="transactionManager" ref="dataSourceTransactionManager">property> bean> << span="">bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">bean name="accountDao" class="com.shop.dao.impl.AccountDaoImpl"> << span="">property name="jdbcTemplate" ref="jdbcTemplate">property> bean> << span="">bean name="accountService" class="com.shop.service.impl.AccountServiceImpl"> << span="">property name="accountDao" ref="accountDao">property> << span="">property name="tt" ref="template">property> bean>beans>

4.在Service中调用模板

public class AccountServiceImpl implements AccountService{ private AccountDao accountDao; private TransactionTemplate tt; @Override public void transfer(Integer from, Integer to, double money) { tt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus arg0) { //先减掉张三的钱 accountDao.lostMoney(from, money); int i = 1/0; //再把李四的钱加上 accountDao.addMoney(to, money); } }); } public AccountDao getAccountDao() { return accountDao; } public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public TransactionTemplate getTt() { return tt; } public void setTt(TransactionTemplate tt) { this.tt = tt; }}

5.测试

方式2 xml方式

在Spring 中 xml方式实现 事务操作其本质也是AOP 操作

1)回顾aop操作(aop事务)
2)导入包 (4+2 + 1)
3)再导入事务所需要的包

最终jar包的图解:

4)导入新的约束
5)配置事务通知

<< span="">bean name="jdbcTemplete" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="DataSource" ref="dataSource">property>bean> << span="">tx:advice id="txAdvice" transaction-manager="transactionManager"> << span="">tx:attributes> << span="">tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/> tx:attributes>tx:advice><< span="">bean name="accountDao" class="com.shop.dao.AccountDaoImpl"> << span="">property name="jd" ref="jdbcTemplete">property>bean>

6)配置织入

<< span="">aop:config> << span="">aop:pointcut expression="execution(* com.shop.service.AccountServiceImpl.transfer(..))" id="txPC"/> << span="">aop:advisor advice-ref="txAdvice" pointcut-ref="txPC"/>aop:config>

完整xml配置参考:

xml version="1.0" encoding="UTF-8"?><< span="">beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> << span="">bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> << span="">property name="driverClass" value="com.mysql.jdbc.Driver">property> << span="">property name="jdbcUrl" value="jdbc:mysql://localhost:3306/gz1960">property> << span="">property name="user" value="root">property> << span="">property name="password" value="12345">property> bean> << span="">bean name="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">tx:advice id="txadvice" transaction-manager="dataSourceTransactionManager"> << span="">tx:attributes> << span="">tx:method name="zhuanzhang" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="false"/> tx:attributes> tx:advice> << span="">aop:config> << span="">aop:pointcut id="pc" expression="execution(* com.shop.service.impl.AccountServiceImpl.zhuanzhang(..))">aop:pointcut> << span="">aop:advisor advice-ref="txadvice" pointcut-ref="pc">aop:advisor> aop:config> << span="">bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">bean name="accountDao" class="com.shop.dao.impl.AccountDaoImpl"> << span="">property name="jdbcTemplate" ref="jdbcTemplate">property> bean> << span="">bean name="accountService" class="com.shop.service.impl.AccountServiceImpl"> << span="">property name="accountDao" ref="accountDao">property> bean>beans>

方式3 注解方式

1)导包

跟xml 方式一样

2)添加新约束

跟xml方式一样

3)使用注解
将事务添加到方法上

private AccountDao accountDao; private TransactionTemplate tt; @Override @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false) public void transfer(Integer from, Integer to, double money) { //先减掉张三的钱 accountDao.lostMoney(from, money); int i = 1/0; //再把李四的钱加上 accountDao.addMoney(to, money); }

将事务添加到类上

问题:如果在service层有很多业务方法,莫非都需要添加一个??

@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)public class AccountServiceImpl implements AccountService{ private AccountDao accountDao; private TransactionTemplate tt; @Override public void transfer(Integer from, Integer to, double money) { //先减掉张三的钱 accountDao.lostMoney(from, money); int i = 1/0; //再把李四的钱加上 accountDao.addMoney(to, money); }

事务同时添加在类和方法

再思考,有没有问题?如果某个业务方法事务不一样呢?

@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)public class AccountServiceImpl implements AccountService{ private AccountDao accountDao; private TransactionTemplate tt; @Override @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false) public void transfer(Integer from, Integer to, double money) { //先减掉张三的钱 accountDao.lostMoney(from, money); int i = 1/0; //再把李四的钱加上 accountDao.addMoney(to, money); }

4) 开启注解事务支持

xml version="1.0" encoding="UTF-8"?><< span="">beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> << span="">bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> << span="">property name="driverClass" value="com.mysql.jdbc.Driver">property> << span="">property name="jdbcUrl" value="jdbc:mysql://localhost:3306/gz1960">property> << span="">property name="user" value="root">property> << span="">property name="password" value="12345">property> bean> << span="">bean name="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">tx:annotation-driven transaction-manager="dataSourceTransactionManager">tx:annotation-driven> << span="">bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> << span="">property name="dataSource" ref="dataSource">property> bean> << span="">bean name="accountDao" class="com.shop.dao.impl.AccountDaoImpl"> << span="">property name="jdbcTemplate" ref="jdbcTemplate">property> bean> << span="">bean name="accountService" class="com.shop.service.impl.AccountServiceImpl"> << span="">property name="accountDao" ref="accountDao">property> bean>beans>

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件小生活 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSM框架-Spring框架
  • 1.SpringTemplate
    • 1.1.SpringTemplate概述
      • 1.2.入门案例
        • 1.2.1.添加功能
        • 1.2.2.查询
        • 1.2.3.修改
        • 1.2.4.删除
    • 2.Spring整合jdbc
      • 2.1.思路分析
        • 2.2.编写dao层
          • 2.2.1.编写UserDao接口
          • 2.2.2.编写UserDaoImpl
          • 2.2.3.编写Spring核心配置文件
          • 2.2.4.编写测试代码
      • 3.Spring整合事务操作
        • 3.3.事务案例介绍
          • 3.4.事务案例准备
            • 3.4.1.Dao层
            • 3.4.2.service层
          • 3.5.Spring核心配置文件
            • 3.6.测试
              • 3.7.测试没有事务问题
              • 4.Spring整合事务
                • 4.0.事务回顾
                  • 4.1.Spring中事务介绍
                    • 4.2.Spring整合事务方式
                      • 方式1 模板方式
                      • 方式2 xml方式
                      • 方式3 注解方式
                  相关产品与服务
                  数据库
                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档