一、封装一个类

在一个utils工具包,在下面写一个JdbcUtil工具类

  1. package com.qfedu.utils;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.sql.*;
  6. import java.util.Properties;
  7. /**
  8. * @author wodexinhuai
  9. * @create 2022-04-27-9:35
  10. */
  11. public class JdbcUtil {
  12. private static String url = null;
  13. private static String user = null;
  14. private static String password = null;
  15. static{
  16. Properties properties = new Properties();
  17. try {
  18. properties.load(new FileInputStream("E:\\idea_workspace\\zhuzhiwei\\day39\\src\\db.properties"));
  19. String driver = properties.getProperty("Driver");
  20. url = properties.getProperty("url");
  21. user = properties.getProperty("user");
  22. password = properties.getProperty("password");
  23. Class.forName(driver);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. public static Connection getConnection(){
  29. Connection connection = null;
  30. try {
  31. connection = DriverManager.getConnection(url, user, password);
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. }
  35. return connection;
  36. }
  37. public static void close(Connection connection){
  38. try {
  39. connection.close();
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. public static void close(Connection connection, Statement statement){
  45. try {
  46. connection.close();
  47. statement.close();
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. public static void close(Connection connection,Statement statement, ResultSet resultSet){
  53. try {
  54. connection.close();
  55. statement.close();
  56. resultSet.close();
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }

在src写新建一个.properti的配置文件

  1. Driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/java2204?useSSL=false
  3. user=root
  4. password=123456

再次增删改查时,可以直接调用封装好的类,让代码更加简洁

  1. package com.qfedu.test;
  2. import com.qfedu.utils.JdbcUtil;
  3. import org.junit.jupiter.api.Test;
  4. import java.sql.Connection;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. /**
  9. * @author wodexinhuai
  10. * @create 2022-04-27-9:34
  11. */
  12. public class Demo1 {
  13. public static void main(String[] args) throws SQLException {
  14. // @Test
  15. // public void testAdd() throws SQLException {
  16. Connection connection = JdbcUtil.getConnection();
  17. Statement statement = connection.createStatement();
  18. String sql = "insert into work(name,age,info) values('z志伟',24,'哈哈哈哈')";
  19. int i = statement.executeUpdate(sql);
  20. System.out.println(i);
  21. JdbcUtil.close(connection,statement);
  22. }
  23. @Test
  24. public void testDelete() throws SQLException {
  25. Connection connection = JdbcUtil.getConnection();
  26. Statement statement = connection.createStatement();
  27. String sql = "delete from work where id = 4";
  28. int i = statement.executeUpdate(sql);
  29. JdbcUtil.close(connection,statement);
  30. }
  31. @Test
  32. public void testCelect() throws SQLException {
  33. Connection connection = JdbcUtil.getConnection();
  34. Statement statement = connection.createStatement();
  35. String sql = "select * from work";
  36. ResultSet resultSet = statement.executeQuery(sql);
  37. while(resultSet.next()){
  38. int id = resultSet.getInt("id");
  39. System.out.println(id);
  40. }
  41. JdbcUtil.close(connection,statement,resultSet);
  42. }
  43. }

二、预处理的搬运工对象

以后不用Statement,

参数化的SQL语句:insert into work(name,age,info) values(?,?,?)

静态的SQL语句:insert into work(name,age,info) values(“朱”,10,“啊啊”)

  1. PreparedStatement preparedStatement = connection.prepareStatement(参数化的SQL语句);

2.1增

  1. package com.qfedu.test2yuchuli;
  2. import com.qfedu.utils.JdbcUtil;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. /**
  8. * @author wodexinhuai
  9. * @create 2022-04-27-10:53
  10. * 预处理搬运工
  11. */
  12. public class Demo1 {
  13. public static void main(String[] args) throws SQLException {
  14. //1.获取connection对象
  15. Connection connection = JdbcUtil.getConnection();
  16. //2.准备一个参数化的sql语句 ?只是占位
  17. String sql = "insert into work(name,age,info) values (?,?,?)";
  18. //3.使用connection对象获取预处理搬运工对象
  19. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  20. //4.对参数化的sql语句的?进行赋值
  21. preparedStatement.setObject(1,"朱");
  22. preparedStatement.setObject(2,99);
  23. preparedStatement.setObject(3,"信息");
  24. //5.执行sql语句
  25. int i = preparedStatement.executeUpdate();
  26. System.out.println(i);
  27. //6.关闭资源 preparedStatement是statement的子类
  28. JdbcUtil.close(connection, preparedStatement);
  29. }
  30. }

2.2模糊查询

  1. package com.qfedu.test2yuchuli;
  2. import com.qfedu.utils.JdbcUtil;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.Collection;
  8. /**
  9. * @author wodexinhuai
  10. * @create 2022-04-27-11:42
  11. */
  12. public class Demo5like {
  13. public static void main(String[] args) throws SQLException {
  14. Connection connection = JdbcUtil.getConnection();
  15. String sql = "select * from work where name like ?";
  16. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  17. preparedStatement.setObject(1,"%博%");
  18. ResultSet resultSet = preparedStatement.executeQuery();
  19. while (resultSet.next()){
  20. int id = resultSet.getInt("id");
  21. String name = resultSet.getString("name");
  22. System.out.print(id + "\t");
  23. System.out.println(name);
  24. }
  25. JdbcUtil.close(connection,preparedStatement,resultSet);
  26. }
  27. }

三、SQL注入【了解】

比如有时候写的删除或者修改sql又漏洞

delete from person where id = 1 or 1 = 1;

or 1 = 1;恒成立,条件相当于没写,这叫SQL注入

搬运工Statement不能防止这种情况

预处理的搬运工prepareStatement可以

为什么预处理搬运工可以?

  1. 因为SQL是预编译的,语句里面使用占位符“?”。 一个?是一个占位
  2. 2 or 1=1 三个占位,所以语法上就错了。
  1. package com.qfedu.test3;
  2. import com.qfedu.utils.JdbcUtil;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. /**
  8. * @author wodexinhuai
  9. * @create 2022-04-27-14:21
  10. */
  11. public class Demo1 {
  12. public static void main(String[] args) throws SQLException {
  13. // testStatement();
  14. testPrepareStatement();
  15. }
  16. //搬运工 不能预防 全删
  17. public static void testStatement() throws SQLException {
  18. Connection connection = JdbcUtil.getConnection();
  19. String id = "2 or 1 = 1";
  20. String sql = "delete from person5 where id = " + id;
  21. Statement statement = connection.createStatement();
  22. int i = statement.executeUpdate(sql);
  23. System.out.println(i);
  24. JdbcUtil.close(connection,statement);
  25. }
  26. //预处理搬运工可以预防 报错
  27. public static void testPrepareStatement() throws SQLException {
  28. Connection connection = JdbcUtil.getConnection();
  29. String sql = "delete from person3 where id = ?";
  30. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  31. preparedStatement.setObject(1,"1 or 1 = 1");
  32. int i = preparedStatement.executeUpdate();
  33. JdbcUtil.close(connection,preparedStatement);
  34. }
  35. }

注意!

查询的时候可以带1=1 以后会学动态SQL

删除和修改不能带1=1

四、javaBean规范和Beanutils类

4.1javaBean规范

javaBean就是java的实体类

写实体类的规范:

  1. 1.私有化成员变量
  2. 2.提供一个无参数的构造方法 如果没有有参构造可以不写 默认有
  3. 3.提供成员变量的setget方法
  4. 4.每一个实体类单独成一个文件

4.2Beanutils类【重点】

在jdk里面没有这个类,说明不是jdk提供的。肯定是第三方提供的类,所以要导包

在官网https://mvnrepository.com/ 搜索Beanutils

commons-beanutils-1.9.3.jar

这个类是基于反射的类,是对实体进行赋值和取值的。

异常:ClassNotFoundException 出现这样的异常大部分原因是包没有导入完全

百度,然后在下载一个commons-logging-1.2.jar,导进去

案例

  1. package com.qfedu.test5BeanUtils;
  2. import com.qfedu.entity.Work;
  3. import org.apache.commons.beanutils.BeanUtils;
  4. import java.lang.reflect.InvocationTargetException;
  5. /**
  6. * @author wodexinhuai
  7. * @create 2022-04-27-14:59
  8. */
  9. public class Demo1 {
  10. public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
  11. //对实体类的属性进行赋值和取值的
  12. //
  13. Work work = new Work();
  14. //BeanUtils都是静态方法 不用new
  15. //通过BeanUtils对work实体类进行赋值
  16. //对work类下的id进行赋值1
  17. BeanUtils.setProperty(work,"id",1);
  18. BeanUtils.setProperty(work,"name","博儿");
  19. //取值 work下的属性id的值
  20. String id = BeanUtils.getProperty(work, "id");
  21. String name = BeanUtils.getProperty(work, "name");
  22. System.out.println(id);
  23. System.out.println(name);
  24. }
  25. }

最少需要导两个包,如果还有错误,根据百度需要什么包,在进行下载和导入

五、元数据【重点】

数据库的元数据【了解】 自己百度看看

参数元数据【重点】

结果集元数据【重点】

5.1参数元数据【重点】

获取预处理的搬运工对象的时候,处理SQL语句,参数化的的SQL语句,就是那个问号

Parameter 参数 MetaData 元数据

ParameterMetaData getParameterMetaData

  1. package com.qfedu.test6yuanshuju;
  2. import com.qfedu.utils.JdbcUtil;
  3. import java.sql.Connection;
  4. import java.sql.ParameterMetaData;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7. /**
  8. * @author wodexinhuai
  9. * @create 2022-04-27-15:48
  10. */
  11. //参数元数据
  12. public class Demo1 {
  13. public static void main(String[] args) throws SQLException {
  14. Connection connection = JdbcUtil.getConnection();
  15. String sql = "update work set name=?,age=?,info=? where id =?";
  16. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  17. //getParameterMetaData 得到参数的元数据对象
  18. ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
  19. //可以获取SQL语句参数的个数 几个问号几个参数
  20. int parameterCount = parameterMetaData.getParameterCount();
  21. System.out.println(parameterCount);
  22. //获取参数个数有啥用?通过循环给参数?进行赋值
  23. Object[] objs = {"zzw",123,"hahahah",7};
  24. for (int i = 1; i <= parameterCount; i++) {
  25. preparedStatement.setObject(i,objs[i-1]);
  26. }
  27. int i = preparedStatement.executeUpdate();
  28. System.out.println(i);
  29. JdbcUtil.close(connection,preparedStatement);
  30. }
  31. }

5.2结果集元数据【重点】

Result

  1. package com.qfedu.test6yuanshuju;
  2. import com.qfedu.utils.JdbcUtil;
  3. import java.sql.*;
  4. /**
  5. * @author wodexinhuai
  6. * @create 2022-04-27-16:09
  7. */
  8. //结果集元数据
  9. public class Demo2 {
  10. public static void main(String[] args) throws SQLException {
  11. Connection connection = JdbcUtil.getConnection();
  12. String sql = "select * from work";
  13. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  14. ResultSet resultSet = preparedStatement.executeQuery();
  15. //只能通过ResultSet对象获取结果集元数据对象 ResultSetMetaData
  16. ResultSetMetaData metaData = resultSet.getMetaData();
  17. //获取列(字段)的个数
  18. int columnCount = metaData.getColumnCount();
  19. // System.out.println(columnCount);//四个字段
  20. //获取字段名字 结果集元数据.getColumnName()
  21. // System.out.println(metaData.getColumnName(1));
  22. // System.out.println(metaData.getColumnName(2));
  23. // System.out.println(metaData.getColumnName(3));
  24. // System.out.println(metaData.getColumnName(4));
  25. //通过字段名字取数据
  26. // while(resultSet.next()){
  27. // for (int i = 1; i <= columnCount; i++) {
  28. // for (int j = 1; j <= columnCount; j++) {
  29. // Object object = resultSet.getObject(metaData.getColumnName(j));
  30. // System.out.print(object + "\t");
  31. // }
  32. // System.out.println();
  33. // break;
  34. // }
  35. // }
  36. //while就是一层循环
  37. while(resultSet.next()){
  38. for (int i = 1; i <= columnCount; i++) {
  39. String columnName = metaData.getColumnName(i);
  40. System.out.print(resultSet.getObject(columnName) + "\t");
  41. }
  42. System.out.println();
  43. }
  44. JdbcUtil.close(connection,preparedStatement,resultSet);
  45. }
  46. }