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

你可能感兴趣的:(jdbc)