类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
---------------------------------

posted @ 2013-05-31 21:46  xinyuyuanm  阅读(263)  评论(0编辑  收藏  举报