spring学习第四天--08-05

JdbcTemplate

概念:spring提供的一个对象,对原始jdbc的对象相关操作进行封装
JdbcTemplate 的几个常用方法
update() 执行增删改操作,传入sql语句字符串和 ? 的值
query() 执行查询操作 第二个参数为RowMapper接口类型(行的映射) 
通常使用new BeanPropertyRowMapper<>(想要封装成的类字节码对象) 返回此对象的集合
queryForObject() 执行一些聚合查询或返回单行的数据(如果为当行数据,第二个参数也是RowMapper类型)

基本步骤
1.maven导入相关jar包坐标
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId> // 此包是jdbc模板对象相关包
            <version>5.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId> // 此包是与事务相关的包
            <version>5.0.3.RELEASE</version>
        </dependency>
 
 代码示例 (Bank为标准实体类)
  ** applicationContext.xml 配置文件
          <context:property-placeholder location="jdbc.properties"/> // 读取配置文件
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${password}"/>
        </bean>
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/> 
            // 将数据源对象注入到JdbcTemplate对象中
        </bean>

 ** 测试类(以删除和查询为例)
 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;  // 自动装配获取JdbcTemplate 对象
    
    @Test
    public void test3(){
        jdbcTemplate.update("delete from bank where id=?",3);
    }

    @Test
    public void test4(){
        Bank user = jdbcTemplate.queryForObject("select * from bank where name=?", new BeanPropertyRowMapper<>(Bank.class), "张三");
        System.out.println(user);
    }
    @Test
    public void test5(){
        Integer count = jdbcTemplate.queryForObject("select count(id) from bank", Integer.class);
        System.out.println(count);
    }
    @Test
    public void test6(){
        List<Bank> banks = jdbcTemplate.query("select * from bank", new BeanPropertyRowMapper<>(Bank.class));
        System.out.println(banks);
    }
}

声明式事务

声明式事务的几个参数
timeout 超时时间(单位 s) 超过时间自动回滚
readOnly 是否只读 默认false
rollbackFor 回滚
noRollbackFor 不回滚 
propagation 事务传播行为 (事务方法进行调用)
	事务方法:对数据库进行增删改的操作
	** REQUIRED 调用另一个事务方法时,如果有事务,就在该事务内执行,否则创建一个新的事务 (默认)
	** REQUIRED_NEW 当前方法必须启动新事务,如果原来有将原来事务挂起
ioslation 事务隔离级别(与sql一致)

基于XML配置

基于XML的配置
示例 
前提需要引入aop,tx,context的命名空间
 ** 配置文件
         <context:component-scan base-package="dao,service"/> // 扫描包
        <context:property-placeholder location="jdbc.properties"/> // 加载配置文件
        
        // 配置数据源和jdbcTemplate
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${password}"/>
        </bean>
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        // 配置数据源和jdbcTemplate
        
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        // 配置事务管理器,需要依赖数据源 ref对数据源进行引用
        <tx:advice id="advice" transaction-manager="transactionManager"> // 需要依赖事务管理器
            <tx:attributes> // 事务的配置信息,包括上面事务几个参数(可选)
                <tx:method name="*" timeout="-1"/> // name属性为对哪些方法起作用 * 代表所有
            </tx:attributes>
        </tx:advice>
        // 编写事务通知 
        <aop:config>
            <aop:pointcut id="myPointcut" expression="execution(* service.UserService.change(..))"/> 
            // 切点表达式配置
            <aop:advisor advice-ref="advice" pointcut-ref="myPointcut"/>
            // 切点与通知结合
        </aop:config>
        // 配置切面

 ** Service层
 @Service("userService")
public class UserService {

    @Autowired
    private UserDao userDao;

    public void change(){
        userDao.subMoney();
        int a=1/0; // 制造异常
        userDao.addMoney();
    }
}

 ** dao层
 @Repository("userDao")
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void addMoney(){
        String sql="update bank set money=money+? where name=?";
        jdbcTemplate.update(sql,100,"张三");
    }

    public void subMoney(){
        String sql="update bank set money=money-? where name=?";
        jdbcTemplate.update(sql,100,"李四");
    }
}

 ** 测试类
 public class WebTest {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext2.xml");
        UserService userService = app.getBean(UserService.class);
        userService.change();
    }
}

注解配置

核心注解
@EnableTransactionManagement   开启事务
@Transactional 声明事务 作用在类上,声明此类所有方法都被事务管理,作用在方法上,此方法被事务管理
 ** 参数与事务参数一致,会自动匹配事务管理器对象,并且与声明的方法形成切面

示例
 ** 核心配置类
 @Configuration // 声明配置类
@ComponentScan({"dao","service"}) // 扫描包
@Import(DataSourceConfig.class) // 导入其它配置类
@EnableTransactionManagement  // 开启事务
// xml开始方式 <tx:annotation-driven/>
public class SpringConfiguration {
}

 ** 配置类
 @PropertySource("classpath:jdbc.properties")   // 加载配置文件
public class DataSourceConfig {

    @Value("${jdbc.driver}")   // SpEL表达式来根据配置文件中的key获取value,并注入到属性中
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${password}")
    private String password;

    @Bean("dataSource")    // 来标注此方法返回的值存入到spring容器中,属性为bean的id,bean的类型
    public DataSource getDataSource(){   //就是该方法的返回值类型
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean      // 返回值JdbcTemplate对象存入容器,参数按类型自动匹配容器内的bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

    @Bean     // 返回值DataSourceTransactionManager 对象存入容器,事务管理器对象
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
}

 ** server层
 @Service("userService")
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRES_NEW)
// 声明此类所有方法都被事务管理,参数为事务相关参数
public class UserService {

    @Autowired
    private UserDao userDao;

    public void change(){
        userDao.subMoney();
        int a=1/0;
        userDao.addMoney();
    }
}

** 测试类
public class WebTest {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserService userService = app.getBean(UserService.class);
        userService.change();
    }
}
dao层与xml配置一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值