jdbc高级模板技术

来源:互联网 发布:centos 网卡uuid 编辑:程序博客网 时间:2024/06/02 01:26

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();}
原创粉丝点击