目录
JDBC操作--NamedParameterJdbcTemplate
为什么要使用Spring对持久层的支持
1.原生操作持久层API方式麻烦
2.Spring对事务支持非常优秀
传统JDBC:
1.代码臃肿,重复
2.处理异常
3.控制事务
Spring JDBC:
1.简结,优雅,简单
2.运行异常
3.Spring事务管理
DAO之--JDBC模板类
1.JdbcTemplate
1)包含了JDBC操作的模板方法,简化开发
2)public int update(String sql, @Nullable Object... args)
3)public <T> T queryForObject(String sql, @Nullable Object[] args, RowMapper<T> rowMapper)
4)public <T> List<T> query(String sql, @Nullable Object[] args, RowMapper<T> rowMapper)
注:由xml中bean元素需配置dataSource属性,dao类需配置dataSource属性
private JdbcTemplate jdbcTemplate;
//属性:dataSource
public void setDataSource(DataSource ds) {
this.jdbcTemplate = new JdbcTemplate(ds);
}
2.NamedParameterJdbcTemplate
1)包含通过名称占位的模板方法,更简化开发
2)public int update(String sql, Map<String, ?> paramMap)
3)public <T> T queryForObject(String sql, Map<String, ?> paramMap, RowMapper<T>rowMapper)
4)public <T> List<T> query(String sql, Map<String, ?> paramMap, RowMapper<T> rowMapper)
注:由xml中bean元素需配置dataSource属性,dao类需配置dataSource属性
//属性:dataSource
private NamedParameterJdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
3.JdbcDaoSupport
在Spring中使用JDBC时,DAO直接继承JdbcDaoSupport类,其他操作类似JdbcTemplate
注:元素在代码中设置dataSource属性,由xml中bean元素需配置dataSource属性
JDBC操作--JdbcTemplate
数据库表;employee,结构如下:
1.domain类
@Data
public class Employee {
private Long id;
private String name;
private int age;
}
注意:使用Data注解,减少对setter/getter代码的书写,需要配置/导入lombok.jar包
2.IEmployeeDAO接口及基实现类EmployeeDAOImpl
public interface IEmployeeDAO {
void save(Employee emp);
void update(Employee emp);
void delete(Long id);
Employee get(Long id);
Employee get2(Long id);
List<Employee> getList();
}
public class EmployeeDAOImpl implements IEmployeeDAO {
private JdbcTemplate jdbcTemplate;
//属性:dataSource
public void setDataSource(DataSource ds) {
this.jdbcTemplate = new JdbcTemplate(ds);
}
@Override
public void save(Employee emp) {
System.out.println("保存员工");
this.jdbcTemplate.update("INSERT INTO employee (name,age) VALUES (?,?)", emp.getName(),emp.getAge());
}
@Override
public void update(Employee emp) {
System.out.println("修改员工");
this.jdbcTemplate.update("UPDATE employee SET name=?,age=? WHERE id=?", emp.getName(),emp.getAge(),emp.getId());
}
@Override
public void delete(Long id) {
System.out.println("删除员工");
this.jdbcTemplate.update("DELETE FROM employee WHERE id=?", id);
}
/*
* 注:该例子下,使用queryForObject查找单条记录,如果数据不存在,会抛出异常
*/
@Override
public Employee get(Long id) {
Employee emp = this.jdbcTemplate.queryForObject(
"select id,name,age from employee where id = ?",
new Object[]{id},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return emp;
}
@Override
public Employee get2(Long id) {
List<Employee> list = this.jdbcTemplate.query(
"select id,name,age from employee where id = ?",
new Object[]{id},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list.size()==1?list.get(0):null;
}
@Override
public List<Employee> getList() {
List<Employee> list = this.jdbcTemplate.query(
"select id,name,age from employee",
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list;
}
}
注:由于使用queryForObject查找单条记录,如果数据不存在,会抛出异常,建议查询单条记录,及使用query的方式
3.数据库配置,在resources中创建db.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdemo
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=2
4.XML配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 从classpath的根路径去加载db.properties文件 -->
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER" />
<!-- 配置一个druid的连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initialSize}" />
</bean>
<!-- 配置DAO -->
<bean id="employeeDAOImpl" class="com.bigfong.jdbc.dao.impl.EmployeeDAOImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
JDBC操作--NamedParameterJdbcTemplate
其他步骤类似,仅修改dao实现类即可
public class EmployeeDAOImpl implements IEmployeeDAO {
//属性:dataSource
private NamedParameterJdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
@Override
public void save(Employee emp) {
System.out.println("保存员工-ByNamedParameterJdbcTemplate");
this.jdbcTemplate.update("INSERT INTO employee (name,age) VALUES (:name,:age)", new HashMap() {{
this.put("name",emp.getName());
this.put("age",emp.getAge());
}});
}
@Override
public void update(Employee emp) {
System.out.println("修改员工-ByNamedParameterJdbcTemplate");
this.jdbcTemplate.update("UPDATE employee SET name=:name,age=:age WHERE id=:id", new HashMap() {{
this.put("id",emp.getId());
this.put("name",emp.getName());
this.put("age",emp.getAge());
}});
}
@Override
public void delete(Long id) {
System.out.println("删除员工-ByNamedParameterJdbcTemplate");
this.jdbcTemplate.update("DELETE FROM employee WHERE id=:id", new HashMap() {{
this.put("id",id);
}});
}
/*
* 注:该例子下,使用queryForObject查找单条记录,如果数据不存在,会抛出异常
*/
@Override
public Employee get(Long id) {
Employee emp = this.jdbcTemplate.queryForObject(
"select id,name,age from employee where id =:id",
new HashMap() {{
this.put("id",id);
}},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return emp;
}
@Override
public Employee get2(Long id) {
List<Employee> list = this.jdbcTemplate.query(
"select id,name,age from employee where id =:id",
new HashMap() {{
this.put("id",id);
}},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list.size()==1?list.get(0):null;
}
@Override
public List<Employee> getList() {
List<Employee> list = this.jdbcTemplate.query(
"select id,name,age from employee",
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list;
}
}
注意:设置NamedParameterJdbcTemplate,在查询条件中使用new HashMap(){{...}};
JDBC操作--JdbcDaoSupport
其他步骤类似,仅修改dao实现类即可
public class EmployeeDAOImpl extends JdbcDaoSupport implements IEmployeeDAO {
@Override
public void save(Employee emp) {
System.out.println("保存员工");
super.getJdbcTemplate().update("INSERT INTO employee (name,age) VALUES (?,?)", emp.getName(),emp.getAge());
}
@Override
public void update(Employee emp) {
System.out.println("修改员工");
super.getJdbcTemplate().update("UPDATE employee SET name=?,age=? WHERE id=?", emp.getName(),emp.getAge(),emp.getId());
}
@Override
public void delete(Long id) {
System.out.println("删除员工");
super.getJdbcTemplate().update("DELETE FROM employee WHERE id=?", id);
}
/*
* 注:该例子下,使用queryForObject查找单条记录,如果数据不存在,会抛出异常
*/
@Override
public Employee get(Long id) {
Employee emp = super.getJdbcTemplate().queryForObject(
"select id,name,age from employee where id = ?",
new Object[]{id},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return emp;
}
@Override
public Employee get2(Long id) {
List<Employee> list = super.getJdbcTemplate().query(
"select id,name,age from employee where id = ?",
new Object[]{id},
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list.size()==1?list.get(0):null;
}
@Override
public List<Employee> getList() {
List<Employee> list = super.getJdbcTemplate().query(
"select id,name,age from employee",
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setName(rs.getString("name"));
emp.setAge(rs.getInt("age"));
return emp;
}
});
return list;
}
}
注意:DAO实现类继承JdbcDaoSupport,代码中无需设置dataSource, 在JdbcTemplate使用的this.jdbcTemplate全换为super.getJdbcTemplate()即可
相关包列表
上一篇:spring5整理:(七)AOP
下一篇:spring5整理:(九)事务