Spring对持久层的支持

  Spring是javaEE开发 一站式解决方案 提供了对各个层的支持 我们也可以通过Spring结构图看到 对持久层的支持 分为jdbc模板和orm模块

1、SpringJDBCTemplate简介

  Spring 框架针对数据库开发中的应用提供了 JDBCTemplate 类,该类是 Spring 对 JDBC 支持的核心,它提供了所有对数据库操作功能的支持。

  Spring 框架提供的JDBC支持主要由四个包组成,分别是 core(核心包)、object(对象包)、dataSource(数据源包)和 support(支持包),org.springframework.jdbc.core.JdbcTemplate 类就包含在核心包中。作为 Spring JDBC 的核心,JdbcTemplate 类中包含了所有数据库操作的基本方法。

  JdbcTemplate 类继承自抽象类 JdbcAccessor,同时实现了 JdbcOperations 接口。其直接父类 JdbcAccessor 为子类提供了一些访问数据库时使用的公共属性,具体介绍如下。

1)DataSource

  其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。

2)SQLExceptionTranslator

  org.springframework.jdbc.support.SQLExceptionTranslator 接口负责对 SQLException 进行转译工作。通过必要的设置或者获取 SQLExceptionTranslator 中的方法,可以使 JdbcTemplate 在需要处理 SQLException 时,委托 SQLExceptionTranslator 的实现类完成相关的转译工作。

  JdbcOperations 接口定义了在 JdbcTemplate 类中可以使用的操作集合,包括添加、修改、查询和删除等操作。

2、使用JDBC模板操作数据库

2.1、建库建表

2.2、新建Java项目

2.3、导入jar包

2.4、编写实体类

package com.shangma.cn.entity;

public class Employee {

    private  Integer id;

    private String name;

    private double money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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 "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}
View Code

 

2.5、测试

public class TestDemo1 {

    @Test
    public  void  fun(){

        //使用Spring JDBCTemplate模板操作数据库
        DriverManagerDataSource dataSource  = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/spring");
        dataSource.setUsername("root");
        dataSource.setPassword("rootroot");
        JdbcTemplate  jdbcTemplate  = new JdbcTemplate(dataSource);
        //添加

        /**
         * 注意 增删改 都使用update方法   和dbutils一样
         */
        int updateRow = jdbcTemplate.update("insert into employee(name,money) values(?,?)",
                "丁磊", 4000);
        if(updateRow>0){
            System.out.println("添加成功");
        }
        
    }
}

 

2.6、代码优化

  • 创建对象交给Spring管理 数据库连接信息抽出

  • 使用Spring集成junit编写测试类

  • 引入DruidDataSource数据源

2.6.1、创建数据库配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root

 

2.6.2、编写Spring配置文件

    <!--    加载外部文件-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--    配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--    配置JdbcTemplate,把JdbcTemplate交配Spring管理-->
    <bean class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

 

拓展:加载配置文件的另外一种方式

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="db.properties"/>
    </bean>

 

2.6.3、编写spring的测试类

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class SpringTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void fun(){
        int updateRow = jdbcTemplate.update("insert into employee(name,money) values(?,?)", 
                "李彦宏", 4000);
        if(updateRow>0){
            System.out.println("添加成功");
        }
    }


}

 

2.6.4、引用Druid数据源

 

 

 导入druid的jar

   druid-1.1.10

2.6.5、修改spring配置文件

    <!--    配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

 

2.7、Dao层的编写

  jdbcTemplate只是一个模板工具 当然这个模板工具可以在dao中直接引入进行编写代码 但是我们开发有规范 我们应该统一管理 所以 使用jdbcDaoSupport这个类来编写dao层

2.7.1、编写Dao

public interface EmployeeDao {

    //
    int saveEmployee(Employee employee);
    //
    int deleteEmployee(Integer id);
    //
    int updateEmployee(Employee employee);

    //查询一个具体的
    String selectNameById(Integer id);

    //查询一个
    Employee selectEmployeeById(Integer id);

    //查询多个

    List<Employee> selectAll();
}

 

2.7.2、编写Dao实现类

/**
 * 使用dao规范 实现类实现 JdbcDaoSupport
 */
public class EmployeeDaoImpl extends JdbcDaoSupport implements EmployeeDao {



    @Override
    public int saveEmployee(Employee employee) {
        return getJdbcTemplate().update("insert into employee(name,money) values(?,?)",employee.getName(),employee.getMoney());

    }

    @Override
    public int deleteEmployee(Integer id) {
        return getJdbcTemplate().update("delete from employee where id =?",id);
    }

    @Override
    public int updateEmployee(Employee employee) {
        String sql  = "update employee set name=?,money=? where id =?";
        return getJdbcTemplate().update(sql,employee.getName(),employee.getMoney(),employee.getId());
    }

    @Override
    public String selectNameById(Integer id) {
        return getJdbcTemplate().queryForObject("select name from employee where id =?",String.class,id);
    }


    /**
      当查询一个时 我们使用BeanPropertyRowMapper
      使用BeanPropertyRowMapper 要求实体类的属性和列名一致
     */
    @Override
    public Employee selectEmployeeById(Integer id) {
        Employee employee = getJdbcTemplate().queryForObject("select * from employee where id =?", new BeanPropertyRowMapper<Employee>(Employee.class), id);
        return employee;
    }

    /**
     当查询多个时 我们也要使用BeanPropertyRowMapper
     使用BeanPropertyRowMapper 要求实体类的属性和列名一致
     */
    @Override
    public List<Employee> selectAll() {

        return getJdbcTemplate().query("select * from employee",new BeanPropertyRowMapper<>(Employee.class));
    }
}

 

2.7.3、修改配置类

  把userDao交给spring管理(添加到容器中)

    <bean id="employee">class="com.shangma.cn.dao.EmployeeDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

 

2.7.4、测试类

 

posted @ 2021-06-12 20:23  mini9264  阅读(92)  评论(0编辑  收藏  举报