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中配置 ...
随机推荐
- MySQL远程连接、用户授权
目录 MySQL远程连接 创建用户.授权 MySQL添加用户.删除用户.授权及撤销权限 MySQL可授予用户的执行权限 MySQL远程连接 远程连接 授权 常见权限表 相关库:mysql 相关表:us ...
- BUUCTF-MISC:二维码
题目 解题过程 1.点击下载附件,发现是一个压缩包,解压后得到一张二维码 2.使用QR research扫描,得到的内容并不是flag 3.使用010editor打开图片分析,发现图片里面含有一个tx ...
- 修复Arch Linux和Manjaro Linux无法显示emoji的问题
安装好Arch Linux或Manjaro Linux系统后默认没办法正常显示emoji,通常会变成方框或者带有unicode码的方块: 这是因为缺失字体以及相关的字体配置导致的. 当然也有一小部分应 ...
- 【Linux 网络编程】生动讲解 Reactor 模式与 Proactor 模式
五种 I/O 模型 先花费点时间了解这几种 I/O 模型,有助于后面的理解. 阻塞 I/O 与非阻塞 I/O 阻塞和非阻塞的概念能应用于所有的文件描述符,而不仅仅是 socket.我们称阻塞的文件描述 ...
- AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验
随着信息技术的发展,人们对实时通信的需求不断增加,并逐渐成为工作生活中不可或缺的一部分.每年海量的音视频通话分钟数对互联网基础设施提出了巨大的挑战.尽管目前全球的互联网用户绝大多数均处于良好的网络状况 ...
- zabbix 线路质量监控自定义python模块,集成ICMP/TCP/UDP探测,批量监控线路质量自定义阈值联动mtr保存线路故障日志并发送至noc邮箱
互联网故障一般表现为丢包和时延增大,持续性故障不难排查,难的是间歇性或凌晨故障,后者往往来不及等我们测试就已经恢复正常,得不到异常时的mtr无法判断故障点在哪里 故此有了根据丢包率和时延变换联动mtr ...
- 8┃音视频直播系统之 WebRTC 信令系统实现以及通讯核心并实现视频通话
一.信令系统 信令系统主要用来进行信令的交换 在通信双方彼此连接.传输媒体数据之前,它们要通过信令服务器交换一些信息,如规范协商 若 A 与 B 要进行音视频通信,那么 A 要知道 B 已经上线了,同 ...
- 165. Compare Version Numbers - LeetCode
Question 165. Compare Version Numbers Solution 题目大意: 比较版本号大小 思路: 根据逗号将版本号字符串转成数组,再比较每个数的大小 Java实现: p ...
- linux篇-Centos7jdk安装
2.1查看现有JDK #rpm -qa|grep jdk (如果有其他版本的JDK建议卸载) 卸载其他版本的JDK命令 #yum –y remove java-1.6.0 #yum –y remov ...
- CabloyJS全栈开发之旅(1):NodeJS后端编译打包全攻略
背景 毋庸置疑,NodeJS全栈开发包括NodeJS在前端的应用,也包括NodeJS在后端的应用.CabloyJS前端采用Vue+Framework7,采用Webpack进行打包.CabloyJS后端 ...