一:帝国之仓-DAO
1.持久层支持
为什么需要使用Spring对持久层的支持?
1):原生操作持久层API方式,麻烦.
2):Spring对事务支持非常优秀.
传统JDBC:
1:代码臃肿,重复
2:处理异常
3:控制事务
Spring JDBC:
1:简洁,优雅,简单
2:运行异常
3:Spring事务管理
Spring为什么对持久层提供技术支持:
Spring提供的对应模板类:
2.JDBC
需求:使用JDBC完成CRUD操作.
依赖jar:
mysql-connector-java-5.x.11.jar:MySQL驱动包
druid连接池
spring-jdbc-版本.RELEASE.jar:支持JDBC
spring-tx-版本.RELEASE.jar:支持事务
dao
public interface EmployeeDAO {
void save(Employee emp);
void update(Employee emp);
void delete(Long id);
Employee get(Long id);
List<Employee> listAll();
}
impl
public class EmployeeDAOImpl implements EmployeeDAO{
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void save(Employee emp) {
jdbcTemplate.update("INSERT INTO employee (name,age) VALUES (?,?)",emp.getName(),emp.getAge());
}
public void update(Employee emp) {
jdbcTemplate.update("UPDATE employee SET name=? ,age=? WHERE id=?",emp.getName(),emp.getAge(),emp.getId());
}
public void delete(Long id) {
jdbcTemplate.update("DELETE FROM employee where id = ?",id);
}
public Employee get(Long id) {
List<Employee> list = jdbcTemplate.query("SELECT id,name,age eage from employee where id = ?",new Object[]{
id},
(rs,rowNum)->{
//lanmda表达式其实就是匿名内部类的缩写,面向行数的编程
Employee e = new Employee();
e.setId(rs.getLong("id"));
e.setName(rs.getString("name"));
e.setAge(rs.getInt("eage"));
return e;
});
return list.size()==1? list.get(0):null;
}
public List<Employee> listAll() {
return jdbcTemplate.query("SELECT id,name,age eage from employee",new Object[]{
},new RowMapper<Employee>(){
//把每一行结果集映射成一个Employee对象
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee e = new Employee();
e.setId(rs.getLong("id"));
e.setName(rs.getString("name"));
e.setAge(rs.getInt("eage"));
return e;
}});
}
}
App-context.xml
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<