JDBC工具类:给我一条SQL语句即可完成你想要的数据库操作

    科技2022-07-10  178

    SqlUtil

    一个自定义的jdbc工具类,自动帮我们完成数据库连接,数据池的建立,只需要通过配置文件,填写你的MySQL数据库连接信息,使用时给SQL语句即可完成对数据库的操作。 get操作读取数据库返回数据将转为实体类。

    可调用方法


    方法名入参返回类型--------说明---------addData()StringBoolean根据SQL语句添加数据库内容updateData()StringBoolean根据SQL语句更改数据库内容deleteData()StringBoolean根据SQL语句删除数据库内容getData()String ClassT根据SQL语句获取一个实体类getListData()String ClassList <T>根据SQL语句获取实体类列表getMap()String ClassMap根据SQL语句获取一个mapgetListMap()String ClassList <Map>根据SQL语句获取map列表

    使用示范

    特别需要注意的是泛型要保持一致。

    addData()

    SqlUtil<Person> sqlUtil = new SqlUtil<>(); String sql0 = "insert into person(person_id, name, sex) VALUES (5,'小红','女');"; sqlUtil.addData(sql0);


    updateData()

    String sql2 = "update person set name = '小红2' where person_id = '5';"; sqlUtil.updateData(sql2);


    deleteData()

    String sql3 = "delete from person where person_id = 5;"; sqlUtil.deleteData(sql3);


    getListData() 其中特别注意泛型<\T>与入参T.class要类型一致

    String sql4 = "select * from person;"; List<Person> datas = sqlUtil.getListData(sql4,Person.class); System.out.println("长度:"+datas.size()); personId, 1 name, 小明 sex, 男 personId, 2 name, 小李 sex, 男 长度:2

    getData() 返回一个实体类,效果与getlistData()类似。


    使用条件

    数据库建立应当符合数据库命名规范,如person_id。对应数据库的实体类应当符合属性命名规范,如personId。需要添加maven依赖(下文中详细介绍)

    使用说明

    链接(含工具及简单使用案例):https://pan.baidu.com/s/18Fm5113UZEmu5Rgm50qpgw 提取码:www

    添加依赖 在你项目的pom.xml的 中加入如下代码:

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency>

    更新maven,如何添加maven依赖很多教程,不再赘述。 其中com.google.guava用于下划线与驼峰间的转换, .

    配置文件 将百度云中项目的util中的的util中的两个类,以及dbcp.properties复制到你的项目中 在dbcp.properties中配置你的MySQL信息: 这样就可以使用此工具类了,不清楚如何使用的可详细看看百度云中的项目。


    可能的报错 . 1.报错

    报错: Cannot resolve plugin org.apache.maven.plugins:maven-resources-plugin:2.6

    参考: https://blog.csdn.net/csdn546229768/article/details/105680149/

    2.代码<>部分编译不通过 鼠标接触查看idea / eclipse更改意见,选择第一个有提示“7”的点击即可。

    3.配置文件显示红色 无需处理,不影响使用。


    源码(百度云中有)

    DbcpUtil.java

    package util; import org.apache.commons.dbcp2.BasicDataSourceFactory; import javax.sql.DataSource; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; public class DbcpUtil { private static Properties properties = new Properties(); private static DataSource dataSource; //加载DBCP配置文件 static{ try{ //注意这里需要使用绝对路径 FileInputStream is = new FileInputStream("src/main/resources/dbcp.properties"); properties.load(is); }catch(IOException e){ e.printStackTrace(); } //获取数据源对象 try{ dataSource = BasicDataSourceFactory.createDataSource(properties); }catch(Exception e){ e.printStackTrace(); } } //从连接池中获取一个连接 public static Connection getConnection(){ Connection connection = null; try{ connection = dataSource.getConnection(); }catch(SQLException e){ e.printStackTrace(); } return connection; } }

    SqlUtil.java

    package util; import com.google.common.base.CaseFormat; import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class SqlUtil<T> { //获取连接池 private static Connection conn = DbcpUtil.getConnection(); private static Statement st = getSt(); /** * 创建Statement实例 * @return */ private static Statement getSt() { try { return conn.createStatement(); } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * 添加数据库内容 * @param sql * @return */ public Boolean addData(String sql) { //SQL语句执行检测 int num = 0; try { num = st.executeUpdate(sql); } catch (SQLException throwables) { throwables.printStackTrace(); } if (num > 0) { //数据添加成功 return true; } return false; } /** * 修改数据库内容 * @param sql * @return */ public Boolean updateData(String sql) { //SQL语句执行检测 int num = 0; try { num = st.executeUpdate(sql); } catch (SQLException throwables) { throwables.printStackTrace(); } if (num > 0) { //数据添加成功 return true; } return false; } /** * 删除数据库内容 * @param sql * @return */ public Boolean deleteData(String sql) { //SQL语句执行检测 int num = 0; try { num = st.executeUpdate(sql); } catch (SQLException throwables) { throwables.printStackTrace(); } if (num > 0) { //数据添加成功 return true; } return false; } /** * 获取数据列表 * @param sql * @param cla * @return */ public List<T> getListData(String sql, Class cla) { try { //获取数据库结果集的数据表 ResultSet rs = st.executeQuery(sql); List<T> datas = new ArrayList<>(); while (rs.next()){ datas.add((T) mapToEntity( getAMap(rs,cla), cla)); } return datas; } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * 获取数据库内容,返回实体类 * @param sql * @param cla * @return */ public T getData(String sql, Class cla) { try { //获取数据库结果集的数据表 ResultSet rs = st.executeQuery(sql); if (rs.next()) { //map转实体类 T data = (T) mapToEntity( getAMap(rs,cla), cla); return data; } } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * 获取数据库内容,返回map * @param sql * @param cla * @return */ public Map<String, T> getMap(String sql, Class cla) { try { //获取数据库结果集的数据表 ResultSet rs = st.executeQuery(sql); if (rs.next()) { return getAMap(rs,cla); } } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * 获取数据列表,返回list<Map> * @param sql * @param cla * @return */ public List< Map<String, T> > getAllMap(String sql, Class cla) { try { //获取数据库结果集的数据表 ResultSet rs = st.executeQuery(sql); List<Map<String, T>> datas = new ArrayList<>(); while (rs.next()){ datas.add(getAMap(rs,cla)); } return datas; } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * 由ResultSet实例和指定的类型获取一个数据,返回map * @param rs * @param cla * @return */ private Map getAMap(ResultSet rs, Class cla) { try { //获取有关ResultSet对象中列的类型和属性的信息的对象 ResultSetMetaData md = rs.getMetaData(); //map对象储存属性名与值 Map<String, Object> map= new HashMap<>(); if (rs != null) { //获取数据库内容不为空 // System.out.println("edu.njxjc.manager.util.SqlUtil.getAData: 进入查询"); for (int i = 1; i <= md.getColumnCount(); i++) { //遍历rs中的属性与值 //下划线改驼峰 String columnName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, md.getColumnName(i)); Object values = rs.getObject(md.getColumnName(i)); // System.out.println("edu.njxjc.manager.util.SqlUtil.getAData:"+columnName+", " +values); //写入属性名,值 map.put(columnName, values ); } } return map; } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } /** * Map转实体类 * @param map 需要初始化的数据,key字段必须与实体类的成员名字一样,否则赋值为空 * @param entity 需要转化成的实体类 * @return */ private T mapToEntity(Map<String, Object> map, Class<T> entity) { T t = null; try { t = entity.newInstance(); for (Field field : entity.getDeclaredFields()) { if (map.containsKey(field.getName())) { boolean flag = field.isAccessible(); field.setAccessible(true); Object object = map.get(field.getName()); if (object != null && field.getType().isAssignableFrom(object.getClass())) { field.set(t, object); } field.setAccessible(flag); } } return t; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return t; } }

    dbcp.properties

    ######## DBCP配置文件 ########## # 驱动名 driverClassName=com.mysql.cj.jdbc.Driver # url url=jdbc:mysql://***.***.**.***:3306/myDB?useUnicode=true&characterEncoding=utf-8 # 用户名 username=myuser # 密码 password=123456 # 初始连接数 initialSize=30 # 最大活跃数 maxTotal=30 # 最大空闲数 maxIdle=10 # 最小空闲数 minIdle=5 # 最长等待时间(毫秒) maxWaitMillis=1000 # 程序中的连接不使用后是否被连接池回收(该版本要使用removeAbandonedOnMaintenance和removeAbandonedOnBorrow) # removeAbandoned=true removeAbandonedOnMaintenance=true removeAbandonedOnBorrow=true # 连接在所指定的秒数内未使用才会被删除(秒) removeAbandonedTimeout=100
    Processed: 0.044, SQL: 8