1.1 Jdbc模板概述
它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类,入下图所示:
我们今天的主角在spring-jdbc-4.24.RELEASE.jar中,我们在导包的时候,除了要导入这个jar包外,还需要导入一个spring-tx-4.2.4.RELEASE.jar(它是和事务相关的)。
1、Spring中的jdbc模板入门
CREATE TABLE account(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(40),
money DOUBLE
)CHARACTER SET utf8 COLLATE utf8_general_ci;
注意:需要导入c3p0的jar包
public class TestJdbcTemplate {
@Test
public void test1(){
//创建jdbc模板对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//创建c3p0数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/spring_itheima10");
dataSource.setUser("root");
dataSource.setPassword("123456");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
//设置数据源
jdbcTemplate.setDataSource(dataSource);
//插入操作
jdbcTemplate.update("insert into account(name,money) values(?,?)","张三",1000.0);
}
n 创建AccountDao接口
public interface AccountDao {
public void save(Account account);
}
n 创建AccountDaoImpl实现类
public class AccountDaoImpl implements AccountDao {
private JdbcTemplate jdbcTemplate;
}
@Override
public void save(Account account) {
this.jdbcTemplate.update("insert into account(name,money) values(?,?)",account.getName(),account.getMoney());
}
}
/**
* 测试保存
*/
@Test
public void test2(){
Account account = new Account();
account.setName("JAY");
account.setMoney(1000.0);
accountDao.save(account);
}
总结:
三种方式:一种是c3p0数据源进行配置,一种是dbcp数据源进行配置,第三种Spring自带的数据源进行配置实现这个过程中的数据。
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hibernate_itcast55
jdbc.username=root
jdbc.password=123456
n 配置bean引入
n 通过context标签引入
提示:此处不加classpath也行,因为jdbc.properties就放在类路径下,就放在类一般加上。
总结:引入jdbc.properties配置文件的两种方式:1、使用配置bean进行引入(第一种方式)
2、通过context方式进行引入
/**
* JdbcTemplate之新增
*/
@Test
public void test1(){
jdbcTemplate.update("insert into account(name,money) values(?,?)","李四",1000);
}
/**
* JdbcTemplate之修改
*/
@Test
public void test2(){
jdbcTemplate.update("update account set money = ? where id = ?",1100,1);
}
/**
* JdbcTemplate之删除
*/
@Test
public void test3(){
jdbcTemplate.update("delete from account where id = ?",2);
}
查询数据比较简单此处省略
/**
* JdbcTemplate之查询某列的值
*/
@Test
public void test5(){
double money = jdbcTemplate.queryForObject("select money from account where id = ?", Double.class, 1);
System.out.println(money);
}
n 创建实体类
public class Account implements Serializable{
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private Double money;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
}
}
n 创建RowMapper
public class AccountRowMapper implements RowMapper
@Override
public Account mapRow(ResultSet rs, int rownum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
return account;
}
}
n 查询得到一个对象
/**
* JdbcTemplate之查询一个对象
*/
@Test
public void test4(){
AccountRowMapper mapper = new AccountRowMapper();
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", mapper, 1);
System.out.println(account);
}
/**
* JdbcTemplate之查询一个集合
*/
@Test
public void test6(){
AccountRowMapper rowMapper = new AccountRowMapper();
List
for(int i = 0;i < accounts.size();i++){
System.out.println(accounts.get(i));
}
}
public class AccountDaoImpl implements AccountDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void save(Account account) {
jdbcTemplate.update("insert into account(name,money) values(?,?)", account.getName(),account.getMoney());
}
}
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Override
public void save(Account account) {
this.getJdbcTemplate().update("insert into account(name,money) values(?,?)", account.getName(),account.getMoney());
}
}
比较:两版Dao有什么区别呢?
第一种在Dao类中定义JdbcTemplate的方式,适用于所有配置方式(xml和注解都可以)。
第二种让Dao继承JdbcDaoSupport的方式,只能用于基于XML的方式,注解用不了。
两种dao类中定义jdbcTemplate的方式,适用于所有的配置方式,(xml和注解都是可以使用的一种方式)
2、第二大块内容介绍----------------------------------------------Spring中的事务控制
事务的回顾:
l 事务的概念
n 事务是逻辑上一组操作,组成这组操作各个逻辑单元,要么一起成功,要么一起失败。
l 事务的特性
n 原子性
n 一致性
n 隔离性
n 持久性
l 如果不考虑隔离性,引发安全问题
n 读问题
u 脏读
u 不可重复读
u 虚读
n 写问题
u 丢失更新
l 解决读问题
n 设置事务隔离级别
u read uncommitted
u read committed
u repeatable read
u Serializable