day04 --> (JDBC基本概念、快速入门、对JDBC中各个接口和类详解)

一、JDBC:

1、概念:Java DataBase Connectivity  --> Java数据库连接,Java语言操作数据库

本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

Person 接口 ,Worker 类        Person person = new Worker(); --> 父类引用指向子类对象,如果Person中有一个ear方法,则 person.eat() 会调用Worker里边真正的实现类的方法

 2、快速入门:

步骤:

1.导入驱动jar包 :mysql-connector-java-5.1.37-bin.jar

(1)复制 mysql-connector-java-5.1.37-bin.jar 到项目的libs目录下

(2)右键 --> Add As Library 【真正加入jar包到项目中】

2.注册驱动

3.获取数据库的连接对象 Connection

4.定义sql语句

5.获取执行sql语句的对象 Statement

6.执行sql,接收返回结果

7.处理结果

8.释放资源

 代码实现:

复制代码
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 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
        //4.定义sql
        String sql = "update account set balance = 500 where id = 1";
        //5、获取执行sql的对象
        Statement stmt = conn.createStatement();
        //6、执行sql
         int count = stmt.executeUpdate(sql);
        //7、处理结果
        System.out.println(count);
        //8、释放资源
        stmt.close();
        conn.close();
    }
}
复制代码

 

 3、详解各个对象:

1.DriverManager : 驱动管理对象

功能:

1.注册驱动 【告诉程序该使用哪个数据库驱动jar包】

  注册与给定的驱动程序:

写代码使用:Class.forName("com.mysql.jdbc.Driver");

com --> mysql --> jdbc --> Driver.java

 通过查看源码可以发现:在com.mysql.jdbc.Driver类中存在静态代码块

小细节:mysql-connection-java 5 版本之后的驱动jar包中可以不写注册驱动【META-INF --> services --> java.sql.Driver已注册驱动】

2.获取数据库连接

参数:

url:指定连接的路径(IP、端口、数据库的名称)

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称

例子:jdbc:mysql://localhost:3306/db3

细节:如果连接的是本机的一个mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称

2.Connection : 数据库连接对象

1.功能:

1.获取执行sql对象

Statement creatStatement()

PreparedStatement preparestatement(String sql)

2.管理事务:

开启事务:

 调用该方法设置参数为false,即开启事务

提交事务:

回滚事务:

3.Statement : 执行sql的对象

1.执行sql

1、【了解】:boolean execute(String sql) : 可以执行任意的sql

2、int executeUpdate(String sql) : 执行DML(insert、update、delete),DDL(对表和库进行操作,不常用,库和表多已提前建好)

返回值:影响的行数;作用:我们可以通过影响的行数来判断DML语句是否执行成功【大于0成功,反之失败】

3、

执行DQL(select)语句,返回的是ResulSet结果集对象

2.练习:

1、account表 添加一条记录

2、account表 修改一条记录

3、account表 删除一条记录

4.ResultSet : 结果集对象

游标:相当于Java中数组的索引,默认指向表中第一行的第一列

boolean next() : 游标向下移动一行,判断当前行是否是最后一行的末尾(是否有数据),如果是返回false,反之返回true。

getXxx(参数) : 获取数据【可用于后期封装数据】

Xxx : 代表数据类型,如:int getInt(), String getString

参数:

1.int : 代表列的编号,从1开始, 如:getString(1),获取第一列的数据

2.String:代表列的名称,如 : getDouble("balance")

注意:

1.游标向下移动一行

2.判断是否有数据

3.获取数据

*练习:查询emp表的数据将其封装为 对象,然后装载集合,返回。

分析:

1.定义Emp类

2.定义一个方法 : public List<Emp> findAll(){ }

3.实现方法:select * from emp;

抽取JDBC工具类:JDBCUtils

目的:简化书写

分析:

1、注册驱动

2、抽取一个方法获取去连接对象

不想传递参数(麻烦),还得保证工具类的通用性

解决方法:配置文件

jdbc.properties

url = 

user = 

password = 

3、抽取一个方法释放资源

代码实现:

复制代码
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

//JDBC 工具类
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    //配置文件只需要读取一次,写在静态代码块中,随着类的加载而加载,只会执行一次
    static {
        try {
            //1、创建Properti对象
            Properties pro = new Properties();

            //2、加载文件
            //pro.load(new FileReader("src/jdbc.properties")); //FileNotFoundException
            //pro.load(new FileReader("src/jdbc.properties")); //绝对路径
            //获取src路径下的文件的方式 --> ClassLoader(类加载器,可以加载字节码进内存,还可以获取src下的资源文件路径)
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties"); //统一资源定位符(定位文件绝对路径)
            String path =resource.getPath();
            pro.load(new FileReader(path));
            System.out.println(path); //打印的就是该文件的绝对路径

            //3、获取文件中的值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            //4、注册驱动
            try {
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接对象
     * @return
     */
    public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,user,password);
    }

    public static void close(Statement stmt,Connection conn){
        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn){

        if (rs != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}
复制代码

 

练习:

需求:通过键盘录入用户名和密码,判断用户是否登录成功

实现步骤:

1、创建数据库表

sql准备:

复制代码
CREATE TABLE USER(
        id INT PRIMARY KEY auto_increment,
        username varchar(32),
        password varchar(32)
);

SELECT * from USER;

INSERT INTO USER VALUES(null,'zhangsan','123'),(null,'lisi','234');
复制代码

5.PrepareStatement : 执行sql的对象

1.SQL注入问题:在拼接sql的时候,有一些sql的特殊关键字与字符串的拼接,会造成安全性问题

1.例如:用户名随便输入,输入密码:a ' or 'a' = 'a

2.sql : select * from user where username = '输入的用户名' and password = 'a' or 'a' = 'a'   -->后边恒为真

2.解决sql注入问题:使用preparedStatement对象来解决

3.预编译的SQL : 参数使用 ? 作为占位符

4.步骤:

1.导入驱动jar包 :mysql-connector-java-5.1.37-bin.jar

2.注册驱动

3.获取数据库的连接对象 Connection

4.定义sql语句

注意:sql的参数使用 ? 作为占位符,例如:select * from user where username = ? and password = ?

5.获取执行sql语句的对象 PreparedStatement

Connection.prepareStatement(String sql)

给 ?赋值:

方法:setXxx(参数1,参数2)

参数1 : ?的位置,从1开始

参数2 :?的值

6.执行sql,接收返回结果,不需要传递sql语句了(上一步传递过了)

7.处理结果

8.释放资源

 5.注意:后期都会使用PreparedStatement来完成增删改查的所有操作,原因:

1.可以防止SQL注入

2.效率更高

JDBC控制事务:

1.事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失效

2.操作:

1.开启事务

2.提交事务

3.回滚事务

3.使用Connection对象管理事务:

开启事务:setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务

在执行sql之前开启

提交事务:commit()

所有操作正常执行之后

回滚事务:rollback

catch中

posted @   羽梦齐飞  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示