编写文件和步骤

①,bean模块:数据类Course,包含数据的class,封装数据类型;

②,DAO:1)定义对数据的操作接口,及规定标准(包含怎样的操作)。例如:CourseDAO数据库操作的接口标准;addCourse,updateCourse,deleteCourse等。

      2)定义BasicDAOImpl抽象类,包括数据库的基本操作:update增删改;getBean;getBeanList:查

      3)DAO:继承BasicDAOImpl,和CourseDAO,定义sql,具体实现接口中相应的方法

③,DataBase Connection: 从数据库连接池获取连接对象,关闭连接等操作。

测试代码,创建CourseDAO类对象,操作数据库

  1. package com.jdbc.tools.bean;
  2.  
  3. public class Course {
  4. private int id;
  5. private String course;
  6.  
  7. public Course() {
  8. }
  9.  
  10. public Course(int id, String course) {
  11. this.id = id;
  12. this.course = course;
  13. }
  14.  
  15. public int getId() {
  16. return id;
  17. }
  18.  
  19. public String getCourse() {
  20. return course;
  21. }
  22.  
  23. public void setId(int id) {
  24. this.id = id;
  25. }
  26.  
  27. public void setCourse(String course) {
  28. this.course = course;
  29. }
  30. }

public class Course

  1. package com.jdbc.tools;
  2.  
  3. import com.jdbc.tools.bean.Course;
  4.  
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.ParameterizedType;
  7. import java.lang.reflect.Type;
  8. import java.sql.*;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. public abstract class BasicDAOImpl <T> {
  13. //type代表T的实际类型
  14. private Class<T> type;
  15.  
  16. //在创建子类对象时,一定会调用父类构造器,默认调用父类无参构造
  17. public BasicDAOImpl(){
  18. //this是正在new的对象
  19. //clazz就是正在new对象的那个子类的类型的Class对象
  20. Class<? extends BasicDAOImpl> clazz = this.getClass();
  21. Type t=clazz.getGenericSuperclass();
  22. ParameterizedType pt=(ParameterizedType) t;
  23. Type[] types=pt.getActualTypeArguments();
  24. type= (Class) types[0];
  25. }
  26.  
  27. public int update(String sql, Object...args) throws SQLException {
  28. Connection conn = JDBCToolsV3.getConnection();
  29. PreparedStatement ps=conn.prepareStatement(sql);
  30. if(args!=null && args.length>0)
  31. {
  32. for (int i = 0; i <args.length ; i++) {
  33. ps.setObject(i+1,args[i]);
  34. }
  35. }
  36. int len=ps.executeUpdate();
  37. ps.close();
  38. return len;
  39. }
  40.  
  41. public T getBean(String sql,Object... args) throws SQLException, IllegalAccessException, InstantiationException, NoSuchFieldException {
  42. Connection conn = JDBCToolsV3.getConnection();
  43. PreparedStatement ps=conn.prepareStatement(sql);
  44. if(args!=null && args.length>0)
  45. {
  46. for (int i = 0; i <args.length ; i++) {
  47. ps.setObject(i+1,args[i]);
  48. }
  49. }
  50. //创建T的对象
  51. T t=type.newInstance();
  52. ResultSet set= ps.executeQuery();
  53. /*
  54. 结果集的元数据集(元数据,描述数据的数据,描述结果集中的数据的数据)
  55. 例如: 结果集记录的列数
  56. 结果集的字段列表
  57. */
  58. ResultSetMetaData metaData=ps.getMetaData();
  59. int count=metaData.getColumnCount();
  60.  
  61. if (set.next())
  62. {
  63. for (int i = 0; i <count ; i++) {
  64. Field field = type.getDeclaredField(metaData.getColumnName(i+1));
  65. field.setAccessible(true);
  66. field.set(t, set.getObject(i+1));
  67.  
  68. }
  69. }
  70. set.close();
  71. ps.close();
  72. return t;
  73. }
  74.  
  75. public List<T> getBeanList(String sql,Object... args) throws SQLException, IllegalAccessException, InstantiationException, NoSuchFieldException {
  76. Connection conn = JDBCToolsV3.getConnection();
  77. PreparedStatement ps=conn.prepareStatement(sql);
  78. if(args!=null && args.length>0)
  79. {
  80. for (int i = 0; i <args.length ; i++) {
  81. ps.setObject(i+1,args[i]);
  82. }
  83. }
  84. //创建T的对象
  85. List<T> list =new ArrayList<T>();
  86. ResultSet set= ps.executeQuery();
  87. /*
  88. 结果集的元数据集(元数据,描述数据的数据,描述结果集中的数据的数据)
  89. 例如: 结果集记录的列数
  90. 结果集的字段列表
  91. */
  92. ResultSetMetaData metaData=ps.getMetaData();
  93. int count=metaData.getColumnCount();
  94.  
  95. while (set.next())
  96. {
  97. T t=type.newInstance();
  98. for (int i = 0; i <count ; i++) {
  99. Field field = type.getDeclaredField(metaData.getColumnName(i+1));
  100. field.setAccessible(true);
  101. field.set(t, set.getObject(i+1));
  102.  
  103. }
  104. list.add(t);
  105. }
  106. set.close();
  107. ps.close();
  108. return list;
  109. }
  110. }

public abstract class BasicDAOImpl

  1. package com.jdbc.tools;
  2.  
  3. import com.jdbc.tools.bean.Course;
  4.  
  5. import java.util.List;
  6.  
  7. public interface CourseDAO {
  8. void addCourse(Course cou);
  9. void updateCourse(Course cou);
  10. void deleteCourse(int id);
  11. Course getId(int id);
  12. List<Course> getAll();
  13. }

public interface CourseDAO

  1. package com.jdbc.tools;
  2.  
  3. import com.jdbc.tools.bean.Course;
  4.  
  5. import java.sql.SQLException;
  6. import java.util.List;
  7.  
  8. public class CouseDAO extends BasicDAOImpl<Course> implements CourseDAO {
  9. @Override
  10. public void addCourse(Course cou) {
  11. String sql="INSERT INTO COURSE VALUES(NULL,?)";
  12. try {
  13. update(sql,cou.getCourse());
  14. } catch (SQLException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18.  
  19. @Override
  20. public void updateCourse(Course cou) {
  21. String sql="UPDATE COURSE SET COURSE=? WHERE ID=?";
  22. try{
  23. update(sql,cou.getCourse(),cou.getId());
  24. }catch (Exception e) {
  25. throw new RuntimeException(e);
  26. }
  27.  
  28. }
  29.  
  30. @Override
  31. public void deleteCourse(int id) {
  32. String sql="DELETE FROM COURSE WHERE ID=?";
  33. try{
  34. update(sql,id);
  35. }catch (Exception e) {
  36. throw new RuntimeException(e);
  37. }
  38.  
  39. }
  40.  
  41. @Override
  42. public Course getId(int id) {
  43. String sql="SELECT * FROM COURSE WHERE ID=?";
  44. Course t;
  45. try {
  46. t=getBean(sql,id);
  47. } catch (Exception e) {
  48. throw new RuntimeException(e);
  49. }
  50. return t;
  51. }
  52.  
  53. @Override
  54. public List<Course> getAll() {
  55. String sql="SELECT * FROM COURSE";
  56. List<Course> list=null;
  57. try{
  58. list=getBeanList(sql);
  59. }catch (Exception e) {
  60. throw new RuntimeException(e);
  61. }
  62.  
  63. return list;
  64. }
  65. }

public class CouseDAO extends BasicDAOImpl implements CourseDAO

  1. package com.jdbc.tools;
  2.  
  3. import com.alibaba.druid.pool.DruidDataSourceFactory;
  4.  
  5. import javax.sql.DataSource;
  6. import java.sql.Connection;
  7. import java.sql.SQLException;
  8. import java.util.Properties;
  9.  
  10. public class JDBCToolsV3 {
  11. private static DataSource ds;
  12. private static ThreadLocal<Connection> th;
  13. //静态代码块,创建数据库连接池
  14. static {
  15. try {
  16. Properties p=new Properties();
  17. p.load(JDBCToolsV3.class.getClassLoader().getResourceAsStream("druid.properties"));
  18. ds= DruidDataSourceFactory.createDataSource(p);
  19. th=new ThreadLocal<>();
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24.  
  25. public static Connection getConnection(){
  26. //方式1: DriverManger.getConnection();
  27. //方式2: 数据库连接池, ds.getConnection();
  28. try {
  29. Connection conn=th.get(); //获取当前线程的共享连接对象
  30. if(conn==null) //当前线程没有拿过连接,第一个获取连接
  31. {
  32. conn=ds.getConnection();//从线程池中哪一个新的
  33. th.set(conn); //放到当前线程共享变量中
  34. }
  35. return conn;
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. return null;
  39. }
  40.  
  41. }
  42.  
  43. public static void free( Connection conn){
  44. try {
  45. if(conn!=null)
  46. {
  47. conn.close();
  48. }
  49. } catch (SQLException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }

public class JDBCToolsV3

  1. package com.jdbc.tools;
  2.  
  3. import com.jdbc.tools.bean.Course;
  4. import org.junit.Test;
  5.  
  6. import java.util.List;
  7.  
  8. public class TestDAO {
  9. private CourseDAO dd=new CouseDAO();
  10. @Test
  11. public void test(){
  12. Course course=new Course();
  13. course.setId(99);
  14. course.setCourse("政治");
  15. dd.addCourse(course);
  16. dd.deleteCourse(9);
  17.  
  18. }
  19.  
  20. @Test
  21. public void test2(){
  22. Course d=dd.getId(1);
  23. System.out.println(d);
  24.  
  25. d.setCourse("微博");
  26. dd.updateCourse(d);
  27. }
  28.  
  29. @Test
  30. public void test3(){
  31. List<Course> all = dd.getAll();
  32. for (var c: all) {
  33. System.out.println(c.getId()+":"+c.getCourse());
  34. }
  35.  
  36. }
  37. }

public class TestDAO

  1. url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
  2. username=root
  3. password=123456
  4. driverClassName=com.mysql.cj.jdbc.Driver
  5. initialSize=10
  6. maxActive=20
  7. maxWait=1000

druid.properties

两个需要注意的问题:

JDBCToolsV3 :DAO的更多相关文章

  1. JavaWeb技术(二):DAO设计模式

    1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...

  2. 转账示例(一):Dao层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)

    缺点:Dao层面把Service层面的操作完成了,不利于后期的代码修改和重构 1.自行创建C3P0Util account数据库 2.jar包 3.Dao层面 接口: package com.lear ...

  3. SSH框架——(二)四层结构:DAO,Service,Controller,View层

    1. DAO层: 主要任务:做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此. DAO层的设计:首先是设计DAO层的接口,然后再Spring的配置文件中定义此接口的实现类,然后就可以在模块 ...

  4. 架构-数据库访问-SQL语言进行连接数据库服务器-DAO:DAO

    ylbtech-架构-数据库访问-SQL语言进行连接数据库服务器-DAO:DAO DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口,它显露了 Microsoft ...

  5. jdbc之二:DAO模式

    详细代码请参见 https://code.csdn.net/jediael_lu/daopattern 1.创建Dao接口. package com.ljh.jasonnews.server.dao; ...

  6. Mybatis框架三:DAO层开发、Mapper动态代理开发

    这里是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下来做到了简单的增删改查:http://www.cnblogs.com/xuyiqi ...

  7. Jtester+unitils+testng:DAO单元测试文件模板自动生成

    定位 本文适合于不愿意手工编写而想自动化生成DAO单元测试的筒鞋.成果是不能照搬的,但其中的"创建模板.填充内容.自动生成"思想是可以复用的.读完本文,可以了解 Python 读取 ...

  8. jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏

    详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database filter_conf; 2.创建表并插入数据 crea ...

  9. sping整合hibernate之二:dao层开发

     在上一篇日志中将hibernate的会话工厂sessionFactory注入到了spring的容器中,但这样还不够,因为hibernate的增删改查是要使用事务机制的, 所以还要在spring中配置 ...

随机推荐

  1. C#中检查null的语法糖

    今天看到已经更新了devblogs,新增的C# 11的!!(用于检查null的语法)经过非常长的讨论,最后取消了.然后我又想起来null检查,这个可以说一说. 函数参数null检查 传统写法 写一个函 ...

  2. javaScript中Math内置对象基本方法入门

    概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...

  3. [题解] 春荔(cut) | 贪心

    题目大意 有一个长度为 \(n\) 的非负整数序列 \(a_i\),每次可以选择一段区间减去 \(1\),要求选择的区间长度 \(\in[l,r]\),问最少多少次把每个位置减成 \(0\). 不保证 ...

  4. 3.Docker常用命令

    帮助启动类命令 启动docker: systemctl start docker 停止docker: systemctl stop docker 重启docker: systemctl restart ...

  5. 一图详解java-class类文件原理

    摘要:徒手制作一张超大的类文件解析图,方便通过浏览这个图能马上回忆起class文件的结构以及内部的指令. 本文分享自华为云社区<[读书会第十二期]这可能是全网"最大".&qu ...

  6. 设计并实现加法器类 Adder

    学习内容:设计并实现加法器类 Adder 代码示例: package 实验三; import java.util.Scanner; public class Adder { private int n ...

  7. Java实现飞机大战游戏

    飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行. 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类 我的飞机 MyPl ...

  8. Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)

    前言 Kitex是字节跳动内部的Golang微服务RPC框架,先已开源. Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/ ...

  9. vision transformer

    VIT 总览 Step1 Step2

  10. Java面试宝典学习笔记【2020】

    Java面试题总结 一.Java基础 1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能.Java保留了这个关键字但是没有使用 ...