测试结果:
/**
* 测试
* @param args
*/
public static void main(String[] args) {
/**
* 使用ThreadLocal实现~确保每一个线程都访问自己的connection
* 实际上用main函数测试并不好,使用Thread测试更好~
*/
JdbcTemplateImp jt = new JdbcTemplateImp();
//开启事物
jt.openTransaction();
//查询
List<Map> list = jt.query("select * from emp");
for(Map map : list){
System.out.println(map.get("ENAME"));
System.out.println(map.get("SAL"));
}
//添加方法1
jt.execute("insert into myemp values(8888,'xiaomaha','CLERK',7782,'20-5月-1984',9999,666,20)");
//添加方法2
jt.execute("insert into myemp values(?,?,?,?,?,?,?,?)", new Object[]{
9999,"xiaomaha2","CLERK",7788,"20-5月-1984",9988,66,20});
//删除
jt.execute("delete from myemp where ename=?",new Object[]{"xiaomaha"});
//删除 故意写错,看回滚是否成功! 注释后程序正常~~~~~~~~
jt.execute("delete from myemp where err_ename=?",new Object[]{"xiaomaha"});
//关闭事物
jt.closeTransaction();
}
接口:
package org.jdbc;
import java.util.List;
import java.util.Map;
public interface JdbcTemplate {
/**
* 查询接口
* @param sql
* @return
*/
public List<Map> query(String sql);
/**
* 查询接口
* @param sql
* @param parameters 参数
* @return
*/
public List<Map> query(String sql ,Object[] parameters);
public void openTransaction();
public void closeTransaction();
/**
* 执行接口
* @param sql
*/
public void execute(String sql);
/**
* 执行接口
* @param sql
* @param parameters 参数
*/
public void execute(String sql ,Object[] parameters);
}
实现:
package org.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* jdbc实现连接池实际更好,但这个例子主要是想实现jdbcTemplate功能
* 所以map来装connection,都没写,使用连接池不需要每次关闭connection,只需要回收给map对象
* 简单的pool其实很简单,但考虑到安全及性能需要花费大量时间,和精力
* 这个一个简单的jdbcTemplate实现如下
* @author Administrator
*
*/
public class JdbcTemplateImp implements JdbcTemplate{
public JdbcTemplateImp(){
init();
};
static{
try {
//一个application只需要加载一次,写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private ThreadLocal<Connection> conn = new ThreadLocal<Connection>(); //ThreadLocal
private void init(){
try{
//写成xml读取更好,通过xml或properties文件读取就可以通用了!~略
String url="jdbc:oracle:thin:@localhost:1521:ora",uname= "scott",passw="tiger";
Connection con = DriverManager.getConnection(url,uname,passw);
conn.set(con);
}catch(Exception e){
e.printStackTrace();
}
}
public List<Map> query(String sql , Object[] parameters){
PreparedStatement ps = null;
try {
ps = conn.get().prepareStatement(sql);
for(int i=0 ;i<parameters.length ;i++){
ps.setObject(i+1, parameters[i]);
}
ResultSet rs = ps.executeQuery();
return resultToMap(rs);
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public List<Map> query(String sql){
PreparedStatement ps = null;
try {
ps = conn.get().prepareStatement(sql);
ResultSet rs = ps.executeQuery();
return resultToMap(rs);
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 转换为map类型
* @param rs
* @return
*/
private List<Map> resultToMap(ResultSet rs){
List<Map> list = new ArrayList<Map>();
try {
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
while(rs.next()){
Map<String,Object> map = new HashMap<String,Object>();
for(int i=1 ;i<=colCount ;i++){
String colName = rsmd.getColumnName(i);
Object value = rs.getObject(colName);
map.put(colName, value);
}
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
public void execute(String sql) {
PreparedStatement ps = null;
try {
ps = conn.get().prepareStatement(sql);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.get().rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void execute(String sql, Object[] parameters) {
PreparedStatement ps = null;
try {
ps = conn.get().prepareStatement(sql);
for(int i=0 ;i<parameters.length ;i++){
ps.setObject(i+1,parameters[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.get().rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void openTransaction() {
Connection con = null;
try {
con = conn.get();con.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void closeTransaction() {
Connection con = null;
try {
con = conn.get();con.commit();
} catch (SQLException e) {
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Connection getConn() {
return conn.get();
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
/**
* 使用ThreadLocal实现~确保每一个线程都访问自己的connection
* 实际上用main函数测试并不好,使用Thread测试更好~
*/
JdbcTemplateImp jt = new JdbcTemplateImp();
//开启事物
jt.openTransaction();
//查询
List<Map> list = jt.query("select * from emp");
for(Map map : list){
System.out.println(map.get("ENAME"));
System.out.println(map.get("SAL"));
}
//添加方法1
jt.execute("insert into myemp values(8888,'xiaomaha','CLERK',7782,'20-5月-1984',9999,666,20)");
//添加方法2
jt.execute("insert into myemp values(?,?,?,?,?,?,?,?)", new Object[]{
9999,"xiaomaha2","CLERK",7788,"20-5月-1984",9988,66,20});
//删除
jt.execute("delete from myemp where ename=?",new Object[]{"xiaomaha"});
//删除 故意写错,看回滚是否成功! 注释后程序正常~~~~~~~~
jt.execute("delete from myemp where err_ename=?",new Object[]{"xiaomaha"});
//关闭事物
jt.closeTransaction();
}
}
使用时需要添加对应数据库jar包
dbank下载:
http://dl.dbank.com/c0g1bg6ayl
分享到:
相关推荐
基于spring jdbc的RowMapper自动实现对象映射,大部分功能已经由spring jdbc实现了。2、数据类型的设计:集成了JFinal和SBORM的优点,对字段的大小写不敏感,对强类型实体、弱类型实体和非实体的支持。3、统一的接口...
通过上述分析,我们可以看到SpringJdbcTemplate是一个强大且灵活的工具,它通过封装JDBC操作,使得数据库访问变得更加简单和安全。在实际开发中,合理利用其特性,可以有效提升开发效率和代码质量。
综上所述,自封装的JdbcTemplate是一个简化JDBC操作的实用工具,它通过设计模式和面向对象编程,将复杂的数据库交互转化为简单的API调用,降低了开发难度,提高了代码质量。对于初学者而言,这是一个很好的学习和...
JdbcTemplate是Spring提供的一个抽象层,它封装了JDBC API,通过模板方法设计模式,将常见的数据库操作进行了标准化,比如执行SQL查询、更新、存储过程等。使用JdbcTemplate可以使得代码更加简洁,更易于测试和维护...
"spring封装jdbc查询"是Spring框架中的一个核心功能,旨在简化传统的JDBC(Java Database Connectivity)操作,提高代码的可读性和可维护性,同时减少数据库操作中的潜在错误。以下是对这个主题的详细阐述: 首先,...
`JdbcTemplate`是Spring对JDBC的轻量级封装,它消除了手动管理连接、事务和结果集的繁琐过程,提高了代码的可读性和可维护性。通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种...
JDBCTemplate对JDBC进行了封装,使得数据库操作更加面向对象化。 使用JDBCTemplate,开发者不再需要编写大量的try-catch语句来处理SQLException,也不必关心连接的关闭,因为JDBCTemplate会自动处理这些细节。它...
使用 Spring JdbcTemplate 调用 Oracle 存储过程实现 CRUD 在本文中,我们将讨论如何使用 Spring JdbcTemplate 调用 Oracle 存储过程来实现 CRUD(Create、Read、Update、Delete)操作。我们将首先编写 Oracle 存储...
总的来说,JDBCTemplate是Spring框架中处理数据库操作的强大工具,它通过抽象和封装,使得数据库访问变得更加简洁、安全和高效。对于Java开发者来说,熟练掌握JDBCTemplate的使用能够提高开发效率,降低维护成本。在...
Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们将深入探讨Spring JdbcTemplate的...
JdbcTemplate是Spring提供的一个数据库操作工具类,它封装了JDBC的基本操作,如打开和关闭连接、执行SQL语句、处理结果集等。使用JdbcTemplate,你可以避免大量的样板代码,例如手动处理异常和关闭资源。...
Spring框架中的JDBCTemplate是JDBC的一个高级封装,简化了数据库操作,提供了事务管理、异常转换等功能。使用JDBCTemplate,开发者无需直接与Statement或PreparedStatement对象打交道,而是通过方法调用来执行SQL,...
JDBCTemplate是Spring框架中的一个组件,它封装了JDBC的常用操作,简化了数据库访问,并且提供了事务管理的支持。使用JDBCTemplate,开发者可以避免手动处理SQL字符串和结果集,而是使用模板方法来执行SQL,降低了...
以上就是Spring整合JDBC实现转账业务的基本流程。实际应用中,可能还需要考虑更多的细节,比如异常处理、日志记录、性能优化等。这个demo源代码提供了学习和理解Spring JDBC集成以及事务管理的起点,有助于开发者更...
标签"源码"表明可能会涉及JdbcTemplate的内部实现,包括其如何封装JDBC API,以及如何处理异常和事务。源码分析有助于理解其工作原理,以便于进行更高效的定制或扩展。 标签"工具"可能指的是JdbcTemplate作为一个...
Java中的JdbcTemplate...通过以上内容,我们可以了解到JdbcTemplate如何简化了Java与MySQL数据库的交互,并在实际项目中实现高效的数据持久层操作封装。正确理解和使用JdbcTemplate能显著提高开发效率,降低出错概率。
Spring框架是Java开发中广泛使用的轻量级框架,它提供了对数据库操作的强大支持,通过封装JDBC(Java Database Connectivity)来简化数据访问。在本例中,我们将深入探讨Spring如何通过JdbcTemplate实现对数据库的...
在这个项目中,我们看到开发者利用Lucene结合jdbcTemplate来封装API,并引入缓存机制,以实现索引的精确刷新。这是一项高级的技术实践,旨在提高系统的响应速度和数据一致性。 首先,让我们详细了解一下Lucene。...
项目经理编写的这个`JDBCTemplate`框架,可能是基于Spring的`JdbcTemplate`进行了二次开发或者封装,以适应项目的特定需求。 `JdbcTemplate`的主要功能包括: 1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句...
"标签"中的"spring jdbc dao"强调了这个项目的核心特性:使用Spring JDBC进行数据访问,并且关注DAO层的实现。DAO层的封装是常见的做法,它可以减少重复代码,提高代码的复用性,并且使代码结构更加清晰。 在文件名...