学习笔记【JDBC简单基础-第一节:JDBC快速入门】

JDBC概念:Java Database Connectivity Java数据库连接,Java语言操作数据库本质: Java官方(SUN)定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。快速入门:步骤:导入驱动jar包注册驱动获取数据库连接对象 Connection定义sql获取执行sql语句的对象 Statement执行sql,接受返回结果处理结果
摘要由CSDN通过智能技术生成

JDBC

概念:

Java Database Connectivity Java数据库连接,Java语言操作数据库
在这里插入图片描述
本质: Java官方(SUN)定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。


快速入门:

步骤:

  • 导入驱动jar包:mysql-connector-java-5.1.44-bin.jar
    • 复制mysql-connector-java-5.1.44-bin.jar到项目的libs目录下
    • 右键 Add As Library
  • 注册驱动
  • 获取数据库连接对象 Connection
  • 定义sql
  • 获取执行sql语句的对象 Statement
  • 执行sql,接受返回结果
  • 处理结果
  • 释放资源
    如:
public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?useSSL=false", "root", "123456");
        String sql="update account_test01 set balance =500 where id=1";
        Statement statement = conn.createStatement();
        int count = statement.executeUpdate(sql);
        System.out.println(count);
        statement.close();
        conn.close();
    }
}

详解各个对象

DriverManager:驱动管理对象

功能:
1.注册驱动 :告诉程序该使用哪一个数据库驱动jar
注册与给定的驱动程序:

static void registerDriver(Driver driver)  

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

static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }

注意,mysql5之后的驱动jar包可以省略注册驱动的步骤。

2.获取数据库连接:

  • 方法:static Connection getConnection(String url, String user, String password)
  • 参数:后面两个是用户名与密码。url:指定连接的路径:语法:jdbc:mysql://ip地址(域名):端口号/数据库名称。
  • 注意:如果连接的是本机的mysql服务器,并且mysql服务默认端口为3306.则url可缩写为jdbc:mysql:///数据库名称
Connection:数据库连接对象

1.获取执行sql的对象:

  • Statement createStatement()
  • PreparedStatement prepareStatement(String sql)

2.管理事务:

  • 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。
  • 提交事务: void commit()
  • 回滚事务: void rollback()
Statement:执行sql对象
  • boolean execute(String sql):可以执行任意的sql
  • int executeUpdate(String sql):执行DML语句(insert、update、delete)、DDL(create、alter、drop)语句(DDL基本不用,返回为0)。返回的是影响的行数,可通过其判断DML是否执行成功。
  • ResultSet executeQuery(String sql):执行DQL语句(select)。
ResultSet:结果集对象

boolean next(): 游标向下移动一行,判断是否为最后一行末尾(是否有数据),如果有,返回true,无则返回false
getXxx(参数): Xxx为数据类型如getInt() getString()等,参数有两种情况:①int:代表列的编号,从1开始;②String:代表列的名称
例子:

Connection conn=null;
Statement sta=null;
ResultSet resultSet=null;
try {
    Class.forName("com.mysql.jdbc.Driver");
    conn= DriverManager.getConnection("jdbc:mysql:///db_test?useSSL=false","root","123456");
    String sql="SELECT * from account_test01";
    sta=conn.createStatement();
    resultSet = sta.executeQuery(sql);
    //让游标向下移动一行
    while (resultSet.next()){
        int id=resultSet.getInt(1);
        String name = resultSet.getString("name");
        double balance=resultSet.getDouble(3);
        System.out.println(id+"---"+name+"---"+balance);
    }
} catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}finally {
    if (resultSet!=null){
        try {
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (sta!=null){
        try {
            sta.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (conn!=null){
        try {
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
    }
PreparedStatement:执行sql的对象
  • sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。造成安全问题
  • 解决sql注入问题:使用PreparedStatement对象来解决
  • 预编译的sql:参数使用?作为占位符
  • 步骤(和Statement的区别)
    1.sql的参数使用?作为占位符,如SELECT * FROM user WHERE username='?' AND password='?'
    2.获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
    3.给?赋值:SetXxx(参数1,参数2):参数1为?的位置编号,从1开始;参数2是?的值
    4.执行sql,接受返回结果,不用再传递sql了
  • 后期都会使用PreparedStatement来完成增删改查的所有操作
    1.可以防止SQL注入
    2.效率更高

抽取JDBC工具类:JDBCUtils

目的:简化书写

1.抽取注册驱动

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

  • 需求:不想穿参数,还得保证工具类的通用性。
  • 解决:配置文件

3.抽取释放资源的方法

如:

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
	//使用静态代码块的方式,有配置文件
    static {
        try {
            Properties pro=new Properties();
            ClassLoader classLoader=JDBCUtils.class.getClassLoader();
            String s=classLoader.getResource("jdbc.properties").getPath();
            pro.load(new FileReader(s));
            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    //释放资源
    public static void close(Statement statement,Connection connection){
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    public static void close(ResultSet resultSet,Statement statement, Connection connection){
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

JDBC控制事务:

使用Connection对象来管理事务

  • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
  • 提交事务:commit()
  • 回滚事务:rollback()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值