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; } }
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; } }
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(); }
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; } }
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(); } } }
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()); } } }
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
两个需要注意的问题: