概观: 大家都知道,Spring框架已成为现代基于Java的应用程序开发的重要组成部分. Spring框架已经有效管理,需要各个部门的控制在Java开发领域. 弹簧的JDBC模板在大多数弹簧的基于JEE应用程序用于与数据库通信.
在本文中,我将讨论如何在使用Spring的JDBC模板来访问关系数据库.
介绍: 我们都知道,关系型数据库在企业应用开发的重要性. 春天是基于Java的企业应用开发中广泛使用的一种框架. 春有一个像ORM不同的模块, 安全, 交易, JPS, JMS等支持企业应用开发的需要. 如弹簧提供现成组件来插件, 为企业Java应用程序开发的现代方法使用功能广泛. 其结果是开发更快,效率. Spring提供了一个简单的方法来处理数据库活动,知道如春JDBC模板.
标准的JDBC API的缺点: 标准的JDBC API有以下缺点.
- 除了执行主查询, 你需要编写大量的代码来处理像创建连接执行环境问题, 声明, 结果集等.
- 需要单独处理的异常处理代码.
- 需要处理的事务问题.
春天JDBC模板的优势: 相比于标准的JDBC的正常做法春天JDBC模板具有以下优点.
- 使用的资源清洗被弹簧JDBC模板自动完成. 因此,开发者不需要操心释放资源. 因此,它可以防止内存泄漏.
- 弹簧的JDBC模板处理该异常和错误在一个更有效的方式. 它的JDBC的SQLException转换成RuntimeExceptions, 因此,开发人员可以更灵活的方式处理它.
- 春天JDBC模板也将转换更好有意义的消息供应商的特定错误. 因此,这些错误的装卸更有效.
入门:
In this document, 让我们使用gradle这个作为构建工具来构建我们的应用程序. 让我们从用来存储和检索雇员的细节与他们的部门的组织的沿一个简单的应用程序. 在我们的例子, 我们将有员工对象的下列属性:-
- 员工ID
- 雇员的名字
- 员工中间名
- 员工姓
- 雇员部门ID
而该部门的对象具有以下属性:-
- 部门ID
- 部门名称
现在让我们来创建将被用于与数据库通信的Java对象. 我们的这两个实体POJO类被列为下:
清单1: 样本显示Employee类
[Code]
package com.home.springjdbc.objects;
公众 类 Employee {
// 雇员ID
私人 串EMPID;
// 员工的名字
私人 串empFName;
// 员工中间名
私人 串empMName;
// 员工姓氏
私人 串empLName;
// 雇员部门ID
私人 串empDeptId;
公众 Employee ( 串EMPID, 串empFName, 串empMName,
串empLName, 串empDeptId ) {
非常();
this.的EmpID =的EmpID;
this.REC录制名称=名称;
this.empMName = empMName;
this.empLName = empLName;
this.empDeptId = empDeptId;
}
/**
* @返回 该EMPID
*/
公众 串getEmpId () {
return 的EmpID;
}
/**
* @param 的EmpID
* 在EMPID设置
*/
公众 无效 setEmpId ( 串EMPID ) {
this.的EmpID =的EmpID;
}
/**
* @返回 该empFName
*/
公众 串getEmpFName () {
return 拍摄名称;
}
/**
* @param 拍摄名称
* 在empFName设置
*/
公众 无效 setEmpFName ( 串empFName ) {
this.REC录制名称=名称;
}
/**
* @返回 该empMName
*/
公众 串getEmpMName () {
return empMName;
}
/**
* @param empMName
* 在empMName设置
*/
公众 无效 setEmpMName ( 串empMName) {
this.empMName = empMName;
}
/**
* @返回 该empLName
*/
公众 串getEmpLName () {
return empLName;
}
/**
* @param empLName
* 在empLName设置
*/
公众 无效 setEmpLName ( 串empLName) {
this.empLName = empLName;
}
/**
* @返回 该empDeptId
*/
公众 串getEmpDeptId () {
return empDeptId;
}
/**
* @param empDeptId
* 在empDeptId设置
*/
公众 无效 setEmpDeptId ( 串empDeptId ) {
this.empDeptId = empDeptId;
}
/*
* ( 非-的Javadoc )
*
* @see的java.lang.Object#的toString ()
*/
@覆盖
公众 字符串的ToString () {
return “Employee [ 的EmpID =” + 的EmpID + “, 拍摄名称=” + 拍摄名称
+ “, empMName =” + empMName + “, empLName =” + empLName
+ “, empDeptId =” + empDeptId + “]”;
}
}
[/Code]
Listing2: 样本显示Department类
[Code]
package com.home.springjdbc.objects;
公众 类 部 {
// 部门ID
私人 串DEPTID;
// 部门名称
私人 串DEPTNAME;
公众 部 ( 串DEPTID, 串DEPTNAME) {
非常 ();
this.DEPTID = DEPTID;
this.DEPTNAME = DEPTNAME;
}
/**
* @返回 该DEPTID
*/
公众 串getDeptId () {
return DEPTID;
}
/**
* @param DEPTID
* 在DEPTID设置
*/
公众 无效 setDeptId ( 串DEPTID ) {
this.DEPTID = DEPTID;
}
/**
* @返回 的DEPTNAME
*/
公众 串getDeptName () {
return DEPTNAME;
}
/**
* @param DEPTNAME
* 将DEPTNAME设置
*/
公众 无效 setDeptName ( 串DEPTNAME ) {
this.DEPTNAME = DEPTNAME;
}
/*
* (非-的Javadoc)
*
* @see的java.lang.Object#的toString()
*/
@覆盖
公众 字符串的ToString () {
return “部 [ DEPTID =” + DEPTID + “, DEPTNAME =” + DEPTNAME + “]”;
}
}
[/Code]
Spring提供了被称为JdbcTemplate的模板类. 这个类是负责与SQL关系数据库和JDBC通信. 在传统方法最大的JDBC代码处理连接管理被占用, 资源获取, 异常处理, 和一般的错误检查这是什么,我们正在努力实现的情况下不敬. 由JdbcTemplate需要所有这些事情的关怀和作为开发人员,我们应该只专注于业务逻辑. 模板类的一个示例实现显示为下 -
Listing3: 样本显示JDBC模板的实施
[Code]
package com.home.springjdbc.dao;
进口 java.sql.Driver中;
进口 java.sql.ResultSet中;
进口 值java.sql.SQLException;
进口 java.util.List中;
进口 org.springframework.jdbc.core.JdbcTemplate;
进口 org.springframework.jdbc.core.RowMapper;
进口 org.springframework.jdbc.datasource.SimpleDriverDataSource;
进口 com.home.springjdbc.objects.Employee;
公众 类 EmployeeDAO {
公众 静止 无效 主 ( 字符串参数[] ) {
// 简单DS测试 (不用于生产!)
SimpleDriverDataSource数据源= 新 SimpleDriverDataSource();
dataSource.setDriverClass((Class<? 扩展 司机>) org.h2.Driver.类);
dataSource.setUsername( “她的” );
dataSource.setUrl( “JDBC:H2:纪念品” );
dataSource.setPassword( “” );
JdbcTemplate类的JdbcTemplate = 新 的JdbcTemplate(数据源);
系统.出.调用println( “创建表” );
jdbcTemplate.execute( “如果存在,删除表的员工” );
jdbcTemplate.execute( “创建表的员工(”
+ “ID VARCHAR(25), FIRST_NAME VARCHAR(255), middle_name VARCHAR(255), 姓氏VARCHAR(255), DEPTID VARCHAR(25))”);
串[] 记录= “E001院长安德鲁·罗伯茨D25; E002杰夫朗文院长D42; E003艾琳南希·柯克兰D66;”.分裂(“;”);
为 ( 串singleRecord : 记录 ) {
串 [] COLS = singleRecord.split(” “);
系统.出.的printf( ” 添加员工记录%s的%s%S%s%S n”,COLS[0], COLS[1], COLS[2], COLS[3], COLS[4]);
jdbcTemplate.update(“INSERT INTO员工(ID, 名字, 中间名字, 姓, DEPTID) 值(?,?,?,?,?)”,COLS[0], COLS[1], COLS[2], COLS[3], COLS[4]);
}
系统.出.调用println ( ” Querying for customer records where first_name = ‘Erin’:” );
名单<Employee> 结果= jdbcTemplate.query(
“select * 从员工那里FIRST_NAME = ?”,
新 目的[] { “艾琳” }, 新 的RowMapper<Employee>() {
@覆盖
公众 员工mapRow(ResultSet的RS, 诠释 的rowNum)
投 的SQLException {
return 新 Employee(rs.getString(“ID”),
rs.getString(“名字”), rs.getString(“中间名字”),
rs.getString(“姓”), rs.getString(“DEPTID”));
}
});
为 (员工员工 : 结果) {
系统.出.调用println(雇员);
}
}
}
[/Code]
在上面的例子, 我们设置使用SimpleDriverDataSource从春天JDBC数据源. 然后,我们使用这个数据源来构建的JdbcTemplate. 一旦JdbcTemplate类创建, 我们可以很容易地开始调用数据库. First, 我们创建使用模板的执行方法表. 然后,我们插入使用模板的更新方法几条记录. 最后,我们使用的查询方法来获取我们的选择的记录. 在我们的例子中,我们使用了一个简单的查询从雇员表中提取记录. 但是,按照我们的设计,我们可以看到,雇员表具有通过柱部门表的关系 - DEPTID. 因此,我们也可以利用相同的代码来读取记录在加入这两个表. 只是我们需要改变查询把一个加盟. 上面的代码可以修改为下 -
Listing4: 样本显示修改后的查询
[Code]
名单<Employee> 结果= jdbcTemplate.query(
“选择emp.first_name, emp.middle _name, emp.last _name, dept.dept_Name从员工EMP, 部门部门,其中emp.first_name = ?”,
新 目的[] { “艾琳” }, 新 的RowMapper<Employee>() {
@覆盖
公众 EmployeeDtls mapRow(ResultSet的RS, 诠释 的rowNum)
投 的SQLException {
return 新 Employee( rs.getString(“名字”),
rs.getString(“中间名字”),
rs.getString(“姓”),
rs.getString(“中将dept_name “));
}
});
为 (EmployeeDtls employeeDtl : 结果) {
系统.出.调用println(employeeDtl);
}
[/Code]
要执行此,我们应该有另外一个POJO类EmployeeDtls为下 -
Listing5: 样本显示POJO类EmployeeDtls
[Code]
package com.home.springjdbc.objects;
公众 类 EmployeeDtls {
// 员工的名字
私人 串empFName;
// 员工中间名
私人 串empMName;
// 员工姓氏
私人 串empLName;
// 部门名称
私人 串DEPTNAME;
/**
* @param 拍摄名称
* @param empMName
* @param empLName
* @param DEPTNAME
*/
公众 EmployeeDtls(串empFName, 串empMName, 串empLName,
串DEPTNAME) {
非常();
this.REC录制名称=名称;
this.empMName = empMName;
this.empLName = empLName;
this.DEPTNAME = DEPTNAME;
}
/*
* (非-的Javadoc)
*
* @see的java.lang.Object#的toString()
*/
@覆盖
公众 字符串的ToString() {
return “EmployeeDtls [拍摄名称=” + 拍摄名称 + “, empMName =” + empMName
+ “, empLName =” + empLName + “, DEPTNAME =” + DEPTNAME + “]”;
}
/**
* @返回 该empFName
*/
公众 串getEmpFName() {
return 拍摄名称;
}
/**
* @param 拍摄名称
* 在empFName设置
*/
公众 无效 setEmpFName(串empFName) {
this.REC录制名称=名称;
}
/**
* @返回 该empMName
*/
公众 串getEmpMName() {
return empMName;
}
/**
* @param empMName
* 在empMName设置
*/
公众 无效 setEmpMName(串empMName) {
this.empMName = empMName;
}
/**
* @返回 该empLName
*/
公众 串getEmpLName() {
return empLName;
}
/**
* @param empLName
* 在empLName设置
*/
公众 无效 setEmpLName(串empLName) {
this.empLName = empLName;
}
/**
* @返回 的DEPTNAME
*/
公众 串getDeptName() {
return DEPTNAME;
}
/**
* @param DEPTNAME
* 将DEPTNAME设置
*/
公众 无效 setDeptName(串DEPTNAME) {
this.DEPTNAME = DEPTNAME;
}
}
[/Code]
Summary: 因此,在这篇文章中,我们已经看到了如何春的JDBC模板可在基于Java的标准和企业应用程序中使用. 我们还讨论了这种方法的优点,以及它如何使发展与基于JDBC标准的发展快得多.
让我们总结一下我们在以下要点的形式讨论 -
- 春天已成为现代基于Java的企业应用开发环境的重要组成部分.
- Spring有不同的部分, 外面, JDBC的模板是一个重要组成部分.
- 春天JDBC模板,通过采取资源获取的负荷减轻的发展, 连接管理, 异常处理, 和一般的错误检查. 我们作为一个开发人员只需要专注于复杂的业务场景.