在公司开发项目(ssh框架)的时候,我特别烦躁的一点就是每次用jdbc方式写一个数据访问(hibernate 可以用但是个人觉得对于复杂查询难以做到和好的控制,可能自己还要慢慢研究吧,自己喜欢mybatis),每次都要写一大堆模板代码,比较繁琐!
下面说下我的思路。
从已有的代码,出发会发现,访问数据库的套路
-->读取配置文件(不是必须的,但是项目中这样做,当然可以tomcat配置数据源之类的啊)
-->获取Connection
-->获取statement或者preparestatement
--->编写你的sql(这里说一下,如果你用的statement这里直接凭借字符,如果用的preparestatement就是设置参数,以后的sql语句最好不要用statement,因为他很不安全!!一个很大的问题的sql注入!no zuo no die!)
-->执行sql命令
-->封装结果
-->返回数据
所以,抽象出来,需要做的是
1.抽象出执行查询和执行更新(update,insert,delete)
2.抽象结果处理
主要完成的就是着两个问题
1.sql执行方法
/**
* 执行sql
* @param sql sql文
* @param params 参数
* @return
*/
public static boolean executeSQL(String sql,String...params){
boolean flag = false;
Connection connection = null;
PreparedStatement statement = null;
try {
connection = getConnection();
statement = connection.prepareStatement(sql);
for(int i = 0,n = params.length;i
* 查询结果
* @param sql sql文
* @param params 参数
* @param handler 结果处理集
* @return 返回结果集
*/
public static List> queryResult(String sql,String[] params,ResultMapper handler,Class c){
List
package com.handkoo.dao;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
public class DButils {
private static final Logger logger = LoggerFactory.getLogger(DButils.class);
private static String url = "";
private static String user = "";
private static String password = "";
static {
InputStream inputStream = DButils.class.getResourceAsStream("/jdbc.properties");
Properties properties = new Properties();
try {
properties.load(inputStream);
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
/**
* 执行sql
*
* @param sql
* sql文
* @param params
* 参数
* @return
*/
public static boolean executeSQL(String sql, String... params) {
boolean flag = false;
Connection connection = null;
PreparedStatement statement = null;
try {
connection = getConnection();
statement = connection.prepareStatement(sql);
for (int i = 0, n = params.length; i < n; i++) {
statement.setString(i + 1, params[i]);
}
statement.execute(sql);
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 查询结果
*
* @param sql
* sql文
* @param params
* 参数
* @param handler
* 结果处理集
* @return 返回结果集
*/
public static List> queryResult(String sql, String[] params, ResultMapper handler, Class c) {
List
调用方式:
DButils.queryResult(sql, null, new DButils().new DefaultMapper(), FitType.class);
注意:该工具类有一个局限性,就是对应的java类的属性名称需要与数据库的名称一致才能匹配。(如果这样,还需要配置xml文件来建立实体类和数据库表之间的映射,这不在考虑的范围之内,建议使用mybatis)
以上就是我全部的分析内容了,有的地方还需要完善。