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 + '}'; } }
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集成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、测试类