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

 

两个需要注意的问题:

 

posted @ 2020-05-01 17:11  kkzhang  阅读(189)  评论(0编辑  收藏  举报