JDBC基础学习

一、JDBC概述

JDBC,(Java DataBase Connectivity:java数据库连接,sun公司推出的java访问数据库的标准规范(接口))。
1、JDBC是一种用于执行SQL语句的java api
2、JDBC可以为多种关系数据库提供统一访问入口。
3、JDBC由一组java工具类和接口组成。

二、JDBC原理

sun提供访问数据库规范成为JDBC,而生产厂商提供规范的实现类称为驱动。
JDCB是接口,驱动是接口的实现,没有驱动将无法连接数据库。每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都是由数据库生产厂商提供。

三、JDBC开发步骤

1、注册驱动
第一种方法:Class.forName("com.mysql.jdbc.Driver");
(1)JDBC规范定义驱动接口:java.sql.Driver
(2)Mysql驱动包提供了实现类:com.mysql.jdbc.Driver
另一种方法:DiverManager工具类,提供注册驱动的方法registerDriver(),方法的参数是java.sql.Driver,所以可以通过以下语句进行注册:DriverManager.registerDriver(new com.mysql.jdbc.Driver());
但是这种方法并不推荐,原因有二:其一,这种方式是硬编码,不易于程序扩展和维护;其二,驱动被注册了两次。(com.mysql.jdbc.Driver源码中Driver类有一个静态块执行注册。)
2、获得连接

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","123");

获取连接需要方法DriverManager.getConnection(url,username,password),url:需要连接的数据库的位置(网址) username用户名 password密码
url:jdbc:mysql://localhost:3306/mydb1
JDBC规定url的格式由三部分组成,每部分中间:分割。第一部分:是jdbc,这是固定的。第二部分:数据库名称。第三部分:由数据厂商规定,Mysql的第三部分分别有数据库服务器的IP地址(localhost)、端口号(3306)、以及DATABASE名称组成。
扩展url参数jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8特别注意不是UTF-8
3、获得语句执行者

String sql = "insert into category(cid,cname) values('c007','分类')";

Statement语句执行者代码:
Statement stmt = con.createStatement();
常用方法:
(1)执行SQL语句:
int executeUpdate(String sql);——执行insert update delete 语句(DML语句)int表示影响的行数。
ResultSet executeQuery(String sql);——执行select语句(DQL语句)ResultSet代表结果集。
boolean execute(String sql);——执行select返回true执行其他的语句返回false。(如果返回true,需要使用getResultSet()获得查询结果;如果返回false,需要使用getUpdateCount()获得影响行数)
执行批处理:(可选)
addBatch(String sql);
clearBatch();
executeBatch();
特点:如果有参数,需要在sql语句中进行拼凑,存在sql注入问题。

4、预处理对象
PreparedStatement于处理对象。方法同Statement。不同点是:预处理对象在创建时传入sql语句作为参数。
PreparedStatement pstmt = con.prepareStatement(sql);
设置实际参数:setXxxx(int,T)通过setter方法将?占位符替换成实际参数。(int代表第几个问号,从1开始;T表示要传入的实际参数)
5、处理结果集
ResultSet实际上就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用rs对象的next()方法把“行光标“向下移动一行,当第一次调用next()方法时,”行光标“就到了第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据了;
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
在ResultSet类中提供了一系列的getXXX方法,常用的有:
Object getObject(int col)获得任意对象
String getString(int col)获得字符串
int getInt(int col)获得整形
double getDouble(int col)获得双精度浮点型
6、释放资源
与IO流一样,最后得到的先关闭!!
rs.close();
stmt.close();
con.close();

四、JDBC连接池&DBUtils(10)

1、简单介绍:

在之前的开发中,每次使用JDBC连接数据库都要建立连接,然后在当前使用结束后就要释放资源。在实际开发中“获取连接”和“释放连接“是非常消耗资源的两个过程,这样处理的结果是会造成资源浪费。而是用JDBC连接池可以提升开发的性能。(我们会通过将一些重复的操作比如建立连接、释放资源这些代码都封装为一个工具类,这样可以精简代码量,方便开发)。

2.1、连接池的概念

用池来管理connection。连接池是用集合来表示,内部存放着Connection,这样在开发中我们只需要从池中获取connection对象,使用完之后,不会真的关闭connection,而是将它归还到池中,池就可以再次利用这个对象了。

2.2、规范

java为数据库连接池提供了公共的接口:javax.sql.DataSource。
常见的连接池:DBCP、C3P0(最常用)

2.3、自定义连接池

(1)实现接口javax.sql.DataSource中的getConnection()
(2)提供一个集合,用于存放connection,因为要方便存取,所以我们使用LinkedList
(3)在静态代码块中为连接池初始化N个连接。
(4)以后程序需要连接,调用实现类的getConnection方法,从List中获取连接。为保证连接只被一个线程使用,我们需要将连接从连接池中移除。
(5)用户使用结束后,不调用close方法,而是将连接添加回连接池中。

2.4自定义连接池

增强close方法,使得调用close方法即可完成将连接放回连接池的操作。
方法增强总结:(仅仅是了解,后续学习)

1.继承,子类继承父类,将父类的方法进行重写
2.装饰者模式,这是一个专用于增强方法的设计模式。必须要有接口,且需要将所有方法实现。
3.动态代理,在运行时动态地创建代理类,完成增强操作。类似装饰者。必须有接口,且需要利用反射技术。
4.字节码增强,运行时创建目标类子类,从而进行增强。常见的第三方框架:cglib、javassist

这里学习装饰者模式。
装饰者固定结构:接口A,已知实现类C,需要装饰者创建代理类B。
1.创建类B,并实现接口A
2.提供类B的构造方法,参数类型为A,用于接收A接口的其他实现类(C)
3.给类B添加类型为A的成员变量,用于存放A接口的其他实现类
4.增强需要的方法
5.实现不需要增强的方法,方法体中调用成员变量实现的其他类对应的方法。
注意:必须在自定义的Connection类中重写 prepareStatement(String sql)方法!否则无法返回preparedStatement对象!

2.5、C3P0连接池

C3P0是个开源免费的连接池,目前使用它的有Spring Hibernate等。这是个第三方工具,需要导入jar包,使用时还需要添加配置文件c3p0-config.xml(也可以不使用配置文件)。也可以使用properties。

配置文件

配置文件名称(固定):c3p0-config.xml
配置文件路径:src(classloader’s resource path)

2.6、DBCP连接池

也是开源的连接池,tomcat的内置连接池。需要导入jar包

配置文件

配置文件名称:*.properties
配置文件位置:建议放在src即classloader’s resource path
配置文件内容:properties不能编写中文,不支持在STS中修改,必须使用记事本修改内容,否则中文注释就会乱码。

3、DBUtils
3.1、JavaBean 在开发中用于封装数据。有以下几个点:

(1)需要实现接口:java.io.Serializable(一般省略了)
(2)提供私有字段:private 类型 字段名;
(3)提供getter/setter方法
(4)提供无参构造。

3.2、DBUtils概述

DBUtils是java编程中非常实用的工具。对JDBC进行了封装,简化了操作。
DBUtils三个核心功能
QueryRunner中提供对sql语句操作的API
ResultSetHandler接口,用于定义select操作后怎样封装结果集。
DbUtils类,它就是一个工具类,定义了关闭资源和事务处理的方法。

3.2.1、QueryRunner核心类

(1)QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层自动维护连接Connection
(2)update(String sql,Object…params),执行更新
(3)query(String sql,ResultSetHandler< T> rsh,Object…params),查询

3.2.2、ResultSetHandler结果处理集类

重点掌握以下几个:
(1)BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中
(2)BeanListHandler:将结果集中每一条记录封装到一个指定的javaBean中,将这些javaBean**封装到List集合中**。
(3)ScalarHandler :它是用于单数据。例如select count(*) from 表操作。它会将结果集中的数据返回为long型。可以使用包装类Long对其进行类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值