JDBCToolsV3 :DAO
编写文件和步骤
①,bean模块:数据类Course,包含数据的class,封装数据类型;
②,DAO:1)定义对数据的操作接口,及规定标准(包含怎样的操作)。例如:CourseDAO数据库操作的接口标准;addCourse,updateCourse,deleteCourse等。
2)定义BasicDAOImpl抽象类,包括数据库的基本操作:update增删改;getBean;getBeanList:查
3)DAO:继承BasicDAOImpl,和CourseDAO,定义sql,具体实现接口中相应的方法
③,DataBase Connection: 从数据库连接池获取连接对象,关闭连接等操作。
测试代码,创建CourseDAO类对象,操作数据库
- package com.jdbc.tools.bean;
- public class Course {
- private int id;
- private String course;
- public Course() {
- }
- public Course(int id, String course) {
- this.id = id;
- this.course = course;
- }
- public int getId() {
- return id;
- }
- public String getCourse() {
- return course;
- }
- public void setId(int id) {
- this.id = id;
- }
- public void setCourse(String course) {
- this.course = course;
- }
- }
public class Course
- package com.jdbc.tools;
- import com.jdbc.tools.bean.Course;
- import java.lang.reflect.Field;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.sql.*;
- import java.util.ArrayList;
- import java.util.List;
- public abstract class BasicDAOImpl <T> {
- //type代表T的实际类型
- private Class<T> type;
- //在创建子类对象时,一定会调用父类构造器,默认调用父类无参构造
- public BasicDAOImpl(){
- //this是正在new的对象
- //clazz就是正在new对象的那个子类的类型的Class对象
- Class<? extends BasicDAOImpl> clazz = this.getClass();
- Type t=clazz.getGenericSuperclass();
- ParameterizedType pt=(ParameterizedType) t;
- Type[] types=pt.getActualTypeArguments();
- type= (Class) types[0];
- }
- public int update(String sql, Object...args) throws SQLException {
- Connection conn = JDBCToolsV3.getConnection();
- PreparedStatement ps=conn.prepareStatement(sql);
- if(args!=null && args.length>0)
- {
- for (int i = 0; i <args.length ; i++) {
- ps.setObject(i+1,args[i]);
- }
- }
- int len=ps.executeUpdate();
- ps.close();
- return len;
- }
- public T getBean(String sql,Object... args) throws SQLException, IllegalAccessException, InstantiationException, NoSuchFieldException {
- Connection conn = JDBCToolsV3.getConnection();
- PreparedStatement ps=conn.prepareStatement(sql);
- if(args!=null && args.length>0)
- {
- for (int i = 0; i <args.length ; i++) {
- ps.setObject(i+1,args[i]);
- }
- }
- //创建T的对象
- T t=type.newInstance();
- ResultSet set= ps.executeQuery();
- /*
- 结果集的元数据集(元数据,描述数据的数据,描述结果集中的数据的数据)
- 例如: 结果集记录的列数
- 结果集的字段列表
- */
- ResultSetMetaData metaData=ps.getMetaData();
- int count=metaData.getColumnCount();
- if (set.next())
- {
- for (int i = 0; i <count ; i++) {
- Field field = type.getDeclaredField(metaData.getColumnName(i+1));
- field.setAccessible(true);
- field.set(t, set.getObject(i+1));
- }
- }
- set.close();
- ps.close();
- return t;
- }
- public List<T> getBeanList(String sql,Object... args) throws SQLException, IllegalAccessException, InstantiationException, NoSuchFieldException {
- Connection conn = JDBCToolsV3.getConnection();
- PreparedStatement ps=conn.prepareStatement(sql);
- if(args!=null && args.length>0)
- {
- for (int i = 0; i <args.length ; i++) {
- ps.setObject(i+1,args[i]);
- }
- }
- //创建T的对象
- List<T> list =new ArrayList<T>();
- ResultSet set= ps.executeQuery();
- /*
- 结果集的元数据集(元数据,描述数据的数据,描述结果集中的数据的数据)
- 例如: 结果集记录的列数
- 结果集的字段列表
- */
- ResultSetMetaData metaData=ps.getMetaData();
- int count=metaData.getColumnCount();
- while (set.next())
- {
- T t=type.newInstance();
- for (int i = 0; i <count ; i++) {
- Field field = type.getDeclaredField(metaData.getColumnName(i+1));
- field.setAccessible(true);
- field.set(t, set.getObject(i+1));
- }
- list.add(t);
- }
- set.close();
- ps.close();
- return list;
- }
- }
public abstract class BasicDAOImpl
- package com.jdbc.tools;
- import com.jdbc.tools.bean.Course;
- import java.util.List;
- public interface CourseDAO {
- void addCourse(Course cou);
- void updateCourse(Course cou);
- void deleteCourse(int id);
- Course getId(int id);
- List<Course> getAll();
- }
public interface CourseDAO
- package com.jdbc.tools;
- import com.jdbc.tools.bean.Course;
- import java.sql.SQLException;
- import java.util.List;
- public class CouseDAO extends BasicDAOImpl<Course> implements CourseDAO {
- @Override
- public void addCourse(Course cou) {
- String sql="INSERT INTO COURSE VALUES(NULL,?)";
- try {
- update(sql,cou.getCourse());
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void updateCourse(Course cou) {
- String sql="UPDATE COURSE SET COURSE=? WHERE ID=?";
- try{
- update(sql,cou.getCourse(),cou.getId());
- }catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- @Override
- public void deleteCourse(int id) {
- String sql="DELETE FROM COURSE WHERE ID=?";
- try{
- update(sql,id);
- }catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- @Override
- public Course getId(int id) {
- String sql="SELECT * FROM COURSE WHERE ID=?";
- Course t;
- try {
- t=getBean(sql,id);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return t;
- }
- @Override
- public List<Course> getAll() {
- String sql="SELECT * FROM COURSE";
- List<Course> list=null;
- try{
- list=getBeanList(sql);
- }catch (Exception e) {
- throw new RuntimeException(e);
- }
- return list;
- }
- }
public class CouseDAO extends BasicDAOImpl implements CourseDAO
- package com.jdbc.tools;
- import com.alibaba.druid.pool.DruidDataSourceFactory;
- import javax.sql.DataSource;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.util.Properties;
- public class JDBCToolsV3 {
- private static DataSource ds;
- private static ThreadLocal<Connection> th;
- //静态代码块,创建数据库连接池
- static {
- try {
- Properties p=new Properties();
- p.load(JDBCToolsV3.class.getClassLoader().getResourceAsStream("druid.properties"));
- ds= DruidDataSourceFactory.createDataSource(p);
- th=new ThreadLocal<>();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static Connection getConnection(){
- //方式1: DriverManger.getConnection();
- //方式2: 数据库连接池, ds.getConnection();
- try {
- Connection conn=th.get(); //获取当前线程的共享连接对象
- if(conn==null) //当前线程没有拿过连接,第一个获取连接
- {
- conn=ds.getConnection();//从线程池中哪一个新的
- th.set(conn); //放到当前线程共享变量中
- }
- return conn;
- } catch (SQLException e) {
- e.printStackTrace();
- return null;
- }
- }
- public static void free( Connection conn){
- try {
- if(conn!=null)
- {
- conn.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
public class JDBCToolsV3
- package com.jdbc.tools;
- import com.jdbc.tools.bean.Course;
- import org.junit.Test;
- import java.util.List;
- public class TestDAO {
- private CourseDAO dd=new CouseDAO();
- @Test
- public void test(){
- Course course=new Course();
- course.setId(99);
- course.setCourse("政治");
- dd.addCourse(course);
- dd.deleteCourse(9);
- }
- @Test
- public void test2(){
- Course d=dd.getId(1);
- System.out.println(d);
- d.setCourse("微博");
- dd.updateCourse(d);
- }
- @Test
- public void test3(){
- List<Course> all = dd.getAll();
- for (var c: all) {
- System.out.println(c.getId()+":"+c.getCourse());
- }
- }
- }
public class TestDAO
- url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
- username=root
- password=123456
- driverClassName=com.mysql.cj.jdbc.Driver
- initialSize=10
- maxActive=20
- maxWait=1000
druid.properties
两个需要注意的问题:
JDBCToolsV3 :DAO的更多相关文章
- JavaWeb技术(二):DAO设计模式
1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...
- 转账示例(一):Dao层面实现(本例采用QueryRunner来执行sql语句,数据源为C3P0)
缺点:Dao层面把Service层面的操作完成了,不利于后期的代码修改和重构 1.自行创建C3P0Util account数据库 2.jar包 3.Dao层面 接口: package com.lear ...
- SSH框架——(二)四层结构:DAO,Service,Controller,View层
1. DAO层: 主要任务:做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此. DAO层的设计:首先是设计DAO层的接口,然后再Spring的配置文件中定义此接口的实现类,然后就可以在模块 ...
- 架构-数据库访问-SQL语言进行连接数据库服务器-DAO:DAO
ylbtech-架构-数据库访问-SQL语言进行连接数据库服务器-DAO:DAO DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口,它显露了 Microsoft ...
- jdbc之二:DAO模式
详细代码请参见 https://code.csdn.net/jediael_lu/daopattern 1.创建Dao接口. package com.ljh.jasonnews.server.dao; ...
- Mybatis框架三:DAO层开发、Mapper动态代理开发
这里是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下来做到了简单的增删改查:http://www.cnblogs.com/xuyiqi ...
- Jtester+unitils+testng:DAO单元测试文件模板自动生成
定位 本文适合于不愿意手工编写而想自动化生成DAO单元测试的筒鞋.成果是不能照搬的,但其中的"创建模板.填充内容.自动生成"思想是可以复用的.读完本文,可以了解 Python 读取 ...
- jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏
详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database filter_conf; 2.创建表并插入数据 crea ...
- sping整合hibernate之二:dao层开发
在上一篇日志中将hibernate的会话工厂sessionFactory注入到了spring的容器中,但这样还不够,因为hibernate的增删改查是要使用事务机制的, 所以还要在spring中配置 ...
随机推荐
- C#中检查null的语法糖
今天看到已经更新了devblogs,新增的C# 11的!!(用于检查null的语法)经过非常长的讨论,最后取消了.然后我又想起来null检查,这个可以说一说. 函数参数null检查 传统写法 写一个函 ...
- javaScript中Math内置对象基本方法入门
概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...
- [题解] 春荔(cut) | 贪心
题目大意 有一个长度为 \(n\) 的非负整数序列 \(a_i\),每次可以选择一段区间减去 \(1\),要求选择的区间长度 \(\in[l,r]\),问最少多少次把每个位置减成 \(0\). 不保证 ...
- 3.Docker常用命令
帮助启动类命令 启动docker: systemctl start docker 停止docker: systemctl stop docker 重启docker: systemctl restart ...
- 一图详解java-class类文件原理
摘要:徒手制作一张超大的类文件解析图,方便通过浏览这个图能马上回忆起class文件的结构以及内部的指令. 本文分享自华为云社区<[读书会第十二期]这可能是全网"最大".&qu ...
- 设计并实现加法器类 Adder
学习内容:设计并实现加法器类 Adder 代码示例: package 实验三; import java.util.Scanner; public class Adder { private int n ...
- Java实现飞机大战游戏
飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行. 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类 我的飞机 MyPl ...
- Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)
前言 Kitex是字节跳动内部的Golang微服务RPC框架,先已开源. Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/ ...
- vision transformer
VIT 总览 Step1 Step2
- Java面试宝典学习笔记【2020】
Java面试题总结 一.Java基础 1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能.Java保留了这个关键字但是没有使用 ...