DAO:data Access Object:訪問數據信息的類
操作java類屬性有一個工具包:beanuitls
同時在libraries中加入:commons-beanuitls-1.8.0.jar和commons-logging-1.1.1.jar包
User類如下:
public class User {
private int id;
private String name;
private String pwd;
private String sex;
private String home;
private String info;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", sex='" + sex + '\'' +
", home='" + home + '\'' +
", info='" + info + '\'' +
'}'+"\n";
}
public User() {
}
public User(int id, String name, String pwd, String sex, String home, String info) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.sex = sex;
this.home = home;
this.info = info;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHome() {
return home;
}
public void setHome(String home) {
this.home = home;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
編寫的ReflectionUtils工具類:
public class ReflectionUtils {
//把屬性名首字符轉爲大寫
public static String StringUtils(String str) {
if(str==null||"".equals(str)) {
return str;
}
if(str.length()==1) {
return str.toUpperCase();
}else {
return str.substring(0, 1).toUpperCase()+str.substring(1);
}
}
/**
* 實例化對象創建方法,該對象可以根據傳入的字符串結構
* 要進行反射的Class類對象,有Class就可以實例化對象
*/
public static <T> T setFieldValue(Object object,String fieldName,Object fieldValue) {
try {//相當於實例化對象
Object obj = object;
// BeanUtils.setValue(obj, value);//通過反射設置屬性
Field field = obj.getClass().getDeclaredField(fieldName);
Method setMethod = obj.getClass().getDeclaredMethod("set"+StringUtils(fieldName), field.getType());
setMethod.invoke(obj, fieldValue);
return (T) obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
編寫的具體實現DAO的類:
public class DAOTest {
//insert ,delete,update操作都可以包含其中
public static void update(String sql, Object... args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseSource(null, preparedStatement, connection);
}
}
//查詢一條記錄返回對應的對象
public static <T> T get(Class<T> clazz, String sql, Object... args) {
T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//獲取連接
connection = JDBCTools.getConnection();
//獲取preparedStatement對象
preparedStatement = connection.prepareStatement(sql);
//填充佔位符
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
//進行查詢
resultSet = preparedStatement.executeQuery();
//如果有記錄進行如下操作
if (resultSet.next()) {
//創建Map
Map<String, Object> values = new HashMap<>();
//得到ResultSetMetaData對象
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
//獲取別名和值
for (int i = 0; i < columnCount; i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object column = resultSet.getObject(columnLabel);
values.put(columnLabel, column);
}
//用反射創建對象
entity = clazz.newInstance();
//遍歷map對象用反射填充值
for (Map.Entry<String, Object> entry : values.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();
//用自己寫的Utils來傳參數設置屬性
// ReflectionUtils.setFieldValue(entity,propertyName,value);
//調用BeanUtils設置屬性
BeanUtils.setProperty(entity, propertyName, value);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseSource(resultSet, preparedStatement, connection);
}
return entity;
}
//查詢多條信息返回list
public static <T> List<T> getForList(Class<T> clazz, String sql, Object... args) {
List<T> list = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//連接得到prepared Statement對象
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
//填充佔位符
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i+1,args[i]);
}
//創建多個Map對象
List<Map<String, Object>> values = new ArrayList<>();
//獲取ResultSet
resultSet = preparedStatement.executeQuery();
//獲得MetaData
ResultSetMetaData rsmd = resultSet.getMetaData();
Map<String, Object> map = null;
//循環獲得數據
while (resultSet.next()) {
map = new HashMap<>();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object column = resultSet.getObject(i + 1);
map.put(columnLabel, column);
}
values.add(map);
}
//判斷集合中是否存在數據
T bean = null;
if (values.size() > 0) {
for (Map<String, Object> m : values) {
bean = clazz.newInstance();
for (Map.Entry<String, Object> entry : m.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();
//創建對象
BeanUtils.setProperty(bean, propertyName, value);
}
//把Object 對象放入list中
list.add(bean);
}
}
} catch (Exception e) {
} finally {
JDBCTools.releaseSource(resultSet, preparedStatement, connection);
}
return list;
}
//返回某條記錄某個字段的值或一個統計的值
public static <E> E getForValue(String sql, Object... args) {
//得到結果集
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//連接得到prepared Statement對象
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
//填充佔位符
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
//獲取ResultSet
resultSet = preparedStatement.executeQuery();
//
if(resultSet.next()){
return (E) resultSet.getObject(1);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCTools.releaseSource(resultSet,preparedStatement,connection);
}
return null;
}
}
具體測試方法:
public class TestDao {
@Test
public void testUpdata(){
String sql="insert into user(name,pwd,sex,home,info) values(?,?,?,?,?)";
DAOTest.update(sql,"Hew","123456","man","shanghai","test");
}
@Test
public void testGet(){
String sql="select id id, name name,pwd pwd, sex sex, " +
"home home, info info from user where id=?";
User user=DAOTest.get(User.class,sql,11);
System.out.println(user);
}
@Test
public void testList(){
String sql="select id id, name name,pwd pwd, sex sex, home home, info info from user;";
List<User> user=DAOTest.getForList(User.class,sql);
System.out.println(user);
}
@Test
public void testValue(){
String sql="select pwd from user where id= ?";
String pwd=DAOTest.getForValue(sql,7);
System.out.println(pwd);
sql="select max(id) from user";
int max=DAOTest.getForValue(sql);
System.out.println(max);
}
}