目录
第五步:处理结果集(insert /update/delete无需处理)
1.Java的数据库编程:JDBC
JDBC:即Java Database Connectivity,Java数据库库连接,Java数据库连接,是一种用于执行SQL语句的Java API。它是Java中的数据库连接规范。它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
2.JDBC工作原理
JDBC为多种关系库提供了统一访问方式,作为特定厂商数据库访问API的一张高级抽象,他主包含一些通用的接口类。Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
JDBC访问数据库层次结构:
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库。每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
3.JDBC使用
准备数据库驱动包,并添加到项目的依赖中:
用的依赖包为:mysql-connector-java-5.1.47.jar
3.1 JDBC的使用步骤
3.2 JDBC的具体使用
第一步:加载数据库驱动
//语法:DriverName就是数据库驱动类所在对应的字符串
calss.forName("DriverName");
//注册驱动:用来告诉JVM使用的是哪个生产厂商的驱动
//加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,
//即将该类加载到JVM方法,并执行该类的静态方法块,静态属性
//加载到MySQL数据库驱动
class.forName("com.mysql.jdbc.Driver");
//加载Oranle数据库驱动
class.forName("oracle..jdbc.Driver.OracleDriver");
JDBC规范定义驱动接口:java。sql.Driver,MySQL驱动包提供了实现类:com.mysql.jdbc.Driver
第二步:创建数据库连接Connection
//创建数据库
Connection connection=DriverManager.
getConnection("jdbc:mysql://localhost:3306/test,'root','123456'");
说明:
- JDBC规范定义驱动接口:java。sql.Driver,MySQL驱动包提供了实现类:com.mysql.jdbc.Driver
- 获取连接需要方法:DriverManager.getConnection(url,userName,password),三个参数的意思:
- url为连接数据库的位置(网址),userName为用户名,password为密码
- MySQL数据库连接的URL参数格式为:jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
- JDBC规定url的格式由三部分组成,每个部分中间使用冒号分割。
- 第一部分:jdbc,这是固定的;
- 第二部分:数据库名称,连接的是MySQL数据库,第二部分就写mysql;
- 第三部分:它是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,MySQL的第三部分分别由数据库服务的IP地址(localhost)、端口号(3306)、以及DATABASE名称(mydb)组成。
第三步:创建操作命令(Statement)
String sql="某个sql语句";
//获取Statement语句执行平台
Statement statement = connection.createStatement();
第四步:执行SQL语句
ResultSet resultSet=statement.executeQuery(
"select id,sn,name,qq_main,calsses_id from student");
执行SQL方式:
- execute(String sql):用于执行任意的SQL语句。
- executeQuery(String sql):用于执行查询语句,返回ResultSet结果集对象。
- executeUpdate(String sql):主要用于执行DML(数据操作语言)和DDL(数据定义语言)语句。执行DML语句(INSERT、UPDATE或DELETE)时,会返回受SQL语句影响的行数,执行DDL(CREATE、ALTER)语句返回0。
第五步:处理结果集(insert /update/delete无需处理)
while (resultSet.next()) {
int id = resultSet.getInt("id");
String sn = resultSet.getString("sn");
String name = resultSet.getString("name");
int classesId = resultSet.getInt("classes_id");
System.out.println(String.format("Student: id=%d, sn=%s, name=%s,
classesId=%s", id, sn, name, classesId));
}
第六步:释放资源(关闭结果集、命令、连接)
try{
//关闭结果集
if(resultSet!=null){
resultSet.close();
}
//关闭命令
if(statement!=null){
statement.close();
}
//关闭连接命令
if(connection!=null){
connection.close();
}
}catch(SQLException E){
throw new RuntimeException("释放数据库资源错误");
}
}
说明:每次操作数据库结束后都要关闭数据库连接,释放资源,以重复利用资源
注意:
通常资源的关闭顺序与打开顺序相反,顺序是ResultSet、Statement(或PreparedStatement)和Connection。
为了保证在异常情况下也能关闭资源,需要在try...catch的finally代码块中统一关闭资源。
4.JDBC的常用接口和类
4.1 JDBC API
在Java JDBC编程中对数据的操作均使用JDK自带的APL统一处理,通常与特定数据库的驱动类是完全解耦的。所以一定要掌握Java JDBC API(位于java.sql包下),即可理解Java数据库编程。
4.2 数据库连接Connection
Connection 接口实现类由数据提供,获取Connection对象通常有两种方式:
第一种:通过DiverMager(驱动管理类)的静态方法获取:
//加载JDBC驱动
class.forName("com.mysql.jdbc.Driver");
//创建数据库
Connection connection=DriverManager.
getConnection("jdbc:mysql://localhost:3306/test,'root','123456'");
第二种:通过DataSource(数据源)对象获取。实际中会使用DataAource对象
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
两种方式的区别:
- DiverMager类获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()来关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接诶是可以复用的,每次使用万数据库连接,释放资源调用connection.close()将Connection连接对象回收。
它的常用方法:
4.3 Statement对象
Statement对象主要是将SQL语句发送到数据库中,它用于执行静态的SQL语句,并返回一个结果对象。
说明:Statement接口对象可以通过Connection实例的createStatement()方法获得,然后返回数据库的处理结果。
Statement常用方法:
JDBC API中主要提供了三种Statement对象:
第一种:statement
用于执行不带sql语句
第二种:PreparedStatement
用于执行带或者不带参数的sql语句;sql局域会预编译在数据库系统;执行速度快于Statement
第三种:CallableStatement
用于执行数据库存储过程的调用
实际开发中最常用的是PreparedStatement对象,
定义:PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。
说明:PreparedStatement接口扩展了带有参数SQL语句的执行操作,应用接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。
PreparedStatement接口的常用方法:
特点:
1.参数化sql查询
2.占位符不能使用多值
3.占位符:?下标从1开始
4.阻止常见SQL注入攻击
5.SQL预编译
6.性能比Statement
主要掌握两种执行SQL的方法:
executeQuery() 方法执行后返回单个结果集的,通常用于select语句
executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
示例:
String sql="insert into student (sn,name,qq_mail,classes_id)" +
" values(?,?,?,?)";
ps=connection.prepareStatement(sql);
ps.setInt(1,10456);
ps.setString(2,"张三");
ps.setString(3,"[email protected]");
ps.setInt(4,2);
ps.executeUpdate();
4.4 ResultSet对象
常用方法:ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且通过一套getXXX方法提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用 ResultSet的next()方法,如果我们想啊哟得到 ResultSet里的所有记录,就应该使用while循环。