一、JDBC概述:
1、Java DataBase Connectivity(java数据库连接)
2、组成包:java.sql.*;javax.sql.*;这两个包都包含在了JDK中。
3、还需要数据库的驱动,这些驱动就相当于对JDBC规范的实现(驱动由数据库厂商提供)
JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:
java.sql
javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
二、JDBC的编码步骤:
1、把数据库的驱动加入到classpath中
2、开发步骤:
* 开发步骤:(必须记住的)
* 1、注册驱动
* 2、获取与数据库的链接
* 3、得到代表SQL语句的对象
* 4、执行语句
* 5、如果执行的是查询语句,就会有结果集,处理
* 6、释放占用的资源
3、具体代码
package com.heima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//演示第一个JDBC案例
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver") ;
//2. 创建一个连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root") ;
//3. 创建一个sql语句的发送命令对象
Statement stmt = conn.createStatement() ;
//4. 执行SQL,拿到查询的结构集对象
ResultSet rs = stmt.executeQuery("select * from stu") ;
//执行结果有两种:
//增删改 :不用返回任何数据
//查:返回一个虚拟的结果集
//5. 输出结果集的数据
while(rs.next()){
System.out.println(rs.getInt("id") + ":" + rs.getString("name") + ":" + rs.getString("address"));
}
//6. 关闭连接,命令对象,结果集
rs.close() ;
stmt.close();
conn.close() ;
}
}
1.注册驱动
三种方式:
第一种:
Driver driver = new Driver() ;
DriverManager.registerDriver(driver) ;
Driver d = (Driver)Class.forName("com.mysql.jdbc.Driver").newInstance() ;
DriverManager.registerDriver(d) ;
第三种:
Class.forName("com.mysql.jdbc.Driver") ; //自动进行注册
2.获取连接对象
三种方式:connection:让应用程序连接到数据库的一个连接对象。
第一种:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?user=root&password=root") ;
第二种方式:
读取properties文件:
新建一个properties文件:放在src下
里面写连接信息:
//第二种方式
//读取properties文件
Properties pro = new Properties() ;
InputStream in = JdbcDemo3.class.getClassLoader().getResourceAsStream("dbcfg.properties") ;
pro.load(in) ;
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", pro) ;
第三种方式:
String driverClass = "" ;
String url = "" ;
String user = "" ;
String password = "" ;
Properties pro = new Properties() ;
InputStream in = JdbcDemo3.class.getClassLoader().getResourceAsStream("dbcfg.properties") ;
pro.load(in) ;
driverClass = pro.getProperty("driverClass") ;
url = pro.getProperty("url") ;
user = pro.getProperty("user") ;
password = pro.getProperty("password") ;
//1. 注册驱动
Class.forName(driverClass) ;<pre name="code" class="html" style="color: rgb(63, 95, 191);"> Connection conn = DriverManager.getConnection(url,user,password) ;
statement接口:
接口resultset:
JDBC的增删改:
//添加:
String sql = "insert into stu(id,name,sex,age,address) values(12,'东方不败','男',20,'黒木崖')" ;
//修改:
String sql = "update stu set sex ='女' where id = 12" ;
//删除:
String sql = "delete from stu where id = 12" ;//根据主键来删
int n = stmt.executeUpdate(sql) ; //n:插入的记录数
System.out.println(n);
//5. 关闭连接,命令对象,结果集
stmt.close();
conn.close() ;
拿取结果集数据的方式:
ResultSet rs = stmt.executeQuery("select id 编号,name 姓名 from stu") ;
//第一种:根据字段名拿取 (推荐)
// int id = rs.getInt("编号") ; //是结果集的字段名
// String name = rs.getString("姓名") ;
第二种:
//第二种: 根据字段的索引(索引从1开始)
int id = rs.getInt(1) ;
String name = rs.getString(2) ;
DriverManger类详解
1.1作用:a、注册驱动b、获取与数据库的链接
1.2改进注册驱动:(不能依赖具体的数据库驱动)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
缺点:严重依赖具体的驱动类;会导致驱动被注册2次。
替代方案:Class.forName("com.mysql.jdbc.Driver");
数据库URL
jdbc:mysql:[]//localhost:3306/test ?参数名=参数值
Connection
所有的与数据库的交互都是基于链接的基础之上的,因此该对象相当重要。
Statement stmt =conn.createStatement():创建向数据库发送sql的statement对象
作用:代表SQL语句;向数据库发送并执行SQL语句
常用方法:
ResultSet executeQuery(String sql):只适合查询,返回的是查询的结果集
int executeUpdate(String sql):适合DML,或者没有返回结果集的DDL,返回的是影响的4、ResultSet详解
作用:代表者查询语句的查询结果集
4.1遍历过程:有一个游标,如何遍历结果集,请看图
//5. 结果集的移动:
rs.first() ; //移动到第一条
rs.last() ; //移动到最后一条
rs.absolute(5) ; //移动到第五条 移动到具体的某一条
rs.previous() ; //移动到第4条
//rs.afterLast() ; //移动到最后一条记录的后边 使其拿不到数据
System.out.println(rs.getInt("id") + ":" + rs.getString("name") + ":" + rs.getString("address"));
特点和作用
a、指示SQL语句的预编译。提高数据库的执行效率
b、防止SQL注入。给数据库的已经不是字符串了
c、语句中的参数可以使用占位符(?)
pstmt = conn.prepareStatement("select * from users where username=? and password = ?") ;
//指定?的值
pstmt.setString(1, username) ; //数字表示第几个问号
pstmt.setString(2, password) ;
rs = pstmt.executeQuery();
如何获取列的数据
遍历结果集应该封装到JavaBean中
5、释放占用的资源
按照打开的顺序,以相反的方向进行释放。
Connection要尽量晚的创建和尽量早的释放。
为了保障资源能被释放,应该放到finally代码块中
四、JDBC的编码规范和工具类的提取
1、编写配置文件:
2、抽取了工具类
3、以后代码的编写