spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术。JDBCTemplate模板。与DBUtils的QueryRunner对象类似。
准备工作:
这个场景就是对user表里面的数据进行增删改查。
public class UserDaoImpl implements UserDao {
private JdbcTemplate jt;
public void setJt(JdbcTemplate jt) {
this.jt = jt;
}
@Override
public void save(User u) {
// TODO Auto-generated method stub
String sql = "insert into t_user values(null,?,?,?)";
jt.update(sql, u.getUserName(), u.getPassword(), u.getAddress());
}
@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
String sql = "delete from t_user where uid=?";
jt.update(sql, id);
}
@Override
public void update(User u) {
// TODO Auto-generated method stub
String sql = "update t_user set username=? ,password=? ,address=? where uid=?";
jt.update(sql, u.getUserName(), u.getPassword(), u.getAddress(), u.getUid());
}
@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() {
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User u = new User();
u.setUid(rs.getInt("uid"));
u.setUserName(rs.getString("username"));
u.setPassword(rs.getString("password"));
u.setAddress(rs.getString("address"));
return u;
}
}, id);
}
@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 getAll() {
String sql = "select * from t_user ";
List list = jt.query(sql, new RowMapper() {
@Override
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User u = new User();
u.setUid(rs.getInt("uid"));
u.setUserName(rs.getString("username"));
u.setPassword(rs.getString("password"));
u.setAddress(rs.getString("address"));
return u;
}
});
return list;
}
}
这个过程就是,首先是注册数据源,然后再将数据源注册到jdbc模板里面,接着将jdbc模板注册到UserDaoImpl实现类里面。
如果我们UserDao类继承了JdbcDaoSupport类,我们就不需要再手动 的创建jdbc模板对象,直接调用父类的方法,获得Jdbc模板对象。也就是说不用先将datasource数据源注册到jdbc模板里了。只需要将数据源注册到UserDaoImpl实现类里面就可以了。
public void save(User u) {
// TODO Auto-generated method stub
String sql = "insert into t_user values(null,?,?,?)";
super.getJdbcTemplate().update(sql, u.getUserName(), u.getPassword(), u.getAddress());
}
上面把数据库的配置给写到了application.xml文件中,也可以将这些配置写到db.properties文件中。
首先在src目录下新建一个db.properties文件。
jdbc.jdbcUrl=jdbc:mysql:///hibernate_32
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=dre@mtech1012
这里加了一个前缀是为了防止这些字段和spring冲突。下面是application.xml文件中
spring封装了事务管理代码,包括打开事务,提交事务,回滚事务。因为在不同平台,操作事务的代码各不相同,spring提供了一个接口,**PlatformTransactionManager.**针对不同平台它提供了不同的的实现接口。最核心的是TransactionManager对象。
平台事务管理根据事务定义的信息进行事务的管理,事务管理的过程中产生一些状态,将这些状态记 录到 TransactionStatus 里面
spring管理事务的属性介绍:
保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务 PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
下面的三种方式,第一步都是先将核心事务管理器配置到spring容器
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
// TODO Auto-generated method stub
// 减钱
ad.decreaseMoney(from, money);
int i = 1 / 0;
// 加钱
ad.increaseMoney(to, money);
}
});
首先需要导包,导入新的约束,配置通知,配置将通知织入目标对象
这种是用通配符配置方法。
首先需要导包,导入新的约束,开启注解管理事务。
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, readOnly = false)
public void transfer(Integer from, Integer to, Double money) {
ad.decreaseMoney(from, money);
// int i = 1 / 0;
// 加钱
ad.increaseMoney(to, money);
}
事务的注解也可以加到类上