spring5整理:(八)DAO

目录

为什么要使用Spring对持久层的支持

DAO之--JDBC模板类

JDBC操作--JdbcTemplate

JDBC操作--NamedParameterJdbcTemplate

JDBC操作--JdbcDaoSupport


为什么要使用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整理:(九)事务 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值