编写文件和步骤

①,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的更多相关文章

  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. CentOS Nginx的安装与部署

    安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc ...

  2. rocketmq消息及流程

    1.为什么用mq 优势 主要有3个: 应用解耦(降低微服务之间的关联). 异步提速(微服务拿到mq消息后同时工作). 削峰填谷(可以消息堆积) 劣势 系统可用性降低(MQ一旦宕机整个系统不可用) 复杂 ...

  3. SSM框架中返回的是字符串还是页面跳转的问题

    如果你在控制器前的注解是@RestController的话,将返回controller方法指定的String值,@RestController注解相当于@ResponseBody和@Controlle ...

  4. linux开机报警无法进入系统

    一.开机无法进入系统提示如下 二.输入"journactl"命令查看红色的日志提示什么错误 三.问题分析: 这是由于swap告警,根据报错信息可以分析出是这两个device设备访问 ...

  5. ChCore Lab2 内存管理 实验笔记

    本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第二篇.所有章节的笔记可在此处查看:chcore | 康宇PL's Blo ...

  6. 解决:Could not resolve dependencies for project xxx: Could not find artifact xxx

    引言 运行A module,找不到B module的依赖报错.A.B module都在project中. 报错信息 [INFO] Scanning for projects... [INFO] [IN ...

  7. RabbitMQ 3.9( 基础 )

    1.认识MQ 1.1.什么是MQ? MQ全称:message queue 即 消息队列 这个队列遵循的原则:FIFO 即 先进先出 队列里面存的就是message 1.2.为什么要用MQ? 1.2.1 ...

  8. c++:-5

    上一节学习C++中的继承和派生:c++:-4,本节学习C++的多态. 运算符重载 思考:用"+"."-"能够实现复数的加减运算吗? 实现复数加减运算的方法 -- ...

  9. 被迫开始学习Typescript —— vue3的 props 与 interface

    vue3 的 props Vue3 的 props ,分为 composition API 的方式以及 option API 的方式,可以实现运行时判断类型,验证属性值是否符合要求,以及提供默认值等功 ...

  10. HCNP Routing&Switching之VRRP基础

    前文我们了解了链路高可用技术链路聚合相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16279078.html:今天我们来聊一聊另一种高可用技术,网关高 ...