自定义对象转换接口实现JDBC的封装

  • com.bennett.model;
  • com.bennett.dao
  • com.bennett.util
  • com.bennett.dao.test

项目名:StudentManager7

com.bennett.model;

package com.bennett.model;
import java.util.Date;
/*** @Version:1.0 * @Description:SM-7*                对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
public class Student {private int id;private String name;private Date birthday;public Student() {}public Student(int id, String name, Date birthday) {super();this.id = id;this.name = name;this.birthday = birthday;}@Overridepublic String toString() {return "id=" + id + " name=" + name + " birthday=" + birthday;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (id != other.id)return false;return true;}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 Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}

com.bennett.dao

package com.bennett.dao;
import java.util.List;
import com.bennett.model.Student;
/*** @Version:1.0 * @Description:SM-7*                对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
public interface StudentDao {boolean add(Student student);boolean delete(int id);boolean update(Student student);Student get(int id);List<Student> getAll();
}
package com.bennett.dao;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;import com.bennett.model.Student;
import com.bennett.util.JdbcUtil;
import com.bennett.util.RowMapper;/*** @Version:1.0 * @Description:SM-7*              对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
public class StudentImplJdbc implements StudentDao,RowMapper<Student> {private JdbcUtil<Student> jdbcUtil =new JdbcUtil<>();@Overridepublic boolean add(Student student) {String sql="insert into student"+ " (id, name, birthday)"+ " values"+ " (?,?,?)";return jdbcUtil.executeUpdate(sql,student.getId(), student.getName(),student.getBirthday())==1;        }@Overridepublic boolean delete(int id) {String sql="delete student"+ " where id = ?";return jdbcUtil.executeUpdate(sql,id)==1;       }@Overridepublic boolean update(Student student) {String sql="update student"+ " set name = ?,"+ " birthday = ?"+ " where id = ?";return jdbcUtil.executeUpdate(sql,student.getName(),student.getBirthday(),student.getId())==1;      }// @Override
//  public Student get(int id) {//      String sql="select id, name, bitthday from student"
//              + " where id = ?";
//      return jdbcUtil.findOne(sql, this, id);
        return jdbcUtil.findOne(sql, new RowMapper<Student>() {
            @Override
            public Student row2Object(ResultSet rs) {                try {                    return new Student(
                            rs.getInt("id"),
                            rs.getString("name"),
                            rs.getDate("bitthday")
                            );
                } catch (SQLException e) {                    e.printStackTrace();
                }
                return null;
            }
        }, id);
//  }@Overridepublic List<Student> getAll() {String sql="select id, name, birthday from student"+ " order by id";return jdbcUtil.findList(sql, this);
//      return jdbcUtil.findList(sql, (rs)->{//          try {//              return new Student(
//                      rs.getInt("id"),
//                      rs.getString("name"),
//                      rs.getDate("bitthday")
//                      );
//          } catch (SQLException e) {//              e.printStackTrace();
//          }
//          return null;
//      });}@Overridepublic Student row2Object(ResultSet rs) {try {return new Student(rs.getInt("id"),rs.getString("name"),rs.getDate("birthday"));} catch (SQLException e) {e.printStackTrace();}return null;}@Overridepublic Student get(int id) {String sql="select id, name, birthday from student"+ " where id = ?";return jdbcUtil.findOne(sql, Student.class, id);}
}
//class StudentRowMaper implements RowMapper<Student>{//
//  @Override
//  public Student row2Object(ResultSet rs) {//      try {//          return new Student(
//                  rs.getInt("id"),
//                  rs.getString("name"),
//                  rs.getDate("bitthday")
//          );
//      } catch (SQLException e) {//          e.printStackTrace();
//      }
//      return null;
//  }
//
//}

com.bennett.util

package com.bennett.util;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
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.LinkedList;
import java.util.List;
import java.util.Properties;
/*** @Version:1.0 * @Description:SM-7*                对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
public class JdbcUtil<T> {private static Connection connection;static {try {String diverClassName="oracle.jdbc.driver.OracleDriver";Class.forName(diverClassName);} catch (ClassNotFoundException e) {e.printStackTrace();}}private Connection getConnection()  {try {if(connection==null || connection.isClosed()) {String url="jdbc:oracle:thin:@localhost:1521:xe";Properties info=new Properties();info.load(new FileReader("db.properties"));connection=DriverManager.getConnection(url, info);}} catch (SQLException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return connection;}public int executeUpdate(String sql,Object...params){try {PreparedStatement statement = getConnection().prepareStatement(sql);for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}int result = statement.executeUpdate();statement.close();return result;} catch (SQLException e) {e.printStackTrace();}return -1;}public List<T> findList(String sql,RowMapper<T> rowMapper, Object...params){try(PreparedStatement statement = getConnection().prepareStatement(sql);) {for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}ResultSet rs = statement.executeQuery();List<T> list=new LinkedList<T>();while (rs.next()) {list.add(rowMapper.row2Object(rs));}return list;} catch (SQLException e) {e.printStackTrace();}return null;}public T findOne(String sql,RowMapper<T> rowMapper,Object...params){try(PreparedStatement statement = getConnection().prepareStatement(sql);) {for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}ResultSet rs = statement.executeQuery();if(rs.next()) {return rowMapper.row2Object(rs);}} catch (SQLException e) {e.printStackTrace();}return null;}public T findOne(String sql,Class<T> klazz,Object...params){try(PreparedStatement statement = getConnection().prepareStatement(sql);) {for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}ResultSet rs = statement.executeQuery();if(rs.next()) {ResultSetMetaData metaData = rs.getMetaData();int columnCount = metaData.getColumnCount();T result=klazz.newInstance();for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnName(i).toLowerCase();Field field = klazz.getDeclaredField(columnName);field.setAccessible(true);System.out.println(metaData.getColumnTypeName(i));System.out.println(metaData.getColumnType(i));switch (metaData.getColumnType(i)) {case java.sql.Types.NUMERIC:field.set(result, rs.getInt(i));break;case java.sql.Types.VARCHAR:field.set(result, rs.getString(i));break;case java.sql.Types.DATE:field.set(result, rs.getDate(i));break;default:field.set(result, rs.getObject(i));break;}}return result;}} catch (SQLException e) {e.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}
}
package com.bennett.util;
import java.sql.ResultSet;
/*** @Version:1.0 * @Description:SM-7*                对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
public interface RowMapper<T> {T row2Object(ResultSet rs);
}

com.bennett.dao.test

package com.bennett.dao.test;import static org.junit.jupiter.api.Assertions.*;import java.sql.Date;
import java.util.List;import org.junit.jupiter.api.Test;import com.bennett.model.Student;
/*** @Version:1.0 * @Description:SM-7*                对象关系映射(ORM)* @Author: bennett* @Date: 2021年10月22日 下午2:17:32*/
class StudentImplJdbcTest {private StudentDao studentDao = new StudentImplJdbc();@Testvoid testAdd() {assertTrue(studentDao.add(new Student(1002, "李广", Date.valueOf("2003-3-3"))));assertTrue(studentDao.add(new Student(1003, "张恒", Date.valueOf("2003-3-3"))));assertTrue(studentDao.add(new Student(1004, "郭开", Date.valueOf("2003-3-3"))));}@Testvoid testDelete() {assertTrue(studentDao.delete(1004));}@Testvoid testUpdate() {assertTrue(studentDao.update(new Student(1004, "李渊", Date.valueOf("2005-3-3"))));}@Testvoid testGetAll() {List<Student> results = studentDao.getAll();for (Student student : results) {System.out.println(student);}}@Testvoid testRow2Object() {fail("Not yet implemented");}@Testvoid testGet() {System.out.println(studentDao.get(1001));}
}

自定义对象转换接口实现JDBC的封装相关推荐

  1. Java调用存储过程(返回:简单类型VARCHAR、自定义对象STRUCT、列表数组VARRAY)

    ORACLE 存储过程 练习七 数组专题 写在前面的废话 由于工作需要经常用到 ORACLE存储过程 其中数组是不可避免的一组成元素.那么让我们来体会一下 ORACLE存储过程的数组到低是如何使用的. ...

  2. JavaScript实现创建自定义对象的常用方式总结

    2019独角兽企业重金招聘Python工程师标准>>> 1. 对象字面量方式 对象字面量方式是创建自定义对象的首选模式,简单方便. var per = { name:'zhangsa ...

  3. vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

    一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的 ...

  4. 前端:JS/22/函数(函数的概念,函数的定义格式,函数定义格式的说明,函数的调用,函数的参数),全局变量和局部变量,拷贝传值和引用传址,匿名函数,二维数组,对象,自定义对象的创建

    函数 1,函数的概念 函数,是将一段公共的代码进行封装,给它起个名字叫"函数" 函数可以一次定义,多次调用:函数可以将常用的功能代码,进行封装,如:用户名的验证,验证码函数,邮箱验 ...

  5. JavaScript学习笔记:创建自定义对象

    文章目录 一.利用构造函数模式创建自定义对象 二.采用原型模式创建自定义对象 三.采用混合模式创建自定义对象 四.采用动态原型模式创建自定义对象 一.利用构造函数模式创建自定义对象 使用构造函数可以创 ...

  6. JavaScript--->内置对象自定义对象*笔记

    <!DOCTYPE html> <html><head><meta charset="utf-8"><meta name=&q ...

  7. JDBC、封装JDBC连接池、第三方连接池工具

    主要内容: JDBC简介 JDBC来源 通过代码实现JDBC JDBC的改进需求 JDBC改进的代码实现 JDBC使用的设计模式 封装连接池 封装JDBC连接池 ThreadLoacl的使用 Thre ...

  8. 【 js基础 Day4】面向过程,面向对象,自定义对象,内置对象

    01 复习 函数:把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 函数作用:代码重用 函数的参数: 1.形参:函数定义的时候,函数名字后面的小括号里的变量 2.实参:函数调 ...

  9. commons-pool2自定义对象池-快速开始

    文章目录 一.什么是commons-pool2 1. springboot使用commons-pool2实现对象池 二.常用API 1. GenericObjectPool 2. PooledObje ...

  10. JavaScript 的自定义对象 、内置对象、 浏览器对象(window对象以及子对象)、Dom对象

    JS 中的 Object从本质上看,Object 是一个构造函数,用于创建对象. console.dir(Object); //ƒ Object() var obj = new Object(1); ...

最新文章

  1. schema.sql自动写入。由于版本问题。2.x之后。就不行了。·
  2. Android性能优化之虚拟机调优
  3. Java 获取当前时间
  4. VB6.0连接MySQL数据库
  5. python enumeration_python模块之enum_上
  6. .Net/C#分库分表高性能O(1)瀑布流分页
  7. 引入antd组件样式_个人作品:一个技术栈koa2+ mysql+react + antd的个人博客
  8. 2017.8.17实操总结
  9. “苹果税”收的太过分!苹果被连罚9周,总金额超3亿
  10. 路科验证示例_角度形式验证示例
  11. CentOS 6.5下安装MySQL后重置root密码方法
  12. SpringSecurity之权限管理
  13. IT自动化运维平台建设解决方案
  14. windows/ubuntu系统下安装teamview教程
  15. 用递归调用函数来把存在父子级别的数据封装成一个树状结构
  16. 初次Blender建模遇到的问题与解决方法
  17. 概要设计说明书的书写
  18. 了解5G技术与未来5G面临的问题
  19. 电阻电路的等效变化(Ⅰ)
  20. barrier()函数

热门文章

  1. 算法基础篇-05-排序-LowB三人组(冒泡/选择/插入排序)
  2. BZOJ3772精神污染——可持久化线段树+出栈入栈序
  3. 数据结构 第2版 第二版 陈越_高中数学选学---人教A版选修2-1第二章第二节椭圆...
  4. LeetCode剑指offer题目分类汇总及题解
  5. python矩阵计算器心得_NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具...
  6. 治疗骨髓增殖性肿瘤的一种新型高选择性酪氨酸激酶抑制剂ZT55的研究
  7. 场景图生成论文阅读笔记 之 PCPL
  8. vue中使用市区(地区)联动 复制三步完成
  9. java 移动短代支付_运营商支付/短代支付的市场前景如何?
  10. win7 mysql 管理员权限_win7 管理员权限