下载驱动
MySQL的驱动:https://dev.mysql.com/downloads/connector/j/
下载第二个zip格式的文件,然后解压出jar文件
导入驱动
在idea工程中,新建一个lib文件夹,然后导入jar包,再执行add aslibrary操作,即导入成功。
第一个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();
完整代码
public class JDBCtest {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 加载驱动;Class.forName("com.mysql.cj.jdbc.Driver");// 用户信息和urlString url = "jdbc:mysql://localhost:3306/sql_store?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";String username = "microtes";String password = "694583*z";// 连接成功,数据库对象 Connection 代表数据库;Connection connection = DriverManager.getConnection(url, username, password);// 执行SQL的对象Statement statement = connection.createStatement();// 执行SQLString sql = "SELECT * FROM shippers";ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){System.out.println("id=" + resultSet.getObject("shipper_id"));System.out.println("name=" + resultSet.getObject("name"));System.out.println("=======================================");}// 释放连接resultSet.close();statement.close();connection.close();}}
加载驱动
DriverManager.registerDriver(new Driver()); Class.forName(“com.mysql.cj.jdbc.Driver”);
第一种方法是传统的做法,第二种是通过反射的方法加载驱动。
下面是Driver.class的源码,可以看到下面有一个静态代码块,块里已经有DriverManager.registerDriver(new Driver());这个加载驱动的语句,这个静态代码块在类加载时就会执行,这样一来第一种方法就加载了两次驱动了,因此建议使用第二种方法加载驱动。
public class Driver extends NonRegisteringDriver implements java.sql.Driver {public Driver() throws SQLException {}static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}}
statement 和PreparedStatement
执行SQL的对象**
statement对象用于向数据库发送SQL语句
statement.execute(“”); //可执行所有操作;
statement.executeQuery(“”);//执行查询操作;
statement.executeUpdate(“”);//执行更新、删除和插入操作,返回一个受影响的行数;
PreparedStatement可以防止SQL注入,效率更高。
PreparedStatement st = null;String sql = "insert into sql_store.shippers(shipper_id, name) values (?,?)";st = connection.prepareStatement(sql);//预编译sql,不执行//手动赋值st.setInt(1,4);st.setString(2,"jakfla");//执行int i = st.executeUpdate();if(i > 0){System.out.println("插入成功!");}
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存在漏洞,有被攻击导致数据泄露的可能。
