注意:(数据表如下)
sort表:
user表:
zhangwu表:
1.Part1
JDBC操作数据库的步骤
1.注册驱动
告知JVM使用的是哪一个数据库的驱动,
把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。
2.获得连接
使用JDBC中的类,完成对MySOL数据库的连接
3.获得语句执行平台
通过连接对象获取对SQL语句的执行者对象
4.执行sq1语句
使用执行者对象,向我们数据库执行SOL语句
获取到数据库的执行后的结果
5.处理结果
6.释放资源 一堆close()public class JDBCDemo01 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub // 1.注册驱动 ,使用反射的方式(注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.获得数据库连接 String url = "jdbc:mysql://localhost:3306/hanstudy"; String user = "root"; String password = "123456"; Connection con = DriverManager.getConnection(url, user, password); System.out.println("con:" + con); // 3.获取执行sql语句对象(获得语句执行平台,即通过连接对象获取对SQL语句的执行者对象) Statement state = con.createStatement(); // 4.执行sq1语句 与 处理结果 /* * 增删改:int executeUpdate(String sql); --执行insert update delete语句. * * 查询:ResultSet executeQuery(String sql); --执行select语句. * */ // (1)增加 // int i = state.executeUpdate("insert into sort values(7,'汽车用品',766)");//以这个为例,注意是单引号 // System.out.println("i:"+i); // (2)查询 String sql = "SELECT * FROM sort;"; ResultSet resultSet = state.executeQuery(sql); //注意: 没有调用该方法之前, ResultSet的光标在第一条记录之前, 只有调用一次next方法后, 指针才会查询下一条记录 while (resultSet.next()) { // 当查询到的结果集有下一内容,则输出如下格式的内容... // int sid = resultSet.getInt(1);//第一列的数据,因为他是整型,所以要对应才可以 String sid = resultSet.getString("sid"); // 或者直接String String sname = resultSet.getString("sname"); // float sprice = resultSet.getFloat(3);//第三列的数据,因为他是浮点型 String sprice = resultSet.getString("price"); System.out.println(sid + "\t" + sname + "\t" + sprice); } // 6.关闭资源 resultSet.close(); state.close(); con.close(); } }
2.Part2
SQL演示注入攻击
* statement的弊端!public class JDBCDemo02 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.注册驱动, 使用反射的方式 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.获取连接对象 String url = "jdbc:mysql://localhost:3306/hanstudy"; String user = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, user, password); // 3.通过Connection对象获取Statement对象 Statement statement = connection.createStatement(); Scanner sc = new Scanner(System.in); String name = sc.nextLine(); String pwd = sc.nextLine(); //输入:ahj' or '1=1 // 执行查询 String sql = "select * from user where name= '"+name+"' and password ='"+pwd+"'"; System.out.println(sql); ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { String sid = resultSet.getString("id"); String sname = resultSet.getString("name"); String pawd = resultSet.getString("password"); System.out.println(sid + "\t" + sname + "\t" + pawd ); } System.out.println("输出完成..."); // 6. 释放资源 resultSet.close(); statement.close(); connection.close(); } }
3.Part3
* 预编译处理对象 ,防止注入攻击!
*
* preparedstatement的查询功能public class JDBCDemo03 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1.注册驱动, 使用反射的方式 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.获取连接对象 String url = "jdbc:mysql://localhost:3306/hanstudy"; String user = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, user, password); // 查询所有记录 Scanner sc = new Scanner(System.in); String name = sc.nextLine(); String pwd = sc.nextLine(); // 输入:ahj' or '1=1 // 执行查询 String sql = "select * from user where name= ? AND password = ? "; //1.创建preparedStatement对象,预编译处理 PreparedStatement prepareStatement = connection.prepareStatement(sql); //2.预编译处理对象传递参数 prepareStatement.setObject(1, name); //注意这个方法是setXX prepareStatement.setObject(2, pwd); //注意这个方法是setXX //3.预编译处理对象调用方法 ResultSet resultSet = prepareStatement.executeQuery(); while (resultSet.next()) { String sid = resultSet.getString("id"); String sname = resultSet.getString("name"); String pawd = resultSet.getString("password"); System.out.println(sid + "\t" + sname + "\t" + pawd); } System.out.println("输出完成..."); // 6. 释放资源 resultSet.close(); prepareStatement.close(); connection.close(); } }
4.Part4
预编译处理对象的增删改方法!
public class JDBCDemo04 { public static void main(String[] args) throws Exception { // demo01(); // demo02(); demo03(); } // 增加 public static void demo01() throws Exception { // 1注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456"); // 3获得预处理对象 String sql = "insert into sort(sname) values(?)"; PreparedStatement stat = conn.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "奢侈品"); //注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("新添加记录数:" + line); // 6释放资源 stat.close(); conn.close(); } // 修改 public static void demo02() throws Exception { // 1注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456"); // 3获得预处理对象中 String sql = "update sort set sname=? where sid=?"; PreparedStatement stat = conn.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "数码产品"); //注意这个方法是setXX stat.setInt(2, 1); // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("更新记录数:" + line); // 6释放资源 stat.close(); conn.close(); } // 删除 public static void demo03() throws Exception { // 1注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456"); // 3获得预处理对象 String sql = "delete from sort where sid=?"; PreparedStatement stat = conn.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setInt(1, 10); //注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("删除记录数:" + line); // 6释放资源 stat.close(); conn.close(); } }
5.Part5
* 预编译处理对象的查询方法
public class JDBCDemo05 { public static void main(String[] args) throws Exception { demo04(); System.out.println("--------------"); demo05(); } public static void demo04() throws Exception { // 1注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456"); // 3获得预处理对象 String sql = "select * from sort"; PreparedStatement stat = conn.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 rs.close(); stat.close(); conn.close(); } public static void demo05() throws Exception { // 1注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456"); // 3获得预处理对象 String sql = "select * from sort where sname=?"; PreparedStatement stat = conn.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "汽车用品"); // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 rs.close(); stat.close(); conn.close(); } }
6.Part6
* 编写JDBC工具类JDBCUtils
* 将注册驱动和获取连接等代码编写后封装到此public class JDBCUtils { // 私有构造方法 private JDBCUtils() {} // 定义静态的连接对象作为成员变量 private static Connection connection; // 使用静态代码块执行注册驱动和获取连接 static { try { // 注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 获取连接 String url = "jdbc:mysql://localhost:3306/hanstudy"; String user = "root"; String password = "123456"; connection = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e+"数据库连接失败"); } } // 获取连接 public static Connection getConnection() { return connection; } // 释放资源 判断不为空就关闭资源 public static void close(Connection connection, Statement statement, ResultSet resultSet) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) {} } if (statement != null) { try { statement.close(); } catch (SQLException e) {} } if (connection != null) { try { connection.close(); } catch (SQLException e) {} } } }
* 测试JDBC工具类
* 执行增删改查操作public class TestJDBCUtils { public static void main(String[] args) throws Exception { // 加载、注册驱动, 使用工具类获取连接 Connection connection = JDBCUtils.getConnection(); demo04(connection); // demo05(connection); // demo01(connection); // demo02(connection); // demo03(connection); } // 增加 public static void demo01(Connection connection) throws Exception { // 3获得预处理对象 String sql = "insert into sort(sname) values(?)"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "护肤品"); // 注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("新添加记录数:" + line); // 6释放资源 JDBCUtils.close(connection, stat, null); } // 修改 public static void demo02(Connection connection) throws Exception { // 3获得预处理对象中 String sql = "update sort set sname=? where sid=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "数码产品WUWU"); // 注意这个方法是setXX stat.setInt(2, 1); // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("更新记录数:" + line); // 6释放资源 JDBCUtils.close(connection, stat, null); } // 删除 public static void demo03(Connection connection) throws Exception { // 3获得预处理对象 String sql = "delete from sort where sid=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setInt(1, 9); // 注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("删除记录数:" + line); // 6释放资源 JDBCUtils.close(connection, stat, null); } //查询 public static void demo04(Connection connection) throws Exception { // 3获得预处理对象 String sql = "select * from sort"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 JDBCUtils.close(connection, stat, rs); } //查询 public static void demo05(Connection connection) throws Exception { // 3获得预处理对象 String sql = "select * from sort where sname=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "汽车用品"); // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 JDBCUtils.close(connection, stat, rs); } }
7.Part7
* JDBC读取sort表,封装到sort类中
public class JDBCDemo06 { public static void main(String[] args) throws Exception { Connection conn = JDBCUtils.getConnection(); //创建预编译对象 PreparedStatement pst = conn.prepareStatement("select * from sort"); //执行SQL语句 ResultSet resultSet = pst.executeQuery(); //创建集合对象 List<Sort> list = new ArrayList<Sort>(); while(resultSet.next()){ Sort s = new Sort(resultSet.getInt("sid"),resultSet.getString("sname"),resultSet.getFloat("price")); //根据名称获取列数据 //添加到集合 list.add(s); } JDBCUtils.close(conn, pst, resultSet); //增强for遍历集合 for(Sort s: list){ System.out.println(s); } } }
* 与数据表对应的类,注意属性要和字段名一样!
public class Sort { private int sid; private String sname; private float price; public Sort(int sid, String sname, float price) { super(); this.sid = sid; this.sname = sname; this.price = price; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "sort [sid=" + sid + ", sname=" + sname + ", price=" + price + "]"; } }
8.Part8
配置文件properties
* 加载properties配置文件,IO流读取文件
public class PropertiesDemo { public static void main(String[] args) throws IOException, Exception { // 1.获取类加载器: 获取某个类的字节码对象, 通过字节码对象获取类加载器对象 ClassLoader classLoader = PropertiesDemo.class.getClassLoader(); // 2.使用类加载器对象加载配置文件, 返回字节输入流 InputStream in = classLoader.getResourceAsStream("database.properties"); // 3.使用Properties加载输入流, 获得键值对信息 Properties properties = new Properties(); properties.load(in); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); String user = properties.getProperty("user"); String password = properties.getProperty("password"); Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, password); System.out.println(connection); } }
* 使用配置文件的JDBC工具类:JBDCUtilsVersion2
public class JBDCUtilsVersion2 { // 声明静态变量 private static Connection connection; private static String driverClass; private static String url; private static String username; private static String password; // 静态代码块进行初始化 static { try { // 读取配置文件 readConfig(); // 注册驱动 Class.forName(driverClass); // 获取连接 connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("数据库连接失败"); } } // 私有构造方法 private JBDCUtilsVersion2() {} // 读取配置文件方法 private static void readConfig() throws Exception { // 使用类加载器加载bin目录下的配置文件, 获取输入流 InputStream in = JBDCUtilsVersion2.class.getClassLoader().getResourceAsStream("database.properties"); // 创建Properties对象 Properties properties = new Properties(); // 加载数据 properties.load(in); // 通过键获取值 driverClass = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("user"); password = properties.getProperty("password"); } // 返回连接对象 public static Connection getConnection() { return connection; } }
测试JDBC工具类:TestJDBCUtileVersion2
public class TestJDBCUtileVersion2 { public static void main(String[] args) throws Exception { // 加载、注册驱动, 使用工具类获取连接 Connection connection = JBDCUtilsVersion2.getConnection(); // demo04(connection); // demo05(connection); // demo01(connection); // demo02(connection); demo03(connection); } // 增加 public static void demo01(Connection connection) throws Exception { // 3获得预处理对象 String sql = "insert into sort(sname) values(?)"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "保健品"); // 注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("新添加记录数:" + line); // 6释放资源 JBDCUtilsVersion2.close(connection, stat, null); } // 修改 public static void demo02(Connection connection) throws Exception { // 3获得预处理对象中 String sql = "update sort set sname=? where sid=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "数码产品"); // 注意这个方法是setXX stat.setInt(2, 1); // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("更新记录数:" + line); // 6释放资源 JBDCUtilsVersion2.close(connection, stat, null); } // 删除 public static void demo03(Connection connection) throws Exception { // 3获得预处理对象 String sql = "delete from sort where sid=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setInt(1, 12); // 注意这个方法是setXX // 5执行SQL语句 int line = stat.executeUpdate(); System.out.println("删除记录数:" + line); // 6释放资源 JBDCUtilsVersion2.close(connection, stat, null); } //查询 public static void demo04(Connection connection) throws Exception { // 3获得预处理对象 String sql = "select * from sort"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 JBDCUtilsVersion2.close(connection, stat, rs); } //查询 public static void demo05(Connection connection) throws Exception { // 3获得预处理对象 String sql = "select * from sort where sname=?"; PreparedStatement stat = connection.prepareStatement(sql); // 4 SQL语句占位符设置实际参数 stat.setString(1, "汽车用品"); // 5执行SQL语句 ResultSet rs = stat.executeQuery(); // 6处理结果集(遍历结果集合) while (rs.next()) { // 获取当前行的分类ID String sid = rs.getString("sid");// 方法参数为数据库表中的列名 // 获取当前行的分类名称 String sname = rs.getString("sname"); // 获取当前行的分类价格 String sprice = rs.getString("price"); // 显示数据 System.out.println(sid + "-----" + sname + "-----" + sprice); } // 7释放资源 JBDCUtilsVersion2.close(connection, stat, rs); } }
Gitee学习笔记:MySQL · 许AX/MySQL - 码云 - 开源中国 (gitee.com)