public class DAO {
// INSERT, UPDATE, DELETE 操作都可以包含在其中
public void update(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCTools.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.close(null, ps, conn);
} } // 查询一条记录, 返回对应的对象
public <T> T get(Class<T> clazz, String sql, Object... args) {
T entity = null;
// 1获取Connection
Connection conn = null;
// 2 获取PreparedStatement
PreparedStatement ps = null;
// 3填充占位符
ResultSet rs = null;
try {
conn = JDBCTools.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 4 进行查询得到rs
rs = ps.executeQuery();
// 5若 ResultSet中有记录,
// 准备一个MAP 键:存放列的别名,值:存放列的值
Map<String, Object> values = new HashMap<String, Object>();
// 6得到ResultSetMetaData对象
ResultSetMetaData rmsd = rs.getMetaData();
// 7处理ResultSet,把指针向下移动一个单位
if (rs.next()) {
// 8 由ResultSetMetaData 对象得到结果集中有多少列
for (int i = 0; i < rmsd.getColumnCount(); i++) {
// 9由ResultSetMetaData得到每一列的别名,由rs得到每一列的值
String columnLabel = rmsd.getColumnLabel(i + 1);
Object columnValue = rs.getObject(i + 1);
// 10 填充Map
values.put(columnLabel, columnValue);
} }
if (values.size() > 0) {
// 11 用反射创建Class对应的对象
entity = clazz.newInstance();
// 12 遍历Map对象,用反射填充对象的属性值:
// 属性名为Map中的key 属性值为Map中的value
for (Map.Entry<String, Object> map : values.entrySet()) {
String fieldName = map.getKey();
Object fieldValue = map.getValue();
BeanUtils.setProperty(entity, fieldName, fieldValue); } } } catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.close(rs, ps, conn);
} return entity; }
}
public class DAOTest {
DAO dao = new DAO(); @Test
public void testUpdate() {
String sql = "INSERT INTO customers(name,email,birth)VALUES(?,?,?)";
dao.update(sql, "XiaoWang", "XiaoWang@guigu.com", new Date(
new java.util.Date().getTime())); } @Test
public void testGet() {
String sql="SELECT flow_id flowId, type, id_card iDCard, "
+ "exam_card examCard, student_name studentName, "
+ "location, grade " + "FROM examstudent WHERE flow_id = ?";
Student stu=dao.get(Student.class, sql, 9);
System.out.println(stu);
}
}

转: https://blog.csdn.net/YL1214012127/article/details/48350107

Java_jdbc 基础笔记之十三 数据库连接(DAO)的更多相关文章

  1. Java_jdbc 基础笔记之二 数据库连接

    /** * DriverManager 类是驱动程序管理器类 * 1)可以通过重载的getConnection()方法获取数据库的连接,较为方便 * 2)可以同时管理多个驱动程序:若注册了多个数据库连 ...

  2. Java_jdbc 基础笔记之十一数据库连接 (通用的查询方法)

    鉴于之前的查询方法,在这里我们可以写一个通用的方法 /** * 鉴于 student.和customer查询的方法有好多相同之处,在此可以写一个通用的方法 */ public <T> T ...

  3. Java_jdbc 基础笔记之十 数据库连接 (ResultSetMetaData 类)

    ResultSetMetaData 类 调用ResultSet 的getMetaData()方法得到ResultSetMetaData 类对象: 可用于获取关于 ResultSet 对象中列的类型和属 ...

  4. Java_jdbc 基础笔记之九 数据库连接 (查询Customer对象的方法)

    /** * * 写一个查询Customer对象的方法 * */ public Customer getCustomer(String sql, Object... args) { Customer c ...

  5. Java_jdbc 基础笔记之一 数据库连接

    方式一: 1.创建一个Driver实现类的对象 2.准备连接数据库的基本信息:url,user,password 3.调用Driver接口的connect(url,info)获取数据库连接 * Dri ...

  6. Java_jdbc 基础笔记之十五 数据库连接(取得数据库自动生成的主键)

    public class testGetKeyValue { /** * 取得数据库自动生成的主键 */ @Test public void testGeneratedKeys() { Connect ...

  7. Java_jdbc 基础笔记之十四 数据库连接(元数据)数据库信息及连接信息

    public class MetaDatatest { /** * DatabaseMetaData 是描述 数据库的元数据对象 可以由Connection得到 */ @Test public voi ...

  8. Java_jdbc 基础笔记之十二 数据库连接 (beanutils )

    public class BeanUtilsTest { /** * Java 类的属性: * 1.在JavaEE中,Java类的属性通过getter,setter来定义: get,set方法,去除 ...

  9. Java_jdbc 基础笔记之八 数据库连接(写一个查询Student对象的方法)

    public Student getStudent(String sql, Object... args) { // 查询Student对象 Student stu = null; Connectio ...

随机推荐

  1. printf打印字节

    int i = 0; printf("buf:"); for(i = 0; i < sizeof(buf); i++) { printf("0x%x", ...

  2. Linux内核同步机制之completion

    内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种 ...

  3. 基于代理类实现Spring AOP

    目录 ProxyFactoryBean类介绍 基于JDK动态代理的Spring  AOP实现 基于CGLIB代理的Spring  AOP实现 Spring的通知类型 ProxyFactoryBean类 ...

  4. selenium窗口句柄以及对话框处理

    多窗口.句柄: 1.获取当前句柄:driver.current_window_handle 2.获取所有句柄:driver.window_handles 3.切换句柄:driver.switch_to ...

  5. (二)分布式数据库tidb-事务

    tidb既然是分布式数据库,所以它的事务应该可其它数据库事务有着不同的区别.我们来了解下tidb的数据库事务. (一)事物 1.几种数据库的默认隔离级别: tidb是乐观锁 (二)事务语句 TiDB ...

  6. java继承 、方法重写、重写toString方法

    1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...

  7. Kotlin字节码生成机制详尽分析

    通过注解修改Kotlin的class文件名: 对于Kotlin文件在编译之后生成的class文件名默认是有一定规则的,比如: 而其实这个生成字节码的文件名称是可以被改的,之前https://www.c ...

  8. 弹性盒模型:flex多行多列两端对齐,列不满左对齐

    [1]需求: [2]解决方案: 最近遇到布局上要求item两端对齐,且最后一行在列不满的情况下要求左对齐,使用flex的justify-content: space-between;实现时发现最后一行 ...

  9. 大数据之路week07--day07 (Hive结构设计以及Hive语法)

    Hive架构流程(十分重要,结合图进行记忆理解)当客户端提交请求,它先提交到Driver,Driver拿到这个请求后,先把表明,字段名拿出来,去数据库进行元数据验证,也就是Metasore,如果有,返 ...

  10. 为什么管理人员都喜欢用Visio画图

    一.形状数据一体化 这是管理者最喜欢的功能了,这也Visio的最核心的功能: 操作如下: 例如流程中的步骤.开始日期或结束日期.成本.设备部件等.数字.图标.颜色.标志和进度条等图形有助于快速方便地浏 ...