在写jdbc的代码的时候一定有很多小伙伴困扰每写一次连接都要写重复的代码,这点不能体现java的封装性,那么我们能不能一步到位,每次连接数据库以及请求数据时我们只写一次,我接下来要写的内容就是关于jdbc的工具类,一劳永逸,不再吃jdbc的苦。
连接数据库
我们写jdbc的工具类的第一步就是要先写jdbc的一个连接方法,返回一个Connection对象。
这里用到了配置文件,java中有一个类Properties,他可以读取properties文件,这个文件我们一般放在src目录下
properties文件的内容是这样子的,大家可以根据自己的实际情况进行修改,注意一定要换行,每一行的后面不能存在空格!!!
在这里我们同时也用到了输入流来读取文件,以及用到了反射的知识内容,我们通过Class类中的getClassLoader()方法加载当前类,再通过ClassLoader类加载器得到对应文件的输入流。
public static Properties props = new Properties();
static {
InputStream resourceAsStream = JdbcUntil.class.getClassLoader().getResourceAsStream("db.properties");
try {
props.load(resourceAsStream); //加载文件
Class.forName(props.getProperty("driverClass")); //加载驱动
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static Connection getconnection() throws SQLException {
return DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"),props.getProperty("password"));
}
对数据的增删改
在这里用到了可变参数,就是下面的Object… params
public static int executeUpdate(String sql,Object... params){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = getconnection();
preparedStatement = connection.prepareStatement(sql);
if (params!=null && params.length>0) {
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i + 1,params[i]);
}
return preparedStatement.executeUpdate();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
close(null,preparedStatement,connection);
}
return 0;
}
对数据库的查
在使用的时候大家要注意了,数据库查出来的表上的属性名,要与传入的class对象的属性顺序与属性名一致;
private static <T> List<T> parseResuletset(ResultSet rs , Class<T> clazz) throws IllegalAccessException, InstantiationException, SQLException { //解析结果集
List<T> list = new ArrayList<>();
List<Field> fields = new ArrayList<>();
Class<? super T> superclass = clazz.getSuperclass();
Field[] declaredFields1 = superclass.getDeclaredFields();
Field[] declaredFields = clazz.getDeclaredFields();
Collections.addAll(fields,declaredFields1);
Collections.addAll(fields,declaredFields);
if (rs==null) return list;
while (rs.next()) {
T t = clazz.newInstance();
for (Field declaredField : fields) {
declaredField.setAccessible(true);
declaredField.set(t, rs.getObject(declaredField.getName()));
}
list.add(t);
}
return list;
}
public static <T> List<T> executeQuery(String sql,Class<T> clazz,Object... params){
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
conn = getconnection();
pst = conn.prepareStatement(sql);
if (params!=null && params.length>0){
for (int i = 0; i < params.length; i++) {
pst.setObject(i+1,params[i]);
}
}
rs = pst.executeQuery();
return parseResuletset(rs, clazz);
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}finally {
close(rs,pst,conn);
}
return null;
}
资源关闭
public static void close(ResultSet rs , PreparedStatement pst , Connection conn){
try {
if (rs!=null) rs.close();
if (pst != null) pst.close();
if (conn != null) conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}