JDBC高级部分

/**  采用模版类型,封装了基本数据的CRUD操作  基本属性从外部属性文件读取(如config.properties)
*/public class BaseDao<T>
{
    private InputStream in=this.getClass().getResourceAsStream("/com/tank/comm/config.properties");
    private Properties properties=new Properties();

    Connection conn=null;
    PreparedStatement pstat=null;;
    ResultSet res=null;

    /*public static void main(String[] args) {
        System.out.println("----------");
        new BaseDao().getConn();
        System.out.println("----------");
    }*/

    public Connection getConn()
    {
        try
        {
            properties.load(in);
            //System.out.println("加载文件路径");
            Class.forName(properties.getProperty("driver"));
            conn=DriverManager.getConnection(properties.getProperty("url"),
                                            properties.getProperty("username"),
                                            properties.getProperty("password"));
            System.out.println("数据库连接成功!");
            return conn;
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return null;
    }

    /*
     * 封装方法,用来执行insert,update,delete 功能
     ***/
    public int executeUpdate(String sql,Object[]param)
    {
        int rows=0;
        try
        {   this.getConn();
            pstat=conn.prepareStatement(sql);
            if(param!=null&&param.length!=0)
            {

                for(int x=0;x<param.length;x++)
                {
                    pstat.setObject((x+1), param[x]);

                }
            }
            rows=pstat.executeUpdate();
        }
        catch(Exception ex)
        {

            ex.printStackTrace();
        }
        finally
        {
            this.closeAll(conn, pstat, res);
        }
        return rows;

    }

    /**
     *封装执行select语句
     * */
    public List<T> executeQuery(String sql,Object[]param,Class<T> cls)
    {
        List<T> list = new ArrayList<T>();

        this.getConn();
        try
        {
            pstat=conn.prepareStatement(sql);

            if(param!=null&&param.length!=0)
            {

                for(int x=0;x<param.length;x++)
                {
                    pstat.setObject((x+1), param[x]);

                }
            }

            res=pstat.executeQuery();

            while(res.next())
            {
                //1  创建对象
                T obj =cls.newInstance();
                //对象属性赋值
                Field []fs=cls.getDeclaredFields();
                for(int x=0;x<fs.length;x++)
                {
                    Field f=fs[x];

                    f.setAccessible(true);
                    //属性的类型
                    String ct = f.getType().getName();
                    String name=f.getName();
                    if(ct.equals("java.lang.String"))
                    {
                        f.set(obj, res.getString(name));

                    }
                    if(ct.equals("int"))
                    {
                        f.set(obj, res.getInt(name));
                    }
                    if(ct.equals("double"))
                    {
                        f.set(obj, res.getDouble(name));

                    }
                    if(ct.equals("java.sql.Date"))
                    {
                        f.set(obj, res.getDate(name));

                    }
                    if(ct.equals("char"))
                    {
                        f.set(obj, res.getString(name));

                    }

                }

                list.add(obj);
            }
            System.out.println("列表长度:"+list.size());
            return list;

        }
        catch(Exception ex)
        {

            ex.printStackTrace();
        }
        finally
        {
            this.closeAll(conn, pstat, res);
        }
        return null;

    }
    /**
     * 重载executeQuery方法
     * 增加实体类的指定属性赋值
     *   * @param   sql  传入的sql语句   @param   param  传入的参数数组    @param   cls    传入的映射类(用由<T> 指定,避免出现类型转化等警告信息)   @param   propertyList  属性集合,可以只为为映射类的指定属性赋值
     * */
    public List<T> executeQuery(String sql,Object[]param,Class<T> cls,List<String> propertyList){
        List<T> list =new ArrayList<T>();
        this.getConn();
        try{
            pstat=conn.prepareStatement(sql);
            if(param!=null&&param.length!=0)
            {
                for(int x=0;x<param.length;x++)
                {
                    pstat.setObject((x+1), param[x]);
                }
            }
            res=pstat.executeQuery();

            //如果参数集合为空,返回上层默认实体类所有属性赋值
            if(propertyList.isEmpty()){
                this.executeQuery(sql, param, cls);
            }else{
                //不为空,则为集合内指定属性赋值
                //取出实体类的所有属性
                while(res.next()){
                    //创建实例对象
                    T obj=cls.newInstance();
                    //获取所有反射属性
                    Field fields[]=cls.getDeclaredFields();
                    for(int x=0;x<fields.length;x++)
                    {
                        Field f=fields[x];
                        f.setAccessible(true);
                        String fname=f.getName();
                        //判断集合是否包含该属性名,如果包含,为其赋值
                        if(propertyList.contains(fname)){
                            String ct=f.getType().getName();
                            if(ct.equals("java.lang.String"))
                            {
                                f.set(obj, res.getString((fname)));

                            }
                            if(ct.equals("int"))
                            {
                                f.set(obj, res.getInt((fname)));
                            }
                            if(ct.equals("double"))
                            {
                                f.set(obj, res.getDouble((fname)));

                            }
                            if(ct.equals("java.sql.Date"))
                            {
                                f.set(obj, res.getDate((fname)));

                            }
                            if(ct.equals("char"))
                            {
                                f.set(obj, res.getString((fname)));
                            }
                        }
                    }
                    //将对象添加到集合
                    list.add(obj);
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            this.closeAll(conn, pstat, res);
        }
        return list;
    }

    //关闭连接,释放资源
    public void closeAll(Connection conn,PreparedStatement pstat,ResultSet res)
    {
        try
        {
            if(res!=null)
            {
                res.close();
            }
            if(pstat!=null)
            {
                pstat.close();
            }
            if(conn!=null)
            {
                conn.close();
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

}
时间: 2024-08-13 15:15:28

JDBC高级部分的相关文章

JDBC高级特性(一)结果集,批量更新

一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本中, ResultSet仅能向前滚动 在JDBC后续版本中, ResultSet默认能向前滚动或前后滚动 迟缓滚动:记录集可前后滚动,不受数据库数据更新影响 灵敏滚动:记录集可前后滚动,受数据库数据更新影响 由结果集类型设定 con.createStatement() con.createStatement(结果集类型, 结果集并发类型) con.createStatement(结果集

Java JDBC高级特性

1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现了批处理.测试表结构如下: Statement批处理程序示例 1 package server; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 impor

JDBC高级编程

1.事务简介 事务(Transaction):数据库中保证交易可靠的机制 JDBC支持数据库中的事务概念 在JDBC中,事务默认是自动提交 事务特性ACID: 原子性(Atomicity):事务必须是原子工作单位:对于数据修改,要么全都执行,要么全都不执行 一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态 隔离性(Isolation):用并发事务所作的修改必须与任何其他并发事务所作的修改隔离 持久性(Durability):事务完成之后,它对于系统的影响是永久的 事

JDBC高级应用 - DAO模式与JavaBean

DAO模式与JavaBean DAO数据库操作对象(Data Access Object):负责连接数据库,通过集合获取数据库中的数据,对数据进行CRUD的操作. DAO出现之前,操作数据库的代码与业务代码都出现在JSP或Servlet中,不利于业务代码的分离.DAO出现后改变了这一情况,所有与数据库相关的操作都被拿到了DAO层实现,Servlet或JSP中只操作JavaBean与DAO层,而DAO只操作数据库. 事务实例:转账 张三转200元到李四的银行账户,李四要买英雄联盟皮肤. 要分两个步

JDBC高级应用 - 数据源(连接池)

数据源(连接池) (1)我们之前使用JDBC进行数据库访问时,首先是获得一个JDBC连接,执行增删改查操作后,关闭数据库连接. (2)但是我们使用的resultset.statement.conncetion在创建和关闭时都需要耗费较多时间,而且占用资源.特别是在企业级应用中,一般是很多人同时访问,如果每个人访问都给他们建立一个新的连接,并在使用完后又关闭,如果一个连接的建立和关闭以0.1秒计算,则1000个人就是100秒,如果是要承载上千万人同时访问的sina网站呢. 因此JDBC可以应对小型

JDBC高级特性(二)分布式事和JTA基本原理

在进入主题之前我们首先来了解一下JNDI和连接池~ 一.JNDI 1)是一组在Java应用中访问命名和目录服务的API(Java命名与目录接口) 命名服务将名称和对象联系起来,使得我们可以通过名称访问对象. 目录服务是命名服务的扩展,两者之间的关键差别是目录服务中对象可以有属性(例如:用户有email地址),而命名服务中对象没有属性. 2)JNDI API提供了一种统一的方式,可以在本地或网络上查找和访问服务 各种服务在命名服务器上注册一个名称,需要使用服务的应用程序通过JNDI找到对应服务就可

JDBC高级特性(二)事务、并发控制和行集

一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommit(false),取消自己主动提交 2)对数据库运行一个或多个操作(一个或多个SQL语句) 3)con.commit().提交事务(上面的第二部的多个操作就作为一个总体提交运行) 4)假设某个操作失败.通过con.rollback()回滚全部操作(撤销以上的操作,将数据恢复为运行前状态) 事务处理依

第13章WEB13-JSP模式&amp;JDBC高级篇

今日任务? 使用MVC设计模式开发一个转账案例教学导航教学目标掌握JSP的设计模式了解MYSQL的事务管理掌握JDBC的事务管理会使用DBUtils完成事务的管理教学方法案例驱动法1.1 上次课内容回顾:JSP : JSP的概述: JSP:Java Server Pages. JSP的运行原理:翻译成Servlet,编译成Class进行执行. JSP的脚本元素: <%! %> <% %> <%= %> JSP的注释: JSP的三个指令: page,include,tag

JDBC高级-事务

(一)什么是事务 事务:是数据库的概念,逻辑上的一组操作,组成这级操作的各个单元,要么全部成功,要么全部失败. 主要是针对批量的insert.update.delete语句 (二)事务的作用 保证多条SQL的数据变更,要么全部成功,要么全部失败. 在实际业务场景里,通常会遇到一些特殊的业务:这些业务需要由多条SQL操作来一起完成.如果没有事务,那么每执行一条SQL,数据变更会立即生效:但是如果在执行过程中,某一条SQL执行失败或者出现了异常,前边的SQL变更已经生效,但是后边的SQL就不执行了,