测试结果:
/**
* 测试
* @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封装工具包,包括规范model格式接口,封装SpringJdbcTemplate,实现分页,自适应多种数据库
创建日志表,保存“操作人”、"操作方法"、"操作中必要的参数"(若有多个,可以封装在Bean中,如何获取,请参考上次实验中的参考资料), 2. 创建Person的pojo、Dao接口及实现类,Dao中有增删查改方法。创建切面类...
JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。 除了大量...
SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...
CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,目前的版本完全兼容于Oracle...
SpringJDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做...
它和Spring的JdbcTemplate很想,也是对Jdbc的简单封装 以上这些都不是框架 JDBC是规范 Spring的JdbcTemplate和Apache的DBUtils都只是工具类 4.mybatis的概述 mybatis是一个持久层框架,用java编写的。 ...
这篇文章主要介绍了Spring5源码之JDBC,基于上一篇Spring5之JDBC使用案例来一步步剖析jdbcTemplate操作数据库的源码。需要的朋友可以参考一下。 1、save/update功能实现 在UserServiceImpl中jdbcTemplate的初始化是...
一、什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。...Apache的DBUtils:和spring的jdbcTemplate很像,也是对jdbc的简单封装 以上这些都不是框架,jdbc是规范,jd
CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,目前的版本完全兼容于Oracle...
3. 使用JdbcTemplate技术封装JDBC 4. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您 5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误 需求分析 使用三个部分完成上述需求,第一部分是...
合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合...
简单邮件 HTML 邮件 内嵌图片或附档 排程 Spring则对 java.util.Timer提供了抽象封装,让您可以善用Spring的容器管理功能,而Spring对Quartz进行了封装,让它在使用上更加方便。 使用 ...