连接池-DataSource习题

目录

 连接池的操作步骤

1、提供druid.properties属性列表

2、封装工具类

3、创建管理员实体类

4、创建AdminDao数据库接口

5、创建Admin的数据库访问接口实现层

6、创建Admin业务接口层

7、业务接口实现层

8、测试类


 连接池的操作步骤

1)导入连接池的第三方jar包 Druid-xxx(版本号).jar
2)编写连接池的配置文件(配置文件名称 任意即可 一般情况:jdbc.properties)
                    数据库的基本连接信息
                    driverClassName
                    url
                    username
                    password
                    initialSize 初始化数量
                    maxWait 最大等待时间
                    maxIdle:最大空闲数量
                    maxActive:最大激活数量
                    minIdle:最小空闲数量
3)通过DruidDataSourceFactory    工厂类---->创建DataSource(数据源)            
    静态方法:返回值就是DataSource
    public static DataSource createDataSource(Properties prop)
4)读取jdbc.properties配置文件,获取资源文件的输入流对象,将输入流对象加载到Properties属性列表中
5)创建数据源对象-----获取getConnection()

1、提供druid.properties属性列表

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ee_2106?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000

2、封装工具类

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author Kuke
 * @date 2021/8/18
 * 工具类---->DataSource----->获取数据库的连接对象 Connection以及后期管理事务
 *
 * 获取连接对象----静态方法
 * 关闭资源-----静态方法
 */
public class DruidJdbcUtils {

    //成员变量位置
    private  static DataSource ds ;
    //为了保证线程安全:每一线程使用自己的Connection
    private static ThreadLocal<Connection>  t1 = new ThreadLocal<>() ; //提供线程的局部变量保存连接对象

    //构造方法私有化
    private DruidJdbcUtils(){}

    //静态代码块
    static{
        try {
            //读取数据库连接池的配置文件----->通过DruidDataSourceFactory工厂类创建DataSource
            //创建一个属性集合列表
            Properties prop = new Properties() ;
            //读取druid.properties
            InputStream inputStream = DruidJdbcUtils.class.getClassLoader().
                    getResourceAsStream("druid.properties");

            //将资源文件所在的输入流加载列表中
            prop.load(inputStream);
            ds = DruidDataSourceFactory.createDataSource(prop);
            //底层子实现类:DruidDataSource
            System.out.println("数据源获取成功");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //提供静态方法:单独获取数据源
    public static DataSource getDataSource(){
        return ds ;
    }

    //获取连接对象Connection静态功能

    public static Connection getConnection(){
        //从ThreadLocal中获取局部变量的副本:Connection
        /**
         *   public T get()  :从线程中获取局部变量的副本!
         */
        Connection conn =  null ;
        try {
            conn  =  t1.get();
            if(conn==null){
                //如果空,需要从数据库的连接池中获取连接对象
                 conn  = ds.getConnection();
                //获取到之后,每一线程执行自己的Connection
                //将获取到的连接对象 绑定到当前线程中
                t1.set(conn);
            }
            //如果不为空,说明ThreadLocal线程中已经存在Connection
            return conn ; //
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null ;

    }

    //关闭(释放资源)资源
    public static void close(ResultSet rs, Statement stmt,Connection conn)  {
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
                //关闭之后,归还到连接池中,需要从当前线程中解绑
                t1.remove();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close( Statement stmt,Connection conn)  {
        close(null,stmt,conn);
    }
    //事务管理代码 --- 加入

    public static void main(String[] args) {
        DataSource ds = DruidJdbcUtils.getDataSource();
        System.out.println(ds);
        Connection connection = DruidJdbcUtils.getConnection();
        System.out.println(connection);
    }
}

3、创建管理员实体类

/**
 * @author Kuke
 * @date 2021/8/18
 * admin管理员实体类
 */
public class Admin {


  /*  FieldTypeComment
    id  int NOT NULL
    usernam evarchar(20) NULL
    gender  varchar(5) NULL
    age int NULL
    address varchar(50) NULL
    phone   varchar(11) NULL*/

  private int id ;
  private String username ;
  private String gender ;
  private int age ;
  private String address ;
  private String phone ;

    public Admin() {
    }

    public Admin(int id, String username, String gender, int age, String address, String phone) {
        this.id = id;
        this.username = username;
        this.gender = gender;
        this.age = age;
        this.address = address;
        this.phone = phone;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

4、创建AdminDao数据库接口

import com.qf.entity.Admin;

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/18
 * 针对Admin的数据库访问接口层
 */
public interface AdminDao {

    /**
     * 数据库访问的查询所有的管理员列表
     * @return 返回列表数据
     */
    List<Admin> findAll() ;


    /**
     * 根据id编号查询指定的管理员
     * @param id 编号
     * @return 获取实体
     */
    Admin selectAdminById(int id);

    /**
     * 查询总记录数
     * @return
     */
    int selectTotalCount();
}

5、创建Admin的数据库访问接口实现层

import com.qf.dao.AdminDao;
import com.qf.entity.Admin;
import com.qf.utils.DruidJdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/18
 * 针对Admin的数据库访问接口实现层
 */
public class AdminDaoImpl implements AdminDao {

    Connection conn = null ;
    PreparedStatement stmt = null ;
    ResultSet rs = null ;

    @Override
    public List<Admin> findAll() {
        try {
            //获取连接对象
            conn = DruidJdbcUtils.getConnection();
            //准备sql
            String sql ="select * from admin" ;
            //创建预编译对象
            stmt = conn.prepareStatement(sql) ;
            rs = stmt.executeQuery() ;
            //创建List
            List<Admin> list = new ArrayList<>() ;
            //声明admin变量 Admin类型的
            Admin admin = null ;
            while(rs.next()){
                admin = new Admin() ;
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String gender = rs.getString("gender");
                int age = rs.getInt("age");
                String address = rs.getString("address");
                String phone = rs.getString("phone");

                //封装Admin实体
                admin.setId(id);
                admin.setUsername(username);
                admin.setGender(gender);
                admin.setAge(age);
                admin.setAddress(address);
                admin.setPhone(phone);

                //添加到集合中
                list.add(admin) ;
            }
            return list ;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DruidJdbcUtils.close(rs,stmt,conn);
        }
        return null;
    }

    //查询单个实体
    @Override
    public Admin selectAdminById(int id) {
        //获取数据库的连接对象
        try {
            //获取连接对象
            conn = DruidJdbcUtils.getConnection();
            //准备sql
            String sql ="select * from admin where id = ?" ;
            //创建预编译对象
            stmt = conn.prepareStatement(sql) ;
            //参数赋值
            stmt.setInt(1,id);
            //执行更新
            rs = stmt.executeQuery() ;
            Admin admin = null ;
            while(rs.next()){

                admin = new Admin() ;
                int adminId = rs.getInt("id");
                String username = rs.getString("username");
                String gender = rs.getString("gender");
                int age = rs.getInt("age");
                String address = rs.getString("address");
                String phone = rs.getString("phone");

                //封装
                admin.setId(adminId);
                admin.setUsername(username);
                admin.setGender(gender);
                admin.setAge(age);
                admin.setAddress(address);
                admin.setPhone(phone);
            }
            return admin ;

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DruidJdbcUtils.close(rs,stmt,conn);
        }
        return null;

    }

    @Override
    public int selectTotalCount() {
        //获取数据库的连接对象
        try {
            //获取连接对象
            conn = DruidJdbcUtils.getConnection();
            //准备sql
            String sql ="select * from admin" ; //全部数据
            //创建预编译对象
            stmt = conn.prepareStatement(sql) ;
            //执行更新
            rs = stmt.executeQuery() ;
            //int getRow():ResultSet 获取行数 (第一行1,第二行2)
            int countRow = 0 ;
            while(rs.next()) {
                countRow ++ ;
            }
            return countRow ;

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DruidJdbcUtils.close(rs,stmt,conn);
        }
        return  0 ;
    }
}

6、创建Admin业务接口层

import com.qf.entity.Admin;

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/18
 * 针对Admin业务接口层
 */
public interface AdminService {
    /**
     * 查询所有的Admin管理员实体
     * @return 返回列表数据
     */
    List<Admin> getAllAdmin() ;

    /**
     * 通过id 查询管理员
     * @param id  管理员编号
     * @return  返回实体对象
     */
    Admin getAdmin(int id) ;

    /**
     * 查询总记录数
     * @return
     */
    int getCount() ;
}

7、业务接口实现层

import com.qf.dao.AdminDao;
import com.qf.dao.impl.AdminDaoImpl;
import com.qf.entity.Admin;
import com.qf.service.AdminService;

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/18
 * 针对Admin的业务接口实现层
 */
public class AdminServiceImpl implements AdminService {
    @Override
    public List<Admin> getAllAdmin() {
        //创建数据库访问接口对象AdminDao
        AdminDao adminDao = new AdminDaoImpl() ;
        List<Admin> list = adminDao.findAll();
        return list;
    }

    /**
     * 获取指定的管理员
     * @param id  管理员编号
     * @return
     */
    @Override
    public Admin getAdmin(int id) {
        //调用dao层
        AdminDao adminDao = new AdminDaoImpl() ;
        Admin admin = adminDao.selectAdminById(id) ;
        if(admin!=null){
            return admin;
        }else{
            System.out.println("没有查找到管理员");
        }
        return null ;

    }

    @Override
    public int getCount() {
        //调用dao层
        AdminDao adminDao = new AdminDaoImpl() ;
        int count = adminDao.selectTotalCount() ;
        return count;
    }
}

8、测试类

import com.qf.entity.Admin;
import com.qf.service.AdminService;
import com.qf.service.impl.AdminServiceImpl;
import org.junit.Test;

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/18
 */
public class MyTest {

    //测试查询功能所有
    @Test
    public void testFindAll(){

        //调用service
        AdminService adminService = new AdminServiceImpl() ;
        List<Admin> list = adminService.getAllAdmin();
        if(list!=null){
            for (Admin admin : list) {
                System.out.println(admin);
            }
        }
    }

    //测试查询某个管理员
    @Test
    public void testfindById(){
        //调用service
        AdminService adminService = new AdminServiceImpl() ;
        Admin admin = adminService.getAdmin(2);
        System.out.println(admin);
    }

    //测试查询总记录数
    @Test
    public void testSelectTotalCount(){
        //调用service
        AdminService adminService = new AdminServiceImpl() ;
       int totalCount = adminService.getCount();
        System.out.println(totalCount);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彦登的登

动力来源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值