下载驱动

MySQL的驱动:https://dev.mysql.com/downloads/connector/j/
image.png
下载第二个zip格式的文件,然后解压出jar文件

导入驱动

在idea工程中,新建一个lib文件夹,然后导入jar包,再执行add aslibrary操作,即导入成功。
image.png

第一个JDBC程序

加载驱动

Class.forName(“com.mysql.cj.jdbc.Driver”);

使用String填写用户信息和url

String url = “jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC”; String username = “**“; String password = “*“;

使用DriverManager连接数据库

Connection connection = DriverManager.getConnection(url, username, password);

执行sql

Statement statement = connection.createStatement(); // 用以执行SQL语句的对象 tring sql = “SELECT * FROM shippers”; ResultSet resultSet = statement.executeQuery(sql);

释放连接

resultSet.close(); statement.close(); connection.close();

完整代码

  1. public class JDBCtest {
  2. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  3. // 加载驱动;
  4. Class.forName("com.mysql.cj.jdbc.Driver");
  5. // 用户信息和url
  6. String url = "jdbc:mysql://localhost:3306/sql_store?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
  7. String username = "microtes";
  8. String password = "694583*z";
  9. // 连接成功,数据库对象 Connection 代表数据库;
  10. Connection connection = DriverManager.getConnection(url, username, password);
  11. // 执行SQL的对象
  12. Statement statement = connection.createStatement();
  13. // 执行SQL
  14. String sql = "SELECT * FROM shippers";
  15. ResultSet resultSet = statement.executeQuery(sql);
  16. while (resultSet.next()){
  17. System.out.println("id=" + resultSet.getObject("shipper_id"));
  18. System.out.println("name=" + resultSet.getObject("name"));
  19. System.out.println("=======================================");
  20. }
  21. // 释放连接
  22. resultSet.close();
  23. statement.close();
  24. connection.close();
  25. }
  26. }

加载驱动

DriverManager.registerDriver(new Driver()); Class.forName(“com.mysql.cj.jdbc.Driver”);

第一种方法是传统的做法,第二种是通过反射的方法加载驱动。
下面是Driver.class的源码,可以看到下面有一个静态代码块,块里已经有DriverManager.registerDriver(new Driver());这个加载驱动的语句,这个静态代码块在类加载时就会执行,这样一来第一种方法就加载了两次驱动了,因此建议使用第二种方法加载驱动。

  1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  2. public Driver() throws SQLException {
  3. }
  4. static {
  5. try {
  6. DriverManager.registerDriver(new Driver());
  7. } catch (SQLException var1) {
  8. throw new RuntimeException("Can't register driver!");
  9. }
  10. }
  11. }

statement 和PreparedStatement

执行SQL的对象**

statement对象用于向数据库发送SQL语句
statement.execute(“”); //可执行所有操作;
statement.executeQuery(“”);//执行查询操作;
statement.executeUpdate(“”);//执行更新、删除和插入操作,返回一个受影响的行数;

PreparedStatement可以防止SQL注入,效率更高。

  1. PreparedStatement st = null;
  2. String sql = "insert into sql_store.shippers(shipper_id, name) values (?,?)";
  3. st = connection.prepareStatement(sql);//预编译sql,不执行
  4. //手动赋值
  5. st.setInt(1,4);
  6. st.setString(2,"jakfla");
  7. //执行
  8. int i = st.executeUpdate();
  9. if(i > 0){
  10. System.out.println("插入成功!");
  11. }

resultSet 封装了statement执行sql的结果

resultSet.getObject();//在不知道列类型的情况下使用;
resultSet.getInt();
resultSet.getFloat();
resultSet.getString();

resultSet.beforeFirst()//移动到最前面,下一个是第一行;
resultSet.afterLast();//移动到最后面,上一个是最后一行;
resultSet.absolute(Row);//移动到指定行;
resultSet.next();//移动到下一个数据;
resultSet.previous();//移动到上一行;

SQL注入

SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。sql存在漏洞,有被攻击导致数据泄露的可能。