JDBC(基本概念、各个类(Stream、PreparedStream、Connection、ResultSet)的详解)

一、基本概念

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

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

3.简要的快速入门

步骤:

1.导入驱动jar包

    1.复制jar包到libs文件夹中去

    2.右键-->Add As Library

2. 注册驱动

3.获取数据库连接Connection

4.定义sql语句

5.获取执行sql的对象Statement/PreparedStatement

6.对数据集进行操作(处理结果)ResultSet

7.释放资源

快速入门的代码实现

2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
3.获取数据库连接Connection
 Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/ds3?useSSL=false&serverTimezone=UTC","root","simeon");
4.定义sql语句
 String sql = "update account set balance = 4000";
5.获取执行sql的对象Statement/PreparedStatement
  Statement statement=conn.createStatement();
6.对数据集进行操作(处理结果)ResultSet
 resultSet = statement.executeQuery(sql);
7.释放资源
resuleSet.close();
statment.close;
conn.close();

二、各个类的详解

1. DriverManager:驱动管理对象

1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册并给定驱动程序 DriverManager 。
但我们写代码时常常使用Class.forName("com.mysql.cj.jdbc.Driver"); 
这样写的原因是因为源码中存在这样的一个方法
 static {
   try {   java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
     throw new RuntimeException("Can't register driver!");
         }
            }
2. 获取数据库连接:
方法:static Connection getConnection(String url, String user, String password) 
url:jdbc:mysql//ip地址(域名):3306/db3
若服务器和客户机在一台电脑上可以简写为:
jdbc:mysql///db3
如:jdbc:mysql//localhost:3306/db3 或jdbc:mysql///db3
user:用户名
password:密码

  2. Connection:数据库连接对象

获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ds3?useSSL=false&serverTimezone=UTC", "root", "simeon");
获取执行sql对象的方法
Statement中的createStatement()
管理事务
1.开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
2.提交事务:commit() 
3.回滚事务:rollback() 

3. Statement:执行sql的对象

1. boolean execute(String sql) :可以执行任意的sql 了解 
2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
3. ResultSet executeQuery(String sql)  :执行DQL(select)语句

 4. ResultSet:结果集对象,封装查询结果

boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
getXxx(参数):获取数据
Xxx:代表数据类型   如: int getInt() ,	String getString() 
参数:
    1. int:代表列的编号,从1开始   如: getString(1)
    2. String:代表列名称。 如: getDouble("balance")

5. PreparedStatement:执行sql的对象

1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
如:输入用户随便,输入密码:a' or 'a' = 'a
   sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
   解决sql注入问题:使用PreparedStatement对象来解决
   预编译的SQL:参数使用?作为占位符
   注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
   获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
  给?赋值:
   方法: setXxx(参数1,参数2)
   参数1:?的位置编号 从1 开始   
   参数2:?的值
   执行sql,接受返回结果,不需要传递sql语句
   处理结果
   释放资源

6.定义JDBC工具类来简化步骤

/*
* 注册驱动方法getDriver
*/

  public void getDriver(){
      try {
          Class.forName("com.mysql.cj.jdbc.Driver");
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }

  }

/*
  * 获取连接方法getConnection
  * 
*/

static{
try {
    Properties properties = new Properties();
    //获取src路径下的文件的方式--->ClassLoader 类加载器
    ClassLoader classLoader = JDBCTool.class.getClassLoader();
    URL res = classLoader.getResource("jdbc.properties");
    String path = res.getPath();
    properties.load(new FileReader(path));
    //3. 获取数据,赋值
    url = properties.getProperty("url");
    user = properties.getProperty("user");
    password = properties.getProperty("password");
    driver = properties.getProperty("driver");
    Class.forName(driver);
}catch(Exception e){
    e.printStackTrace();
}

}
    public Connection getConnection() throws SQLException {
       return DriverManager.getConnection(url,user,password);
    }

   /*
    * 释放资源getClose方法
    */
    public void getClose(Connection conn, Statement statement, ResultSet resultSet){
        if (resultSet!=null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(statement!=null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

三、程序

/*
* 1. 通过键盘录入用户名和密码
* 2. 判断用户是否登录成功
*/
package my;

import we.JDBCTool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

/*
* 1. 通过键盘录入用户名和密码
* 2. 判断用户是否登录成功
 */

public class JDBCDemo5 {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名");
        String username=sc.nextLine();
        System.out.println("请输入密码");
        String password=sc.nextLine();
        boolean flag=new JDBCDemo5().login(username,password);
        if(flag)
            System.out.println("登陆成功");
        else
            System.out.println("用户名或密码错误");
    }
    public boolean login(String username,String password) {
        if(username==null||password==null)
            return false;
        JDBCTool tool = new JDBCTool();
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            tool.getDriver();
            conn = tool.getConnection();
            String sql = "select * from stu8 where username=? and password=?";
            preparedStatement = conn.prepareStatement(sql);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            resultSet = preparedStatement.executeQuery();
       if(resultSet.next()){
           return true;
       }else
           return false;


        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            tool.getClose(conn,preparedStatement,resultSet);
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/dreame_life/article/details/87873317
今日推荐