一、JDBC是什么?
JDBC:Java Database Connectivity(Java数据库连接池)。指定了统一的访问各种关系型数据库的标准接口-----桥梁作用。
功能:【与数据库建立连接】【向数据库发送SQL请求】【处理从数据库返回的结果】
步骤如下:A. 加载并注册数据库驱动----【数据库不同驱动链接不同】
Class.forName("com.mysql.cj.jdbc.Driver");
B. 通过DriverManager获取数据库连接
Connection conn=DriverManager.getConnection(String url,String username,String password);
C. 通过Connection对象获取Statement对象
stat=conn.createStatement();
D. 使用Statement执行SQL语句
int num1=sta.executeUpdate(sql); 或者 res = stat.executeQuery(sql);
E. 操作ResultSet结果集
ResultSet.next()
用JavaBean封装查询出来的数据对象
F. 关闭连接,释放资源
stat.close();//这里并非最好的关闭方式 res.close(); conn.close();
关闭流的顺序---推荐反着来----先关ResultSet---Statement----Connection---推荐显式关闭---并关闭前判断是否为空
原因是:关闭Conneciton,且Statement若不手动关闭,将由GC机制自动关闭,且再关闭前Statement对象和ResultSet对象将被占用。
若在自动关闭前-----数据库连接池的连接数量达到最大允许值--此时将会抛异常。
Driver接口:JDBC程序必须实现的接口,专门提供给提供数据库厂商使用。
DriverManager类:管理数据库中所有的驱动程序,用于加载JDBC驱动,在数据库的驱动程序之间建立连接。
Connection接口:代表与特定的数据库的连接,只有获得其连接对象才能访问数据库,在上下文中执行SQL语句的返回结果。
Statement接口:用于执行静态的SQL语句,并返回一个结果对象。
execute():可以执行任何SQL语句。
executeUpdate()执行增删改语句,返回一个int的值,即影响的行数。
executeQuery()执行查询语句,返回一个查询结果的ResultSet对象
二、如何更好的优化JDBC?
PreparedStatement接口:是Statement的子接口,执行预编译的SQL语句。
用占位符“?”来代替其他参数,再通过SetXxx()方法赋值。预编译SQL语句。
ResultSet接口:类似一个临时表,用来暂时存放数据库查询操作所返回的结果集,封装在一个逻辑表格中。
该接口中存有一个指向表格数据行的游标(或指针),调用next()方法游标移动下一行,若无数据,返回false。
定义getXxx()方法既可以通过字段的元素指引获取数据,也可以通过字段的名称来获取指定元素。
注意:mysql8.0以上版本-----url中要加入时区信息:serverTimezone=UTC。
且Mysql的驱动链接有改变:com.mysql.cj.jdbc.Driver
使用JavaBean文件的setXxx方法要与数据库的字段名相同。
二、如何更好的优化JDBC?
当用户量过多时,每次都需要创建Connection对象,这是件很消耗性能的事情。因此,诞生了数据库连接池
数据库连接池:负责分配、管理、释放数据库连接,允许应用程序重复使用现有的数据库来接。
数据源:实现了Javax.sql.DataSource接口的类称为数据源,即数据源中存储了所有建立数据库连接的信息,即数据来源。
DataSource接口:为获取数据库连接对象(Connection),负责与数据库建立连接,并定义返回值为Connection对象的方法。
DBCP数据源:数据库连接池(DataBase Connection Pool)的简称,apache组织下的开源连接池的实现。
BasicDataSource:是DataSource接口的实现类,主要包括设置数据源对象的方法。a.需要手动给数据源对象设置属性值,然后获取数据库连接对象。
BasicDataSourceFactory:是创建BasicDataSource对象的工厂类,
它包含一个返回值为BasicDataSource对象的方法createDataSource()方法。
该方法通过读取配置文件的信息生成数据源对象并返回给调用者。
dpcpconfig.properties #连接设置 driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username=root password=123456 #初始化连接 initialSize=5 #最大连接数量 maxAcitve=10 #最大空闲连接 maxIdle=10
通过配置文件读取数据源得到连接
public static DataSource ds=null;
static {
Properties prop=new Properties();//新建配置文件对象
InputStream in = new Dbcp2().getClass(). //通过类加载器找到文件路劲,读配置文件
getClassLoader().getResourceAsStream("dbcpconfig.properties");
prop.load(in);//以输入流的形式加载到配置对象中
ds=BasicDataSourceFactory.createDataSource(prop);}//创建数据源
C3P0数据源:实现了DataSource数据源接口,开源框架Hibernate和Spring都支持该数据源。
ComboPooledDataSource:是DataSource接口的实现类,创建数据源对象
a.使用ComboPooledDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象。
b.使用ComboPooledDataSource(String configName)构造方法读取c3p0.xml配置文件,从而创建数据源对象,再获取数据库连接对象。
<c3p0-config> <default-config> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl"> jdbc:mysql://localhost:3306/demo?useUnicode=true& characterEncoding=UTF-8& useSSL=false& serverTimezone=GMT%2B8 </property> <property name="user">root</property> <property name="password">123456</property> <property name="checkoutTimeout">3000</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> <named-config name="itcast"> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl"> jdbc:mysql://localhost:3306/demo?useUnicode=true& characterEncoding=UTF-8& useSSL=false& serverTimezone=GMT%2B8 </property> <property name="user">root</property> <property name="password">123456</property> <property name="initialPoolSize">10</property> <property name="maxPoolSize">200</property> </named-config> </c3p0-config>
通过配置数据源得到数据库连接连接池连接
public static DataSource ds = null;
static {
ComboPooledDataSource cpds=new ComboPooledDataSource("itcast");
ds=cpds;
}
注:配置文件名必须为c3p0-config.xml或者c3p0.properties,并且位于该项目的scr根目录下。
当传入的configName值为空或者不存在时,则使用默认的配置方式创建数据源。
还有阿里巴巴提供的数据源----druid
关于 druid的详细用法和图片来源---木霖森77
DBUtils工具:Apache提供的第三方工具,实现了对JDBC的封装。----对于操作的可观性,提供了很大的便利。
QueryRunner类:简化了执行SQL语句的代码,与ResultSetHandler组合在一起能完成大部分数据库操作。
常见方法:
query(String sql,ResultSetHandler rsh,Object...params):执行查询操作,能从提供给构造方法的数据源或使用SetDataSource()方法中获得连接。
update(String sql,Object...params)方法:执行插入、更新、或删除操作,params可置换多个参数。
ResultSetHandler接口: 处理ResultSet结果集,可以将结果集中的数据转为不同的形式。
BeanHandler和BeanListHandler实现类:将结果集中的数据封装到对应的JavaBean实例中。
ScalarHandler:输出结果集中一行数据的指定字符段值。
MapHandler:把一行结果转为Map对象。
QueryRunner qr=new QueryRunner(DButils.getDataSource());//得到数据源(得到连接)并创建执行器对象
List list=(List)qr.query(sql, new BeanListHandler<User>(User.class));
注意:数据库连接池只是代为管理Connection---意思是:数据库连接的连接数有限,咱若不关闭,它过段时间见帮咱关闭。
这里的关闭,是指把Connection重新放回带连接池,等待下一次取用。当访问量过多,会出现如下情况:
数据库连接连接池的连接数达到上限,无连接可用,持续等待中----有可能抛异常。
问题来了:既然Java代码可以编写JDBC程序,那么为什么还普遍会用配置文件XML或properties???
.............好像是框架采用配置文件加载JDBC,便于更改数据库,但是Java程序更改数据库也不过是换参数
那么-----读取配置文件有那几种方式呢?
老哥这个笔记写超棒,但找不到链接---就直接把网址复制过来了。
@看了下别人写的随笔和自己写的随笔,觉得好差劲--突然在想写笔记的目的无非是我们对知识点的感悟和总结,而每次排版的逻辑和内容梳理也很重要,所以我尽量改进。