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中配置 ...
随机推荐
- mmdetection训练出现nan
训练出现nan 在使用MMDetection训练模型时,发现打印信息中出现了很多nan.现象是,loss在正常训练下降的过程中,突然变为nan. 梯度裁减 在模型配置中加上grad_clip: opt ...
- 将python脚本打包为exe可执行文件
技术背景 在很多情况下,编程人员是在Linux环境下完成的编程任务,但是更多的使用人员是在Windows环境下的,比方说,在参考链接1的文章中提到: 那么我们就不得不考虑一个环境转化的问题.pytho ...
- 03. 树莓派初始配置——安装vim编辑器
安装vim编辑器 树莓派系统默认是不带vim编辑器的,默认安装的vi编辑器在编辑文档的时候用得特别不舒服,对人体的血压和树莓派的寿命影响较大. 解决办法:一行命令 1. 安装vim编辑器 sudo a ...
- ASP.NET Web 应用 Docker踩坑历程
听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...
- 论文解读(MERIT)《Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning》
论文信息 论文标题:Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning ...
- ONNXRuntime学习笔记(二)
继上一篇计划的实践项目,这篇记录我训练模型相关的工作. 首先要确定总体目标:训练一个pytorch模型,CIFAR-100数据集测试集acc达到90%:部署后推理效率达到50ms/张, 部署平台为wi ...
- 关于div及display
1.DIV div被看作是一个盒子,可以设置width.height.这个盒子其实是由三部分构成width(height).padding.border.在默认情况下,所见到的div是border和p ...
- 查重工具Jplag的使用
目录 前言 一.Jplag是什么? 二.使用步骤 1.下载包 2.java环境配置 3.如何使用 三.总结 前言 说明一下本文章针对最新版本Jplag3.0使用JplagAPI 一.Jplag是什么? ...
- 弃用!Github 上用了 Git.io 缩址服务的都注意了
GitHub 是面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.对程序员来说,GitHub 可以说是开源精神之所系.在 GitHub 任何职业程 ...
- hooks 与 animejs
hooks 与 animejs 本文写于 2020 年 1 月 13 日 animejs 是现如今非常不错的一个 js 动画库.我们将其与 React Hooks 融合,使它更方便的在 React 中 ...