DAO中方法实现
2015-10-14 16:37
302 查看
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");
}
}
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");
}
}
相关文章推荐
- C++ vector
- Windows下编译VLC2.2.1 ---CygWin环境
- Android使用http协议与服务器通信
- 使用HttpClient接口实现网络通信
- ExtJs Grid自动生成列
- 如何解决listview/gridview的position=0时,getview被多次调用
- 使用canvas与Paint在View中居中绘制文字
- C++Primer第五版 第11章 关联容器(练习解答)
- git的使用(转)
- ios APP审核加速上架服务
- 调用windows讲述人播放语音
- 如何更新Android SDK
- Android开源项目xUtils HttpUtils模块分析
- 最棒的Twisted入门教程
- 关于如何选择sphinx4和pocketsphinx和一些其他问题
- make和gdb的简单应用
- 如何修改Tomcat服务器Server Locations .
- Android Studio生成Jni头文件的方法
- 面向对象-------虚函数学习
- mysql cmake参数详解