JDBC 高级

JDBC 高级

一. 数据库连接池的概念

数据库连接池: 用来分配,管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是再重新建立一个,能明显提高对数据库操作的性能

作用: 避免重复创建连接,提升程序的执行效率

二.开源数据库连接池

	**C3P0**: 配置文件会自动加载,但是必须f放在src文件夹下,名字必须叫c3p0-config.xml或c3p0-config.properties
  1. 导包 2. 配置信息 3. 获取连接

    …后面跟jdbc入门一样

    package C3P0_Demo1;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    

import java.sql.SQLException;

public class Demo1 {
public static void main(String[] args) {
//获取对象
DataSource ds = new ComboPooledDataSource();
try {
//获取连接对象
Connection con = ds.getConnection();
//获取预编译执行对象
PreparedStatement sta = con.prepareStatement(“select * from student”);
//获取ResultSet 结果集对象
ResultSet res = sta.executeQuery();
while (res.next()) {
System.out.print(res.getInt(“sid”));
System.out.print(res.getString(“NAME”));
System.out.print(res.getInt(“age”));
System.out.println(" ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

    

    
**Druid:**
    
​			不会自动加载配置文件,需要我们手动加载,名字就可以我们自己定义.
    
    ```java
    package Druid_Demo1;
    
    import Utils.DataSourceUtils;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Properties;
    
    public class Demo1 {
        public static void main(String[] args) {
            Connection con = null;
            PreparedStatement sta = null;
            ResultSet res = null;
            try {
                // 通过DataSourceUtils 工具类获取连接对象
                con = DataSourceUtils.getCon();
                sta = con.prepareStatement("select * from student");
                res = sta.executeQuery();
                while (res.next()) {
                    System.out.print(res.getInt("sid"));
                    System.out.print(res.getString("NAME"));
                    System.out.print(res.getInt("age"));
                    System.out.println("  ");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                DataSourceUtils.close(con, sta, res);
            }
        }
    
    }
    
    
    ```
    
    
    
    **数据库连接池工具类**
    
     目的: 简化(封装) DataSource 的创建步骤
    
    ​			一个程序只需要维护一个DataSource
    
     步骤:  私有工具类的构造方法
    
    ​			静态代码块中实现DataSource 的初始化
    
    ​					加载配合文件
    
    ​					创建DataSource
    
    ​			提供获取Connection 的方法
    
    ​			释放资源 
    
    ```java
    package Utils;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    
    public class DataSourceUtils {
        //私有构造方法,
        private DataSourceUtils() {
    
        }
    
        //定义数据库连接池
        private static DataSource ds;
    
        static {
       
        //注意:  在读取src文件下的源文件时:
      InputStream in = DataSourceUtils.class.getClassLoader().getResourceAsStream("路径名");
        //  在读取web文件下的源文件时:
      InputStream in = this.getServletContext().getResourceAsStream("路径名")
         //通过类加载器动态获取输入流 
            InputStream in = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            Properties p = new Properties();
            try {
                p.load(in);
                ds = DruidDataSourceFactory.createDataSource(p);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //定义获取连接池对象的方法
        public static DataSource getDs() {
            return ds;
        }
    
        //定义获取连接对象的方法
        public static Connection getCon() {
            Connection con = null;
            try {
                con = ds.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return con;
        }
    
        //关闭资源的方法
        public static void close(Connection con, PreparedStatement sta, ResultSet res) {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (sta != null) {
                try {
                    sta.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (res != null) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void close(Connection con, PreparedStatement sta) {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (sta != null) {
                try {
                    sta.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    ```
    
    
    
    

####  三. JDBC 自定义框架

​	**背景:**    封装一些方法,将之前那些重复的操作,抽取到模板类中,能大大简化使用步骤 

​	**源信息:**  代表当前数据库标的结构信息(字段名称以及数据类型).

##### 	框架的编写:

```java
/*
 * JDBC框架类
 * */
public class JDBCTemplate {
    //1.定义参数变量(数据源、连接对象、执行者对象、结果集对象)
    private DataSource ds;
    private Connection con;
    private PreparedStatement sta;
    private ResultSet res;

    // 构造方法.给DataSource 赋值
    public JDBCTemplate(DataSource ds) {
        this.ds = ds;
    }

    /*
     * 增删改的操作
     * */
    public int update(String sql, Object... obj) {
        //定义变量,表示操作的行数
        int result = 0;
        sta = getSta(sql, obj);
        //获取ResultSrt 对象
        try {
            result = sta.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /*
     * 定义一个方法,用来获取执行者对象
     * */
    public PreparedStatement getSta(String sql, Object... obj) {
        try {
            //获取连接对象
            con = ds.getConnection();
            //获取执行对象
            sta = con.prepareStatement(sql);
            //通过执行对象动态获取参数的源信息对象
            ParameterMetaData parameterMetaData = sta.getParameterMetaData();
            //通过源信息对象获取参数共有多少列
            int parameterCount = parameterMetaData.getParameterCount();
            //判断获取到的列数和sql语句要预编译的参数个数是否相等,相等则说明获取正确
            if (obj.length == parameterCount) {
                //给sql的参数占位符赋值
                for (int i = 0; i < obj.length; i++) {
                    sta.setObject(i + 1, obj[i]);
                }
            } else {
                //参数个数不匹配这说明获取到的数据有误
                throw new RuntimeException("参数个数不匹配");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sta;
    }
    /*
     * 查询数据,返回一个对象
     * */
    public <T> T findQuery(String sql, ResultSetHandler<T> rsh, Object... obj) {
       T handler = null;
        //获取执行者对象
        PreparedStatement sta = getSta(sql, obj);
        try {
            ResultSet res = sta.executeQuery();
            handler = rsh.handler(res);

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return handler;
    }
}

/*
    用于处理结果集方式的接口(策略者模式)
 */
public interface ResultSetHandler<T> {
    <T> T handler(ResultSet res);
}

/*
    实现类:用于将查询到的一条记录,封装为指定对象并返回
 */

public class BeanHandler<T> implements ResultSetHandler<T> {

   
    //定义Class 对象,用来确定对象属性
    //以学生对对象为例, Student.class 获取到的就是学生对象的 calss 对象.可以通过反射直接new 对象
    //Class<Student> studentClass = Student.class;  
    private Class<T> beanClass; 

    //定义构造方法,给beanClass 赋值
    public BeanHandler(Class<T> beanClass) {
        this.beanClass = beanClass;
    }

    //重写方法,用于将一条记录封装成一个自定义对象
    @Override
    public T handler(ResultSet res) {
        //定义自定义变量类型
        T bean = null;
        try {
            //创建对象
            bean = beanClass.newInstance();//Student stu=studentClass.newInstance(); 
            //判resultSet 是否有数据
            if (res.next()) {
                //获取结果源信息对象
                ResultSetMetaData metaData = res.getMetaData();
                //通过结果源信息对象获取结果集中的参数个数
                int count = metaData.getColumnCount();
                //循环列数
                for (int i = 1; i <= count; i++) {
                    //获取字段名
                    String catalogName = metaData.getColumnName(i);
                    //获取对应的数据
                    Object object = res.getObject(catalogName);
                    //创建属性描述器对象,将获取到的值通过该对象的set方法进行赋值
  PropertyDescriptor pd = new PropertyDescriptor(catalogName.toLowerCase(), beanClass);
                    //获取set方法
                    Method writeMethod = pd.getWriteMethod();
                    //执行set方法,给成员变量赋值
                    writeMethod.invoke(bean, object);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

   /*
		测试类   
	   */
	@Test
    public void findQuery() {
        String sql = "select * from student where sid=?";
        Student stu= jdbcTemplate.findQuery(sql, new BeanHandler<Student>(Student.class),1);
        System.out.println(stu);
 //        Class<Student> studentClass = Student.class;
//        Student student = studentClass.newInstance();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值