在Spring框架中数据访问的文章中,我们已经看到了Spring如何为各种持久性方法提供模板,以及模板如何将数据访问代码划分为固定部分和可变部分。Spring框架管理固定部分的地方,用户提供的自定义代码通过回调进行处理。在这篇文章中,我们将看到如何使用Spring Jdbc模板从数据库中插入,更新和删除数据。
- 请参阅 Spring Jdbc模板选择查询示例,了解如何使用选择查询从数据库读取数据。
请注意,JdbcTemplate 需要一个数据源来执行其对固定部分的管理,例如获取数据库连接、清理资源。
在这篇文章中,APACHE DBCP用于提供池数据源,MYSQL用作后端。
使用的技术
- 弹簧 5.0.4
- 阿帕奇数据库方案 2
- 我的学习能力 5.1.39
- 爪哇 8
- 阿帕奇大师 3.3.3
执行依赖关系
如果您使用的是 maven,则可以在 pom.xml 中提供依赖项。
- 请参阅在 Eclipse 中创建一个 Maven 项目,了解如何设置 Maven 项目。
对于你的pom的所有依赖关系.xml应该看起来像这样 -
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.netjs.prog</groupId>
<artifactId>maven-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven-spring</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.0.4.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Spring JDBC Support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- Apache DBCP connection pool -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
</project>
或者,您可以下载 jar 并将其添加到类路径中。
数据库表
对于此示例,我在MYSQL数据库中创建了一个名为 employee 的表,其中包含列 ID、名称和年龄。列 ID 配置为自动递增检查,因此无需从查询中传递 id,因为 DB 将为其提供值。
CREATE TABLE `employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(35) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
设置数据源依赖项
第一件事是将数据源设置为 Bean。我使用属性文件来配置数据源,其中所有属性都在db.properties文件中。
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value = "${db.driverClassName}" />
<property name="url" value = "${db.url}" />
<property name="username" value = "${db.username}" />
<property name="password" value = "${db.password}" />
<property name="initialSize" value = "${pool.initialSize}" />
</bean>
其中,作为 db.properties 文件位于配置文件夹下,具有所有属性。
数据库属性
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/netjs db.username= db.password= pool.initialSize=5
此处使用的属性的说明-
驱动程序类名是所用数据库的 JDBC 驱动程序。由于此处使用了 MYSQL,因此提供了相同的 jdbc 驱动程序(驱动程序)。
URL – 您需要提供 URL 才能访问数据库服务器。我已经创建了一个名为netjs的模式,并且数据库在同一系统上运行,因此网址是jdbc:mysql://本地主机:3306 / netjs。
数据库的用户名和密码。
“初始大小”是连接池的初始大小。它被指定为 5,因此最初将创建 5 个连接并将其存储在池中。
要使用属性文件,您需要在 XML 中放置以下配置。
<context:property-placeholder location="classpath:config/db.properties" />
- 请参阅如何在Spring框架中读取属性文件,以了解在Spring框架中读取属性文件的各种方法。
弹簧 Jdbc模板配置
数据源 Bean 必须作为 Jdbc 模板中的引用提供。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
爪哇类
由于Spring总是促进使用接口,并且还有一种名为DAO的数据库层的JEE设计模式,它也说了同样的事情 - 将低级数据访问代码与业务层分开。
因此,我们有一个带有插入,更新和删除方法及其实现类的员工DAO的接口。还有一个模型类员工与所有获得者/二传手。
员工.java类
public class Employee {
private int empId;
private String empName;
private int age;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
EmployeeDAO接口
import org.netjs.model.Employee;
public interface EmployeeDAO {
public int save(Employee employee);
public void update(Employee employee);
public void deleteEmpById(int empId);
}
EmployeeDAOImpl类
import org.netjs.dao.EmployeeDAO;
import org.netjs.model.Employee;
import org.springframework.jdbc.core.JdbcTemplate;
public class EmployeeDAOImpl implements EmployeeDAO {
private JdbcTemplate jdbcTemplate;
final String INSERT_QUERY = "insert into employee (name, age) values (?, ?)";
final String UPDATE_QUERY = "update employee set age = ? where id = ?";
final String DELETE_QUERY = "delete from employee where id = ?";
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int save(Employee employee) {
return jdbcTemplate.update(INSERT_QUERY, employee.getEmpName(), employee.getAge());
}
public void update(Employee employee) {
int status = jdbcTemplate.update(UPDATE_QUERY, employee.getAge(),
employee.getEmpId());
if(status != 0){
System.out.println("Employee data updated for ID " + employee.getEmpId());
}else{
System.out.println("No Employee found with ID " + employee.getEmpId());
}
}
public void deleteEmpById(int empId) {
int status = jdbcTemplate.update(DELETE_QUERY, empId);
if(status != 0){
System.out.println("Employee data deleted for ID " + empId);
}else{
System.out.println("No Employee found with ID " + empId);
}
}
}
此类包含 jdbc模板属性,该属性将由 Spring 框架注入。在 save 方法中,将执行插入查询并向其提供参数。请注意,这些是索引参数。
- 请参阅春季命名参数Jdbc模板插入、更新和删除示例,了解如何使用命名参数使用命名参数Jdbc模板。
另请注意,您没有编写任何用于获取或关闭连接的代码,异常处理。所有这些固定部分都由 Jdbc 模板类管理。它是 Jdbc 模板,它使用提供给它的数据源获取连接,创建和执行语句并关闭连接。
如果抛出的任何 SQLException 也被 Jdbc 模板捕获并转换为其中一个数据访问例外并重新抛出。
配置
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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">
<context:property-placeholder location="classpath:config/db.properties" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="employeeDAO" class="org.netjs.daoimpl.EmployeeDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value = "com.mysql.jdbc.Driver" />
<property name="url" value = "jdbc:mysql://localhost:3306/netjs" />
<property name="username" value = "root" />
<property name="password" value = "admin" />
<property name="initialSize" value = "5" />
</bean>
</beans>
测试类
您可以使用以下代码来测试插入和更新
import org.netjs.dao.EmployeeDAO;
import org.netjs.model.Employee;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
("appcontext.xml");
EmployeeDAO dao=(EmployeeDAO)context.getBean("employeeDAO");
Employee emp = new Employee();
emp.setEmpName("John");
emp.setAge(25);
int status = dao.save(emp);
System.out.println(status);
// For update
emp.setEmpId(12);
emp.setAge(35);
dao.update(emp);
// For delete
dao.deleteEmpById(10);
}
}
使用带有@Repository注释的自动配置
您还可以使用组件扫描来自动扫描和连接类。为此,您可以将@Repository注释与 DAO 实现类结合使用,@Autowired注释来自动连接依赖项。
- 请参阅使用自动配置的 Spring 示例程序,以了解有关自动配置的更多信息。
在这种情况下,您的员工DAO将如下所示 -
@Repository
public class EmployeeDAOImpl implements EmployeeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
final String INSERT_QUERY = "insert into employee (name, age) values (?, ?)";
final String UPDATE_QUERY = "update employee set age = ? where id = ?";
final String DELETE_QUERY = "delete from employee where id = ?";
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int save(Employee employee) {
return jdbcTemplate.update(INSERT_QUERY, employee.getEmpName(),
employee.getAge());
}
public void update(Employee employee) {
int status = jdbcTemplate.update(UPDATE_QUERY, employee.getAge(),
employee.getEmpId());
if(status != 0){
System.out.println("Employee data updated for ID " + employee.getEmpId());
}else{
System.out.println("No Employee found with ID " + employee.getEmpId());
}
}
public void deleteEmpById(int empId) {
int status = jdbcTemplate.update(DELETE_QUERY, empId);
if(status != 0){
System.out.println("Employee data deleted for ID " + empId);
}else{
System.out.println("No Employee found with ID " + empId);
}
}
}
XML Configuration
XML 配置也会更改,因为您必须提供要扫描的基本包,并且您还可以为 EmployeeDAO 注释 Bean 定义,因为它将自动完成。
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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">
<context:component-scan base-package="org.netjs.daoimpl" />
<context:property-placeholder location="classpath:config/db.properties" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- <bean id="employeeDAO" class="org.netjs.daoimpl.EmployeeDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean> -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value = "${db.driverClassName}" />
<property name="url" value = "${db.url}" />
<property name="username" value = "${db.username}" />
<property name="password" value = "${db.password}" />
<property name="initialSize" value = "${pool.initialSize}" />
</bean>
</beans>
现在,在运行程序时,您可以像这样获得员工DAO的豆子 -
EmployeeDAO dao=(EmployeeDAO)context.getBean("employeeDAOImpl");
这就是本主题的全部内容 春季 Jdbc模板插入、更新和删除示例。如果您有任何疑问或建议,请发表评论。谢谢!