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中配置 ...
随机推荐
- Druid SQL和Security在美团点评的实践
分享嘉宾:高大月@美团点评,Apache Kylin PMC成员,Druid Commiter 编辑整理:Druid中国用户组 6th MeetUp 出品平台:DataFunTalk -- 导读: 长 ...
- 附011.常见Linux镜像站点大全
开源系统镜像站点 国内Mirrors站点 企业类站点 阿里巴巴开源Mirrors站点:https://developer.aliyun.com/mirror/ 腾讯开源Mirrors站点:https: ...
- Docker系列教程05-Docker数据卷(Data Volume)学习
引言 在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失.要想实现数据的持久化,需要将数据从宿主机挂载到容器中.目前Docker提供了三种方式将数据从宿主机挂载到 ...
- Spring注解开发_Spring容器创建概述
浅尝Spring注解开发_Spring容器创建概述 浅尝Spring注解开发,基于Spring 4.3.12 概述Spring容器创建的过程,包括12个方法的执行 浅尝Spring注解开发_自定义注册 ...
- MyBatisPlus实现分页和查询操作就这么简单
<SpringBoot整合MybatisPlus基本的增删改查,保姆级教程>在这篇文章中,我们详细介绍了分页的具体实现方法.但是,在日常的开发中还需要搜索功能的.下面让我们一起动起手来,实 ...
- 【Rust】使用HashMap解决官方文档中的闭包限制
问题概述 值缓存是一种更加广泛的实用行为,我们可能希望在代码中的其他闭包中也使用他们.然而,目前 Cacher 的实现存在两个小问题,这使得在不同上下文中复用变得很困难. 第一个问题是 Cacher ...
- Git生成ssh keys加密算法ed25519
1:桌面右击后出现Git push hehe点击进入直接输入以下命令 ①:ssh-keygen -t ed25519 -f my_github_ed25519 -C "xxxxx" ...
- JavaScript 模块的循环加载(循环依赖问题分析)
简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...
- 890. Find and Replace Pattern - LeetCode
Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["ab ...
- linux篇-新建svn仓库
1昨天需要在服务器上新建一个仓库,解决方法是把已有的仓库拷贝出来,库删除在放进去 2然后今天想看看有没有命令的方法 find / -name project 首先查看一下项目的位置 3创建仓库 svn ...