import java.sql.*;public class JDBCUtil {private static String driver;private static String url;private static String user;private static String passWord;//解析配置文件.propertiesstatic {try {Properties properties = new Properties();properties.load(new FileInputStream(".properties文件路径"));driver = (String) properties.get("driver");url = (String) properties.get("url");user = (String) properties.get("user");passWord = (String) properties.get("passWord");}catch (Exception e){e.printStackTrace();}}//获得Connection对象public static Connection getConnection(){Connection connection = null;try{Class.forName(driver);connection = DriverManager.getConnection(url,user,passWord);}catch (Exception e){e.printStackTrace();}return connection;}//关闭资源 -- 针对查询public static void close(ResultSet resultset,Statement statement,Connection connection){try {if (resultset != null) {resultset.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}}catch (Exception e){e.printStackTrace();}}//关闭资源 -- 针对增删改public static void close(Statement statement,Connection connection){close(null,statement,connection);}//针对DML语句--增删改public static boolean executeUpdate(String sql,List<Object> list){Connection connection = getConnection();PreparedStatement pre = null;try {pre = connection.prepareStatement(sql);for (int i = 0;i < list.size();i++){pre.setObject(i + 1,list.get(i));}return (pre.executeUpdate() > 0)? true : false;}catch (Exception e){e.printStackTrace();}finally {close(pre,connection);}return false;}//针对查DQL语句public static <T> List<T> executeQuery(String sql,List<Object> list,Class<T> tClass){Connection connection = getConnection();PreparedStatement statement = null;ResultSet resultSet = null;List<T> li = new ArrayList<>();try {statement = connection.prepareStatement(sql);for (int i = 0;i < list.size();i++){statement.setObject(i + 1,list.get(i));}resultSet = statement.executeQuery();ResultSetMetaData resultSetMetaData = https://www.isolves.com/it/sjk/bk/2022-07-27/resultSet.getMetaData();//获取列数int count = resultSetMetaData.getColumnCount();//遍历所有行while (resultSet.next()){T t = tClass.newInstance();for (int i = 1;i <= count;i++){//获取每一列列名String keyName = resultSetMetaData.getColumnLabel(i);//获取每一列对应的值Object value = resultSet.getObject(keyName);//T中对应的属性Field key = tClass.getDeclaredField(keyName);key.setAccessible(true);key.set(t,value);}li.add(t);}}catch (Exception e){e.printStackTrace();}finally {close(connection,statement,resultSet);}return li;}}
封装查询返回值遍历方式List<Map> list = JDBCUtils.executeQuery(sql,new ArrayList());for (Map<String,Object> map : list){for (Map.Entry<String,Object> entry : map.entrySet()){String s = entry.getKey();Object o = entry.getValue();System.out.print(s + "=" + o + ",");}System.out.println();}
sql注入攻击SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令,如下,从而利用系统的 SQL 引擎完成恶意行为的做法 。
SELECT user, password FROM user_table WHERE user='a' OR 1 = ' AND password = ' OR '1' = '1'
对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement ( 继承于Statement ) 取代 Statement 就可以了
PreparedStatement类1、可以通过 调用 Connection 对象的 preparedStatement() 方法 获取 PreparedStatement 对象
2、PreparedStatement 接口是 Statement 的子接口,它表示一条 预编译 过的 SQL 语句
PreparedStatement类和Statement的比较1、代码的可读性和可维护性
2、PreparedStatement 能最大可能提高性能
3、PreparedStatement 可以防止 SQL 注入
4、如果拼接表名、列名、关键字,必须使用Statement,防止sql语句错误
ResultSet类1、通过 调用 PreparedStatement 对象的 excuteQuery() 方法 创建该对象
2、代表结果集3、ResultSet 返回的实际上就是一张数据表.,有一个指针指向数据表的第一条记录的前面 。
ResultSetMetaData 类1、通过 调用ResultSet对象的getMetaData()方法 创建改对象
2、可用于 获取关于 ResultSet 对象中列的类型和属性信息的对象
常用方法JDBC封装Dao**DAO (Data Access objects 数据存取对象)**是指位于业务逻辑和持久化数据之间实现对持久化数据的访问 。通俗来讲,就是将数据库操作都封装起来 。能够是代码的结构更加清晰化 。
DAO 模式组成
- DAO接口 : 把对数据库的所有操作定义成抽象方法,可以提供多种实现 。
- DAO 实现类 : 针对不同数据库给出DAO接口定义方法的具体实现 。
推荐阅读
- 云原生声明式数据库结构迁移工具 - SchemaHero
- 暗黑破坏神|《暗黑破坏神4》测试版或将上线 现已加入PS4/5数据库
- 数据库和后端有什么区别? 什么是数据库
- SpringBoot数据库管理 - 用flyway对数据库管理和迁移
- mysql数据库出现c乱码问题怎么解决?
- 数据库界的swagger,连接数据库直接生成数据库文档
- 数据库读写分离详解
- mysql数据库怎么查询数据库是否存在?
- 中兴|央视对话中兴:数据库为什么必须掌握在自己手里?
- mysql数据库的最大连接数怎么查询?