• 19JDBC初体验


    一、JDBC常用类和接口

    JDBCJava DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java APIJDBCJava访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

     

    JDBC与数据库驱动的关系:接口与实现类的关系。

     

    二、JDBC常用类和接口

    JDBC有关的类:都在java.sql javax.sql 包下.

    接口在Java中是用来定义 `行为规范的`.   接口必须有实现类.

     

    JDBC规范(四个核心对象):

    DriverManager:用于注册驱动

    Connection: 表示与数据库创建的连接

    Statement: 操作数据库sql语句的对象

    ResultSet: 结果集或一张虚拟表

     
    特别注意:
    Mysql驱动8版本之后的driverClass 和url 的写法
    com.mysql.cj.jdbc.Driver
     
    jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8
    	// JDBC 初体验
        @Test
    	public void demo01() throws SQLException {
    		// 1. 装载驱动
    		DriverManager.registerDriver(new Driver());
    		// 2. 建立连接
    		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
    		// 3. 操作数据
    		String sql = "select * from user;";
    		Statement stmt = conn.createStatement();
    		ResultSet rs = stmt.executeQuery(sql);
    		while (rs.next()) {
    			int id = rs.getInt("id");
    			String username = rs.getString("username");
    			String password = rs.getString("password");
    			String email = rs.getString("email");
    			System.out.println(id + " : " + username + " : " + password + " : " + email);
    		}
    		// 4. 释放资源
    		rs.close();
    		stmt.close();
    		conn.close();
    	}
    
     
     
     
     
     
     
     
     
     
    1
    // JDBC 初体验
    2
        @Test
    3
    public void demo01() throws SQLException {
    4
    // 1. 装载驱动
    5
    DriverManager.registerDriver(new Driver());
    6
    // 2. 建立连接
    7
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "111");
    8
    // 3. 操作数据
    9
    String sql = "select * from user;";
    10
    Statement stmt = conn.createStatement();
    11
    ResultSet rs = stmt.executeQuery(sql);
    12
    while (rs.next()) {
    13
    int id = rs.getInt("id");
    14
    String username = rs.getString("username");
    15
    String password = rs.getString("password");
    16
    String email = rs.getString("email");
    17
    System.out.println(id + " : " + username + " : " + password + " : " + email);
    18
    }
    19
    // 4. 释放资源
    20
    rs.close();
    21
    stmt.close();
    22
    conn.close();
    23
    }
    24
    
    
     
     
     
    JDBC工具类的提取()
     
    方式一、
    --src下放连接数据库的配置文件
        |--properties
     // 配置文件的名字     jdbc.properties
    
    #mysql
    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
    user=root
    password=111
    
     
     
     
    1
     
     
     
     
     
    1
     // 配置文件的名字     jdbc.properties
    2
    
    
    3
    #mysql
    4
    driverClass=com.mysql.jdbc.Driver
    5
    url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8
    6
    user=root
    7
    password=111
    8
    
    
     
     
    --util包
        |--JDBCUtils 类   
        |
    public class JDBCUtils {
    	
    	// 属性
    	private static String driverClass;
    	private static String url;
    	private static String username;
    	private static String password;
    	
    	//  什么时候加载外部配置文件最合适 ???   
    	// 特点1 : 随着类的加载而加载.
    	// 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
    	static {
    		Properties prop = new Properties();
    		
    		try {
    			prop.load(new FileReader("jdbc.properties"));
    			
    			// 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
    			driverClass = prop.getProperty("driverClass");
    			url = prop.getProperty("url");
    			username = prop.getProperty("username");
    			password = prop.getProperty("password");
    			
    			// 直接执行加载驱动
    			loadDriver();
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    			throw new RuntimeException("文件资源加载失败!");
    		}
    	}
    	
    	// 加载驱动
    	public static void loadDriver() {
    		try {
    			// 1. 加载驱动
    			Class.forName(driverClass);
    		} catch (ClassNotFoundException e) {
    			// e.printStackTrace();
    			// 驱动加载失败!
    			throw new RuntimeException("驱动加载失败!");
    		}
    	}
    	
    	// 建立连接
    	public static Connection getConnection() throws SQLException {
    		// 2. 建立连接
    		return DriverManager.getConnection(url, username, password);
    	}
    	
    	// 释放资源
    	public static void release(Connection conn, Statement stmt, ResultSet rs) {
    		// 4. 释放资源
    		if (rs != null) {
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			// 将 rs 清空
    			rs = null;
    		}
    		// 直接调用
    		release(conn, stmt);
    	}
    	public static void release(Connection conn, Statement stmt) {
    		// 4. 释放资源
    		if (stmt != null) {
    			try {
    				stmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			stmt = null;
    		}
    		if (conn != null) {
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			conn = null;
    		}
    	}
    }
    
     
     
     
     
     
     
     
     
     
    1
    public class JDBCUtils {
    2
    
    
    3
    // 属性
    4
    private static String driverClass;
    5
    private static String url;
    6
    private static String username;
    7
    private static String password;
    8
    
    
    9
    //  什么时候加载外部配置文件最合适 ???   
    10
    // 特点1 : 随着类的加载而加载.
    11
    // 特点2 : 静态代码块只在类加载的被执行一次. 仅一次.
    12
    static {
    13
    Properties prop = new Properties();
    14
    
    
    15
    try {
    16
    prop.load(new FileReader("jdbc.properties"));
    17
    
    
    18
    // 如果程序执行到这里, 说明外部资源文件加载成功, 需要给我们的静态属性赋值
    19
    driverClass = prop.getProperty("driverClass");
    20
    url = prop.getProperty("url");
    21
    username = prop.getProperty("username");
    22
    password = prop.getProperty("password");
    23
    
    
    24
    // 直接执行加载驱动
    25
    loadDriver();
    26
    
    
    27
    } catch (IOException e) {
    28
    e.printStackTrace();
    29
    throw new RuntimeException("文件资源加载失败!");
    30
    }
    31
    }
    32
    
    
    33
    // 加载驱动
    34
    public static void loadDriver() {
    35
    try {
    36
    // 1. 加载驱动
    37
    Class.forName(driverClass);
    38
    } catch (ClassNotFoundException e) {
    39
    // e.printStackTrace();
    40
    // 驱动加载失败!
    41
    throw new RuntimeException("驱动加载失败!");
    42
    }
    43
    }
    44
    
    
    45
    // 建立连接
    46
    public static Connection getConnection() throws SQLException {
    47
    // 2. 建立连接
    48
    return DriverManager.getConnection(url, username, password);
    49
    }
    50
    
    
    51
    // 释放资源
    52
    public static void release(Connection conn, Statement stmt, ResultSet rs) {
    53
    // 4. 释放资源
    54
    if (rs != null) {
    55
    try {
    56
    rs.close();
    57
    } catch (SQLException e) {
    58
    e.printStackTrace();
    59
    }
    60
    // 将 rs 清空
    61
    rs = null;
    62
    }
    63
    // 直接调用
    64
    release(conn, stmt);
    65
    }
    66
    public static void release(Connection conn, Statement stmt) {
    67
    // 4. 释放资源
    68
    if (stmt != null) {
    69
    try {
    70
    stmt.close();
    71
    } catch (SQLException e) {
    72
    e.printStackTrace();
    73
    }
    74
    stmt = null;
    75
    }
    76
    if (conn != null) {
    77
    try {
    78
    conn.close();
    79
    } catch (SQLException e) {
    80
    e.printStackTrace();
    81
    }
    82
    conn = null;
    83
    }
    84
    }
    85
    }
    86
    
    
     
     
    	@Test
    	public void test_update() {
    		Connection conn = null;
    		Statement stmt = null;
    		try {
    			// 2. 建立连接
    			conn = JDBCUtils.getConnection();
    			// 3. 操作数据
    			String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
    			stmt = conn.createStatement();
    			int affectedRowNum = stmt.executeUpdate(sql);
    			System.out.println(affectedRowNum);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 4. 释放资源
    			JDBCUtils.release(conn, stmt);
    		}
    	}
    	
    	@Test
    	public void test_delete() {
    		Connection conn = null;
    		Statement stmt = null;
    		
    		try {
    			// 1. 建立连接
    			conn = JDBCUtils.getConnection();
    			// 2. 操作数据
    			String sql = "delete from user where id = 5;";
    			stmt = conn.createStatement();
    			int affectedRowNum = stmt.executeUpdate(sql);
    			System.out.println(affectedRowNum);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 4. 释放资源
    			JDBCUtils.release(conn, stmt);
    		}
    	}
    	
    	@Test
    	public void test_insert() {
    		
    		Connection conn = null;
    		Statement stmt = null;
    		try {
    			// 1. 建立连接
    			conn = JDBCUtils.getConnection();
    			// 2. 操作数据
    			String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
    			stmt = conn.createStatement();
    			int affectedRowNumber = stmt.executeUpdate(sql);
    			System.out.println(affectedRowNumber);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 4. 释放资源
    			JDBCUtils.release(conn, stmt);
    		}
    	}
    
    
    // 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
    // 解决SQL注入:使用PreparedStatement 取代 Statement 
    // PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
    // select * from user where username = ? and password = ? ;
    // 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
    // PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 
    
    
    
    		/************ JDBC 数据库连接操作 ***************/
    		Connection conn = null;
    		PreparedStatement stmt = null;
    		ResultSet rs = null;
    		
    		try {
    			// 1. 建立连接
    			conn = JDBCUtils.getConnection();
    			// 2. 操作数据
    			String sql = "select * from user where username = ? and password = ?;";
    			stmt = conn.prepareStatement(sql);
    			// 设置sql语句的参数
    			stmt.setString(1, username);
    			stmt.setString(2, password);
    			// 执行sql语句
    			rs = stmt.executeQuery();
    			// 判断返回的结果
    			if (rs.next()) {
    				// 登录成功
    				int id = rs.getInt("id");
    				String u_name = rs.getString("username");
    				String u_pwd = rs.getString("password");
    				String email = rs.getString("email");
    				System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
    				System.out.println("登录成功!");
    			} else {
    				// 登录失败
    				System.out.println("登录失败! 用户名或密码错误!");
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 3. 释放资源
    			JDBCUtils.release(conn, stmt, rs);
    		}
    	}
    }
    
     
     
     
    x
    110
     
     
     
     
     
    1
    @Test
    2
    public void test_update() {
    3
    Connection conn = null;
    4
    Statement stmt = null;
    5
    try {
    6
    // 2. 建立连接
    7
    conn = JDBCUtils.getConnection();
    8
    // 3. 操作数据
    9
    String sql = "update user set username = 'zhaoliu', password = '123', email = 'zhaoliu@youjian.cn' where id = 4;";
    10
    stmt = conn.createStatement();
    11
    int affectedRowNum = stmt.executeUpdate(sql);
    12
    System.out.println(affectedRowNum);
    13
    } catch (SQLException e) {
    14
    e.printStackTrace();
    15
    } finally {
    16
    // 4. 释放资源
    17
    JDBCUtils.release(conn, stmt);
    18
    }
    19
    }
    20
    
    
    21
    @Test
    22
    public void test_delete() {
    23
    Connection conn = null;
    24
    Statement stmt = null;
    25
    
    
    26
    try {
    27
    // 1. 建立连接
    28
    conn = JDBCUtils.getConnection();
    29
    // 2. 操作数据
    30
    String sql = "delete from user where id = 5;";
    31
    stmt = conn.createStatement();
    32
    int affectedRowNum = stmt.executeUpdate(sql);
    33
    System.out.println(affectedRowNum);
    34
    } catch (SQLException e) {
    35
    e.printStackTrace();
    36
    } finally {
    37
    // 4. 释放资源
    38
    JDBCUtils.release(conn, stmt);
    39
    }
    40
    }
    41
    
    
    42
    @Test
    43
    public void test_insert() {
    44
    
    
    45
    Connection conn = null;
    46
    Statement stmt = null;
    47
    try {
    48
    // 1. 建立连接
    49
    conn = JDBCUtils.getConnection();
    50
    // 2. 操作数据
    51
    String sql = "insert into user values(null, 'xiaoqi', '123', 'xiaoqi@youjian.cn');";
    52
    stmt = conn.createStatement();
    53
    int affectedRowNumber = stmt.executeUpdate(sql);
    54
    System.out.println(affectedRowNumber);
    55
    } catch (SQLException e) {
    56
    e.printStackTrace();
    57
    } finally {
    58
    // 4. 释放资源
    59
    JDBCUtils.release(conn, stmt);
    60
    }
    61
    }
    62
    
    
    63
    
    
    64
    // 以上使用时 在进行查询的操作时 有可能会出现 sql注入问题
    65
    // 解决SQL注入:使用PreparedStatement 取代 Statement 
    66
    // PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示
    67
    // select * from user where username = ? and password = ? ;
    68
    // 将带有?的SQL 发送给数据库完成编译 (不能执行的SQL 带有?的SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数
    69
    // PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的 
    70
    
    
    71
    
    
    72
    
    
    73
    /************ JDBC 数据库连接操作 ***************/
    74
    Connection conn = null;
    75
    PreparedStatement stmt = null;
    76
    ResultSet rs = null;
    77
    
    
    78
    try {
    79
    // 1. 建立连接
    80
    conn = JDBCUtils.getConnection();
    81
    // 2. 操作数据
    82
    String sql = "select * from user where username = ? and password = ?;";
    83
    stmt = conn.prepareStatement(sql);
    84
    // 设置sql语句的参数
    85
    stmt.setString(1, username);
    86
    stmt.setString(2, password);
    87
    // 执行sql语句
    88
    rs = stmt.executeQuery();
    89
    // 判断返回的结果
    90
    if (rs.next()) {
    91
    // 登录成功
    92
    int id = rs.getInt("id");
    93
    String u_name = rs.getString("username");
    94
    String u_pwd = rs.getString("password");
    95
    String email = rs.getString("email");
    96
    System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email);
    97
    System.out.println("登录成功!");
    98
    } else {
    99
    // 登录失败
    100
    System.out.println("登录失败! 用户名或密码错误!");
    101
    }
    102
    } catch (SQLException e) {
    103
    e.printStackTrace();
    104
    } finally {
    105
    // 3. 释放资源
    106
    JDBCUtils.release(conn, stmt, rs);
    107
    }
    108
    }
    109
    }
    110
    
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    pythonldap 简单试用
    shell 将文件名读入数组
    pytest命令行传入自定义的参数到测试文件中
    Python实现在不同Linux主机之间拷贝文件
    使用minio搭建私有化对象存储服务
    CPU/GPU/NPU
    pytest 内置和自定义marker
    安装SQLite3引发的库问题
    C标准库——程序员等级
    这样还弄不死指针?
  • 原文地址:https://www.cnblogs.com/zhengyuan/p/9446355.html
Copyright © 2020-2023  润新知