public class JDBC_01 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 Statement st = conn.createStatement(); //4、执行sql(查询所有数据),返回结果 ResultSet rs = st.executeQuery("select * from user"); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { st.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
public class JDBC_01 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 Statement st = conn.createStatement(); //4、执行sql,返回结果 ResultSet rs = st.executeQuery("select * from user"); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { st.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
public class JDBC_03 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 PreparedStatement ps = conn.prepareStatement("select * from user"); //4、执行sql,返回结果 ResultSet rs = ps.executeQuery(); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
public class JDBC_04 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 PreparedStatement ps = conn.prepareStatement("insert into user values(?, ?, ?, ?, ?, ?, ?)"); //4、执行sql,返回结果 ps.setInt(1, 22); ps.setString(2, "220"); ps.setString(3, "叶良辰"); ps.setInt(4, 100); ps.setInt(5, 100); ps.setInt(6, 100); ps.setInt(7, 100); int i = ps.executeUpdate(); //5、数据处理 System.out.println(i); //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
mysql8之前
com.mysql.jdbc.Driver
mysql8之后
com.mysql.cj.jdbc.Driver
调用Class类的静态方法forName()
Class.forName(“com.mysql.cj.jdbc.Driver”);
驱动程序管理器类的 registerDriver() 方法
DriverManager.registerDriver(com.mysql.jdbc.Driver);
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
DriverManager.getConnection(url, user, password);
getConnection() 方法需要三个参数url、user、password
user、password是当前连接的数据库管理程序的用户名和密码
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的 驱动程序,从而建立到数据库的连接
JDBC URL的标准由三部分组成,各部分间用冒号分隔
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
connection.createStatement();
sql注入攻击:
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user='a' OR 1 = ' AND password =' OR '1' = '1') ,从而利用系统的 SQL 引擎完成恶意行为的做法
因为Statement传输的sql语句是用+进行拼接处理的,所以有此漏洞
解决方法:
使用PreparedStatement,参数用?代替可以防止sql注入
connection.prepareStatement("//sql语句");
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
防止SQL注入
释放ResultSet、Statement、Connection、PreparedStatement
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放, 如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放
最晚获取的最先关闭
关闭顺序:ResultSet——>Statement(PreparedStatement)——>Connection
ResultSet rs = preparedstatement.executeQuery();
ResultSet rs = statement.executeQuery("//sql语句");
只有返回结果的sql语句才会使用execute创建ResultSet对象
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
关于ResultSet
可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于 Iterator 对象的 hasNext() 和 next() 方法的结合体
当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一 列的值