JdbcTemplate
概念:spring提供的一个对象,对原始jdbc的对象相关操作进行封装
JdbcTemplate 的几个常用方法
update() 执行增删改操作,传入sql语句字符串和 ? 的值
query() 执行查询操作 第二个参数为RowMapper接口类型(行的映射)
通常使用new BeanPropertyRowMapper<>(想要封装成的类字节码对象) 返回此对象的集合
queryForObject() 执行一些聚合查询或返回单行的数据(如果为当行数据,第二个参数也是RowMapper类型)
基本步骤
1.maven导入相关jar包坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<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"/>
</bean>
** 测试类(以删除和查询为例)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateTest {
@Autowired
private 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"/>
<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>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" timeout="-1"/>
</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
public class SpringConfiguration {
}
** 配置类
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${password}")
private String password;
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean
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配置一致