JDBC Java 数据库连接(Java DataBase Connectivity)
//固定代码 // 1.注册驱动. // 告知JVM使用的是哪一个数据库的驱动 Class.forName("com.mysql.jdbc.Driver");//mysql 驱动类//DriverManager.registerDriver(new Driver()); // 2.建立连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/webdatabase", "root", "root"); // 3.编写sql (在java中编写sql语句,结尾可以不加分号) String sql = "insert into user values(null,'lucy','666')"; // 4.获取sql执行对象(小货车) Statement statement = connection.createStatement(); // 5.发送(执行)sql并返回结果 int i = statement.executeUpdate(sql); // 6.处理结果 if (i > 0) { System.out.println("新增成功"); } else { System.out.println("新增失败"); } // 7.释放资源 statement.close(); connection.close();
1. 注册驱动 a)【了解】 static void registerDriver(Driver driver) 我们通过翻看mysql Driver驱动实现类的源码发现了,内部静态代码块已经实现注册驱动功能 static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } b)反射【掌握】 Class.forName("com.mysql.jdbc.Driver"); 2. 建立连接 static Connection getConnection(String url, String user, String password) 参数说明 url:建立指定数据库连接的URL地址【固定格式】 格式:jdbc:mysql://ip地址:端口/数据库名称?useUnicode=true&characterEncoding=UTF-8
实例: jdbc:mysql://localhost:3306/webdatabase?useUnicode=true&characterEncoding=UTF-8
jdbc:mysql:///webdatabase user:用户名 password:密码
Connection:数据库连接对象
1. 获取sql执行对象 Statement createStatement() PreparedStatement prepareStatement(String sql) 2. 事务管理 a)开启事务(关闭自动提交) void setAutoCommit(boolean autoCommit) 参数: true:自动提交sql【mysql默认值】 false:手动提交 b)提交事务 void commit() c)回滚事务 void rollback()
Statement:执行(发送)sql语句的对象
1. 执行所有类型(DDL、DML、DQL)的sql语句 boolean execute(String sql) ------------------------------------------ 2. 用于执行DML类型的sql语句 int executeUpdate(String sql) 参数:insert、delete、update的sql语句 返回:影响行数 3. 用于执行DQL类型的sql语句 ResultSet executeQuery(String sql) 参数:select的sql语句 返回:结果集(集合对象)
增强类 PreparedStatement
// 1.获取连接 // 2.编写sql(通过?占位符代替实际参数拼接) String sql = "SELECT * FROM `user` WHERE username = ? AND `password` = ?"; // 3.获取sql预编译执行对象 PreparedSatement pstmt = conn.prepareStatement(sql); // 4.设置占位符实际参数 pstmt.setString(1,"admin' #"); pstmt.setObject(2,""); // 5.执行sql并返回结果 ResultSet resultSet = pstmt.executeQuery();
优点
1. 防止sql注入,提高程序的安全性
2. 参数与sql分离,使用 ?占位符,提高sql可读性
3. 减少编译次数,批量操作时(插入),提高程序高性能
1. statement对象每次执行sql语句时,都需要进行编译
2. PreparedSatement对象,只需要预编译一次,相同的sql语句,可以执行多次
ResultSet:结果集对象,封装查询结果
1. 指针下移 boolean next() 返回 true,此行有数据 flase,表示此行没数据 通常与while循环结合使用,遍历数据 2. 获取数据(key-value) T getXxx(int 列编号) T getXxx(String 列名) 补充:获取所有的数据类型 Object getObject(String 列名) String getString(String 列名)
* 事务 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 * MySQL操作 1.开启事务 begin | start transaction 2.提交事务 commit 3.回顾事务 rollback * java操作(使用Connection对象) 1.关闭自动提交(开启事务) void setAutoCommit(false); 2.提交事务 void commit(); 3.回顾事务 void rollback();
将JDBC封装成独立的方法,方便直接调用
// 声明数据库配置变量 private static String driver; private static String url; private static String username; private static String password; // 加载jdbc.properties配置文件,给变量赋值 static { // SE阶段 new Properties.load(); // sun公司提供,专门加载src目录下的properties类型文件,不需要手写扩展名 ResourceBundle jdbc = ResourceBundle.getBundle("jdbc"); driver = jdbc.getString("jdbc.driver"); url = jdbc.getString("jdbc.url"); username = jdbc.getString("jdbc.username"); password = jdbc.getString("jdbc.password"); } // 1.注册驱动【保证只注册一次】 static { try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new RuntimeException("注册驱动失败..."); } } // 2.获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } // 3.释放资源 public static void release(ResultSet resultSet, Statement statement, Connection connection) { // 关闭ResultSet if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭Statement if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭Connection if (connection != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } } // 方法重载 public static void release(Statement statement, Connection connection) { release(null, statement, connection); }