JDBC
1. 是什么
就是用java语言去操作数据库。
2. 使用说明
会使用的包 | 说明 |
---|---|
java.sql | 所有与 JDBC 访问数据库相关的接口和类 |
javax.sql | 数据库扩展包,提供数据库额外的功能。如:连接池 |
数据库的驱动 | 由各大数据库厂商提供,需要额外去下载(驱动jar包),是对 JDBC 接口实现的类 |
-
核心API
接口或类 作用 DriverManager 类 1) 管理和注册数据库驱动 2) 得到数据库连接对象 Connection 接口 一个连接对象,可用于创建 Statement 和 PreparedStatement 对象 Statement 接口 一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。 PreparedStatemen 接口 一个 SQL 语句对象,是 Statement 的子接口 ResultSet 接口 用于封装数据库查询的结果集,返回给客户端 Java 程序 -
访问过程
-
注册和加载驱动(可省略)
-
获取链接
-
Connection 获取 Statement 对象
-
使用 Statement 对象执行 SQL 语句
-
返回结果集rs(始终记住,把关系型数据库想成一张表就可以了。)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvX8Rd4W-1619002911406)(C:\Users\2020\AppData\Roaming\Typora\typora-user-images\image-20210421163713286.png)]
-
释放资源(先开的后关,后开的先关)
-
PreparedStatement 接口
相比于Statement
- prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
- 安全性更高,没有 SQL 注入的隐患。
- 提高了程序的可读性
-
JDBC 事务的处理
Connection 接口中与事务有关的方法 说明 void setAutoCommit(boolean autoCommit) 参数是 true 或 false如果设置为 false,表示关闭自动提交,相当于开启事务 void commit() 提交事务 void rollback() 回滚事务
3. 一个具体的例子
- 项目结构:
- 将驱动jar包导入libs里面。
- 写一个JDBCUtils工具类,将一些重复性的操作打包。
- 编写登录案例代码。
-
代码
- 工具类
- 完成注册驱动
- 提供获取连接对象的方法
- 提供释放资源的方法
package cn.itcast.util; 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. 创建Properties集合类。 Properties pro = new Properties(); //获取src路径下的文件的方式--->ClassLoader 类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL res = classLoader.getResource("jdbc.properties"); String path = res.getPath(); // System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties //2. 加载文件 // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties")); pro.load(new FileReader(path)); //3. 获取数据,赋值 url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); driver = pro.getProperty("driver"); //4. 注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连接 * @return 连接对象 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password);//DriverManager类的静态方法 } /** * 释放资源 * @param stmt * @param conn */ 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(); } } } /** * 释放资源 * @param stmt * @param conn */ public static void close(ResultSet rs,Statement stmt, Connection conn){ if( rs != null){ try { rs.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(); } } } }
- 登录案例
package cn.itcast.jdbc; import cn.itcast.util.JDBCUtils; import java.sql.*; import java.util.Scanner; /** * 练习: * * 需求: * 1. 通过键盘录入用户名和密码 * 2. 判断用户是否登录成功 */ public class JDBCDemo9 { public static void main(String[] args) { //1.键盘录入,接受用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); //2.调用方法 boolean flag = new JDBCDemo9().login(username, password); //3.判断结果,输出不同语句 if(flag){ //登录成功 System.out.println("登录成功!"); }else{ System.out.println("用户名或密码错误!"); } } /** * Statement执行登录方法 */ public boolean login(String username ,String password){ if(username == null || password == null){ return false; } //连接数据库判断是否登录成功 Connection conn = null; Statement stmt = null; ResultSet rs = null; //1.获取连接 try { conn = JDBCUtils.getConnection(); //2.定义sql String sql = "select * from user where username = '"+username+"' and password = '"+password+"' "; System.out.println(sql); //3.获取执行sql的对象 stmt = conn.createStatement(); //4.执行查询 rs = stmt.executeQuery(sql); //5.判断 /* if(rs.next()){//如果有下一行,则返回true return true; }else{ return false; }*/ return rs.next();//如果有下一行,则返回true } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(rs,stmt,conn); } return false; } /** * 登录方法,使用PreparedStatement实现 */ public boolean login2(String username ,String password){ if(username == null || password == null){ return false; } //连接数据库判断是否登录成功 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //1.获取连接 try { conn = JDBCUtils.getConnection(); //2.定义sql String sql = "select * from user where username = ? and password = ?"; //3.获取执行sql的对象 pstmt = conn.prepareStatement(sql); //给?赋值,将指定参数设置为给定 Java 类型 值 pstmt.setString(1,username); pstmt.setString(2,password); //4.执行查询,不需要传递sql rs = pstmt.executeQuery();//执行查询语句 //5.判断 /* if(rs.next()){//如果有下一行,则返回true return true; }else{ return false; }*/ return rs.next();//如果有下一行,则返回true } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(rs,pstmt,conn); } return false; } }
总结:
- JDBC提供的是一系列操作数据库的接口,具体的实现类由各个数据库生产厂家去实现。
- 我们要在意的是代码逻辑的编写,而不是对各个执行对象的细节。所以了解这个过程就行了,没有必要将所有东西搞清楚。
- 总之,我们可以用代码实现对存放在数据库中的数据的管理,认识到以后干的最多的就是将数据取出来展示,或收集数据入库,这才是重点。
- 工具类