黑马就业班(01.JavaSE Java语言基础\13.JDBC)——part1:JDBC基础

今日内容

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:密码 

导入的jar包的结构

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值