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中配置 ...
随机推荐
- python的一些练习题
1.目前工作上有一堆的ip地址,ip是ok的,但是需要找出来不在这里面的其他ip import os a = list() with open('ip.txt','r') as f: #print(f ...
- CentOS 并没有死,Rocky Linux 让其重生
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 近日,CentOS 官方发文称CentOS Stream ...
- Linux下高效实用的grep命令
Linux系统中的grep命令是一种功能强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则 ...
- python之函数的进阶
1.名称空间: 定义:用来存放名字的(变量,函数名,类名,引入的模块名) 分类: 内置名称空间:python解释器提供好的一些内置内容 全局名称空间:py文件中自己写的变量 局部名称空间:执行函数时会 ...
- css实现元素淡入淡出
@-webkit-keyframes fadeIn { 0% { opacity: 0; /*初始状态 透明度为0*/ } 50% { opacity: 0; /*中间状态 透明度为0*/ } 100 ...
- Tenseal库
在此记录Tenseal的学习笔记 介绍 在张量上进行同态计算的库,是对Seal的python版实现,给开发者提供简单的python接口,无需深究底层密码实现. 当前最新版本:3.11 位置:A lib ...
- 大数据分析——sklearn模块安装
前提条件:numpy.scipy以及matplotlib库的安装 (注:所有操作都在pycharm命令终端进行) ①numpy安装 pip install numpy ②scipy安装 pip ins ...
- PostgreSQL(一) 编译安装运行
原创,如转发需注明出处. 多年没写博客,一直用的个人笔记软件,最近准备阅读PostgreSQL源码,故记录.(这两年PostgreSQL数据库在某些环境下是比较火的,原因想必大家都清楚.) Postg ...
- 解决WIN7无法安装高版本Node.js问题
网上很多文章都让去安装低版本node 由于业务需求,低版本node npm 有一些包支持的不好 npm出cb() never call 本着更新npm 顺带弄个高版本的node 单独更新npm npm ...
- Eureka高可用集群搭建
就是搭建Eureka的集群. 每个Eureka Server需要相互注册,确保数据一致. 我这里准备两个Eureka Server 他两的POM文件配置是一样的 <dependencies&g ...