类sqljdbc高级模板技术
每日一贴,今天的内容关键字为类sql
1:使用之前学习的jdbc模板技术
A:引入3个包:数据源用到的2个包:commons-dbcp.jar,commons-pool.jar
数据库驱动包:ojdbc14.jar,mysql-connector-xx.jar
B:创立数据库工具类:JDBCUtil.java,该类为数据库工具类,供给数据库的打开,关闭等最基本的功能
采用设计模式:ThreadLocal
C:创立数据库信息文件:db.properties
D:创立数据访问异常类:DataAccessException.java,继承运行时异常,重载其构造函数
E:创立一个映射类:DiscMapper.java,抽象出接口:RowMapper.java
F:创立jdbc模板类:JDBCTemplate.java,该类为抽象类,里面封装了罕见的基于数据库的CRUD操作
供给了一个抽象方法:getRowMapper(),该方法重要实现了RowMapper接口,让查询出来的字段和实体
bean中的属性一一对应。
JDBCUtil.java
/** * <数据库工具类> * @author kandy * @version [V1.00, 2013-5-3] * @see [相关类/方法] * @since V1.00 */ public class JDBCUtil { //定义数据源 private static DataSource ds; //定义当前链接的一个当地线程 private static ThreadLocal<Connection> local =new ThreadLocal<Connection>(); //初始化数据库信息 static { try { //创立Properties类文件 Properties p=new Properties(); //从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。 p.load(JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties")); ds=BasicDataSourceFactory.createDataSource(p); } catch (Exception e) { e.printStackTrace(); } } //获得一个链接(Lazy模式,从线程中获得该链接,如果没有该链接,通过数据源获得连接) public static Connection getConnection() { Connection con = local.get(); if(con==null) { try { con=ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } //将该连接存入当前线程 local.set(con); } return con; } //关闭数据库链接 public static void colse(Connection con ,Statement st, ResultSet rs) { try { if(rs!=null) { rs.close(); } if(st!=null) { st.close(); } if(con!=null) { con.close(); //从线程中移除该链接 local.remove(); } } catch (SQLException e) { e.printStackTrace(); } } //关闭数据库链接 public static void close() { try { //将存放在当地线程下的链接关闭 local.get().close(); //从线程中移除该链接 local.remove(); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { Connection conn = JDBCUtil.getConnection(); System.out.println(conn); JDBCUtil.colse(conn, null, null); } }
db.properties
oracle
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@10.0.5.98\:1521\:ora9
username=wk
password=wk
mysql
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://10.0.5.98\:3306/disc_shop?Unicode\=true&&characterEncoding\=utf8
username=root
password=root
DataAccessException.java
package com.itany.jdbc; //创立数据访问异常类:DataAccessException.java,继承运行时异常,重载其构造函数 public class DataAccessException extends RuntimeException { public DataAccessException() { super(); } public DataAccessException(String message) { super(message); } public DataAccessException(String message,Throwable cause) { super(message,cause); } public DataAccessException(Throwable cause) { super(cause); } }
RowMapper.java
/** * <让表中的字段和java中的属性一一对应> * @author kandy * @version [V1.00, 2013-5-3] * @see [相关类/方法] * @since V1.00 */ public interface RowMapper { public Object mapRow(ResultSet rs )throws Exception; }
创立jdbc模板类:JDBCTemplate.java
/** * * <JDBC模板类,实现罕见的CRUD操作> * * @author kandy * @version [V1.00, 2013-5-3] * @see [相关类/方法] * @since V1.00 */ public abstract class JDBCTemplate { //查询 public List query(String sql,Object ...params) { Connection con =null; PreparedStatement ps =null; ResultSet rs =null; //饿汉式 List list =new ArrayList(); try { con =JDBCUtil.getConnection(); ps=con.prepareStatement(sql); for(int i=0;i<params.length;i++) { ps.setObject(i+1,params[i]); } rs=ps.executeQuery(); while(rs.next()) { Object o=getRowMapper().mapRow(rs); list.add(o); } } catch (Exception e) { e.printStackTrace(); throw new DataAccessException("数据查询异常"); } finally { JDBCUtil.colse(con, ps, rs); } return list; } //查询,将映射类传入 public List query(String sql,RowMapper rm,Object ...params) { Connection con =null; PreparedStatement ps =null; ResultSet rs =null; //饿汉式 List list =new ArrayList(); try { con =JDBCUtil.getConnection(); ps=con.prepareStatement(sql); for(int i=0;i<params.length;i++) { ps.setObject(i+1,params[i]); } rs=ps.executeQuery(); while(rs.next()) { Object o=rm.mapRow(rs); list.add(o); } } catch (Exception e) { e.printStackTrace(); throw new DataAccessException("数据查询异常"); } finally { JDBCUtil.colse(con, ps, rs); } return list; } //插入记录 public Object save(String sql,Object ...params) { Connection con =null; PreparedStatement ps =null; ResultSet rs =null; Object pk =null; try { con =JDBCUtil.getConnection(); ps=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); for(int i=0;i<params.length;i++) { ps.setObject(i+1,params[i]); } //执行新增 ps.executeUpdate(); //获得该记录的主键值 rs=ps.getGeneratedKeys(); if(rs.next()) { pk=rs.getObject(1); } } catch (Exception e) { e.printStackTrace(); throw new DataAccessException("数据插入异常"); } finally { JDBCUtil.colse(con, ps, rs); } //返回该记录的主键值 return pk; } //更新记录 public void update(String sql,Object... params){ Connection con=null; PreparedStatement ps=null; try { con = JDBCUtil.getConnection(); ps=con.prepareStatement(sql); for(int i=0;i<params.length;i++) { ps.setObject(i+1,params[i]); } //执行数据更新 ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); throw new DataAccessException("数据更新异常"); } finally { JDBCUtil.colse(con, ps, null); } } //更新删除 public void delete(String sql,Object... params){ Connection con=null; PreparedStatement ps=null; try { con = JDBCUtil.getConnection(); ps=con.prepareStatement(sql); for(int i=0;i<params.length;i++) { ps.setObject(i+1,params[i]); } //执行数据删除 ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); throw new DataAccessException("数据删除异常"); } finally { JDBCUtil.colse(con, ps, null); } } public int selectmaxId(String sql,Object... params){ Connection con=null; PreparedStatement ps=null; ResultSet rs=null; int result=0; try { con=JDBCUtil.getConnection(); ps=con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i+1, params[i]); } rs=ps.executeQuery(); while(rs.next()){ result = rs.getInt(1); } } catch (Exception e) { e.printStackTrace(); throw new DataAccessException("数据访问异常"); } finally { JDBCUtil.colse(null, ps, rs); } return result; } protected abstract RowMapper getRowMapper(); }
文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”
---------------------------------
原创文章 By
类和sql
---------------------------------