今日内容
1. JDBC基本概念
2. 快速入门
3. 对JDBC中各个接口和类详解
1、JDBC基本介绍
概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库(我们之前使用SQL操作数据库,而这里我们使用java操作数据库。既使用java代码对数据块进行增删改查等操作)
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包(包含这个版本数据库的JDBC接口的实现类)。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
如我们之前定义一个Person接口(类比此处的JDBC接口),然后创建实现类Worker(类比这里的各个数据库厂商根据JDBC接口创建的实现类(将这些实现类封装为jar包,相当于数据库驱动)),我们只需要“Person p = new Worker()”创建实现类的对象,调用“p.eat()”,就可以调用实现类Worker复写Person接口的eat方法(类比我们创建各个数据库厂商提供的实现类的对象(从jar包获取),这样我们就可以调用这些实现类的方法,来操作数据库)
事实上我们的程序对jar包中实现类的使用在底层实现,我们只需要在java文件中导入jar包,按固定的流程去使用,既可以通过java操作数据库。注意流程
注意理解好JDBC运行的流程!!!
快速入门
- 注意,我们创建项目的时候,IDEA的当前界面只会显示一个项目,多个项目必须开启多个IDEA界面才能显示。然后我们导入的一般不是项目,而是某一个module。比如我们在导入教程代码的时候,也是导入一个module(比如我们这里演示的时候导入module“day04_jdbc”。当然我们如果直接在新建的项目下导入“itcast”项目,也会只导入module“day04_jdbc”)。
步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library (这一步将libs设置为项目级别的library类库,并添加到我们当前所使用的模块中。这样我们的模块才能使用libs文件夹中的jar包,才是真正的将jar包添加到我们的项目中)
2. 注册驱动 (使程序知道我们使用的是哪一个版本的jar包)
3. 获取数据库连接对象 Connection
4. 定义sql (定义SQL语句后,我们将来通过一定的方式将SQL语句发送给数据库,数据库就会帮我们执行这些SQL语句,从而达到java代码操作数据库的目的)
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
----------------------------------------
代码实现:
package lkj.demo.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* JDBC快速入门
* 这一部分快速入门,先这样写,先不需要理解,后面再补充即可
*/
public class JdbcDemo1
{
public static void main(String[] args) throws Exception
{
//1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");//这里使用数据库db1
//Connection con = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");//本机且数据库的端口是3306,那么可以省略一部分路径名
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";//注意SQL语句后不要加分号
//5.获取执行sql的对象 Statement
Statement sm = con.createStatement();
//6.执行sql
int count = sm.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
sm.close();//关闭SQL执行对象
con.close();//关闭SQL的连接数据库对象
/*
结果:打印数据1,并且db1数据库的account表的数据发生变化
*/
}
}
2、详解JDBC的各个对象
需要说明的是,我们所导入的JDBC对象都是接口或类,但是真正执行的是我们导入的jar包中的实现类。我们编程中没有使用到导入的jar包的任何类(没有创建这些类的对象),但是我们编写的代码底层会使用jar包里面类的相关数据。
2.1 DriverManager:驱动管理对象
功能:
1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包
DriverManager使用的注册驱动的方法:static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
写代码使用: Class.forName("com.mysql.jdbc.Driver"); //这个方法是将"com.mysql.jdbc.Driver"类的字节码文件加载进入内存。一当Driver类被加载进内存,其里面的静态代码块也会执行。
/*
为什么可以找到"com.mysql.jdbc.Driver"这个类?
因为我们导入了jar包,且jar包加入项目的类库,那么Class的forName方法就可以找到jar包,而jar包的com\\mysql\\jdbc文件夹下有一个Driver.class的文件。
那么Class类的forName()方法就可以获取这个Driver.class文件的Class对象,从而将这个Driver类加载进内存,执行里面的静态代码块,也就注册了这个jar包的驱动
*/
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
源码位置:D:\资源\黑马就业班\00.讲义+笔记+资料\JavaWeb\13.会员版(2.0)-就业课(2.0)-JDBC\day25_JDBC\03_参考\mysql-connector-java-5.1.37\src\com\mysql\jdbc 的Driver.java文件。
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// 我们使用反射创建"com.mysql.jdbc.Driver"类的字节码文件Class对象,同时这个字节码文件对应的Driver类的代码也会加载进内存,这样静态代码块里面的代码也会执行,通过DriverManager的registerDriver方法注册驱动。
//registerDriver方法的参数driver - 将向 DriverManager 注册的新的 JDBC Driver
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。(jar包的META-INF文件的services文件夹里面有一个java.sql.Driver文件,它里面有“com.mysql.jdbc.Driver”文件,这样系统就会自动帮我们注册驱动。如果我们没有注册驱动,jar包会先读取java.sql.Driver文件并自动注册驱动)建议手动注册jar包的驱动。
------------------------------------------------------------------------
2. 获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password)
* 参数:
* url:指定连接的路径
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
* 例子:jdbc:mysql://localhost:3306/db3
* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称 (注意这里有三个斜杆)
* user:用户名
* password:密码
2.2 Connection:数据库连接对象
功能:
1. 获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
2.3 Statement:执行sql的对象
功能:用于执行静态SQL语句(静态SQL就是SQL语句里面的参数的值都是给定不变的)并返回其生成的结果的对象。
执行sql
1. boolean execute(String sql) :可以执行任意的sql
2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句(DDL语句用的比较少,我们一般都使用SQL语句执行DDL)
官方定义:executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
3. ResultSet executeQuery(String sql) :执行DQL(select)语句
练习:
1. account表 添加一条记录
2. account表 修改记录
3. account表 删除一条记录
需求1相应的代码如下:
package lkj.demo.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* account表 添加一条记录 insert 语句
*/
public class JdbcDemo1
{
public static void main(String[] args)
{
//1、导入jar包
//我们在try-catch语句中处理异常。模仿“字节流”的操作,先在外面定义Connection与Statement对象,再在finally对其进行关闭
//将2个对象的引用定义在外面,这样在finally中才能找到他们,否则定义在try中,finally找不到这两个对象
Connection con = null;
Statement sm = null;
try
{
//2、注册驱动(DriverManager对象的registerDriver()方法)
Class.forName("com.mysql.jdbc.Driver");
//3、获取数据库连接对象(DriverManager对象的getConnection()方法)
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
//4、创建SQL语句(插入数据)
String sql = "insert into account values(null , 'wangwu' , '888')";//account表的id字段是主键且会自增,不需要赋值(null)
//5、获取数据库执行对象(Connection的createStatement方法)
sm = con.createStatement();
//6、执行sql,获取结果并判断
int result = sm.executeUpdate(sql);
System.out.println(result);
if(result>0)
{
System.out.println("添加成功!");
}
else
{
System.out.println("添加失败!");
}
}
catch(ClassNotFoundException e1)
{
e1.printStackTrace();
}
catch(SQLException e2)
{
e2.printStackTrace();
}
finally
{
//7. 释放资源
//避免空指针异常——比如数据库连接出错,statement没有被赋值为null,这样就没有必要关闭。因此这里需要判断它是否为null
//先关闭执行再关闭连接
if(sm != null)
{
try
{
sm.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if(con != null)
{
try
{
con.close();
}
catch (SQLException e)
{
e