DAO中方法实现

DAO类中方法的实现:




package com.example.dao;



import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.commons.beanutils.BeanUtils;


import com.atguigu.jdbc.tools.JDBCTools;
import com.atguigu.jdbc.tools.ReflectionUtils;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSetMetaData;


public class DAO {
//insert,update,delete操作都可以包含在其中
public void update(String sql,Object ... args){
Connection connection=null;
PreparedStatement preparedStatement=null;
try {

connection=JDBCTools.getconnection();

                        //PreparedStatement类的使用方法


preparedStatement=(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.release(connection, preparedStatement, null);
}
}
//查询一条记录,返回对应的对象
//假如是多条记录,但是也只是返回一条记录。


public <T>T get(Class<T>clazz,String sql,Object ...args){
/*1、获取connection
* 2、获取preparedstatement
* 3、填充占位符
* 4、进行查询,得到resultset
* 5、若resultset中有记录,准备一个map<String ,object>
* 键:存放列的别名 值:存放列的值
* 6、得到resultsetmetadata对象
* 7、处理resultset,把之中呢向下移动一个单位
* 8、由resultsetmdtadata对象得到结果集中有多少列:得到用多少列,得到label(别名)
* 9、由resultsetmetadata得到每一类的别名,由resultset得到具体

* 10、填充Map对象
* 11、用反射创建class对应对象。
* 12、遍历map对象,用反射填充对象的属性值
* 属性名为map中的key,属性值为map中value
*/
T entity=null;
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
//1、获取connection
connection=JDBCTools.getconnection();
//2、获取preparedstatement
preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
   //3、填充占位符
for(int i=0;i<args.length;++i){
preparedStatement.setObject(i+1, args[i]);
}
//4、进行查询,得到resultset
resultSet=preparedStatement.executeQuery();
//5、若resultset中有记录,准备一个map<String ,object>
// 键:存放列的别名 值:存放列的值
//如果有记录 
//7、处理resultset,把之中呢向下移动一个单位
if(resultSet.next()){
Map<String, Object> values=new HashMap<String,Object>();
   //6、得到resultsetmetadata对象
ResultSetMetaData rsmd=(ResultSetMetaData) resultSet.getMetaData();
  

//8、由resultsetmdtadata对象得到结果集中有多少列
int columnCount=rsmd.getColumnCount();

//9、由resultsetmetadata得到每一类的别名,由resultset得到具体
for(int i=0;i<columnCount;++i){
String columnLabel=rsmd.getColumnLabel(i+1);
Object columnValue=resultSet.getObject(i+1);
   //10、填充Map对象
values.put(columnLabel, columnValue);

}



// 11、用反射创建class对应对象。

entity=clazz.newInstance();


//12、遍历map对象,用反射填充对象的属性值
//属性名为map中的key,属性值为map中value
for(Map.Entry<String, Object> entry: values.entrySet()){
String propertyName=entry.getKey();
Object value=entry.getValue();


//ReflectionUtils.setFieldValue(entity, propertyName, value);
BeanUtils.setProperty(entity, propertyName, value);
}
}
} catch (Exception e) {
}finally{
JDBCTools.release(connection, preparedStatement, resultSet);
}

return entity;

}


//查询多条记录,返回对应的对象的集合
//当得到多条记录,多条记录将会被打印出来。

public <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 {
//1、获取connection
connection=JDBCTools.getconnection();
//2、获取preparedstatement
preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
   //3、填充占位符
for(int i=0;i<args.length;++i){
preparedStatement.setObject(i+1, args[i]);
}
//4、进行查询,得到resultset
resultSet=preparedStatement.executeQuery();


//5、准备一个List<Map<String,Object>>:
//键:存放列的别名,值:存放列的值,其中一个map对象对应着一条记录
//多个map对象就放在list集合中


List<Map<String,Object>>  values=new ArrayList<>();

ResultSetMetaData rsmd=(ResultSetMetaData) resultSet.getMetaData();

Map<String, Object> map=null;
//7、处理ResulSet,使用while循环
while(resultSet.next()){
//一个map记录了一条数据库表中记录,也就是一个对象。
map=new HashMap<>();

for(int i=0;i<rsmd.getColumnCount();++i){
String columnLabel=rsmd.getColumnLabel(i+1);
Object value=resultSet.getObject(i+1);
map.put(columnLabel, value);
}
//11、把填充好的Map对象,放在准备好的list集合中
//将map对象放在list集合中
values.add(map);
}

//12、判断list是否为空集合,若不为空
//则遍历list,得到一个一个map对象,再
//把一个map对象转换成一个class

//参数对应的object对象
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);
}
//13、把object对象放入到list中。
list.add(bean);

}
}
} catch (Exception e) {
}finally{
JDBCTools.release(connection, preparedStatement, resultSet);
}
return list;
}
//返回某条记录的某一个字段的值或一个统计的值(一共有多少条记录)
public <E>E getForValue(String sql,Object...args){
return null;
}

}


测试方法:

package com.example.dao;


import static org.junit.Assert.*;


import java.util.List;


import org.junit.Test;


import com.atguigu.jdbc.reviewtest.Student;


public class DAOTest {
DAO dao=new DAO();


    //只要是insert,update,delete语句都能放进来
@Test
public void testUpdate() {
String sql="INSERT INTO customers(customers_name,customers_email,customers_birth) VALUES(?,?,?)";
   dao.update(sql, "xiaoming","xinlang@com","2016-05-9");
}


@Test
public void testGet() {
//前面的字段名,后面的是别名

String sql="SELECT flow_Id flowId,TYPE TYPE,id_Card idCard,exam_Card examCard,student_Name studentname,location location,grade grade FROM examstudents where flow_Id=?";
   Student student=dao.get(Student.class, sql, 1);
   System.out.println(student);
}


@Test
public void testGetForList() {
String sql="SELECT flow_Id flowId,TYPE TYPE,id_Card idCard,exam_Card examCard,student_Name studentname,location location,grade grade FROM examstudents where flow_Id=?";
   List<Student> students=dao.getForList(Student.class, sql,1);
   System.out.println(students);
}


@Test
public void testGetForValue() {
fail("Not yet implemented");
}


}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值