IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Dbutils--及相关习题 -> 正文阅读

[开发测试]Dbutils--及相关习题

目录

一、Dbutils如何使用,操作步骤

二、ResultSetHandler 接口 结果集的处理

三、练习

1、创建jdbc.properties属性列表

2、创建工具类

3、Admin类

4、创建Admin数据库访问接口

5、Admin的数据库访问接口实现类

6、Admin业务接口

7、针对Admin的业务接口实现类

8、提供一些业务测试 (单元测试)


一、Dbutils如何使用,操作步骤

1、创建执行对象
(1)>QueryRunner(Datasource ds) :是自动提交

>update(String sql,Object...params) ;参数2:可变参数 ---不知道参数多少个(数组)

>针对DQL语句 ?query(String sql,ResultSetHandler<T>(Class<T> type))

>query(String sql,ResultSetHandler<T>(Class<T> type),Object...params)


(2)>QueryRunner():手动提交 ? ??
> update(Connection conn,String sql,Object...params)
> query(Connection conn,String sql,,ResultSetHandler<T>(Class<T> type))

????????QueryRunner qr = new QrueryRunner(DruidJdbcUtiils.getDataSource()) ; //封装工具类获取数据源

2、准备好sql语句

????????String sql ?= "insert into 表名 values(?,?,?,?)" ;
>通用的方法:针对DML语句 ?update(String sql,Object...params) ;;参数2:可变参数 ---不知道参数多少个(数组)
>针对DQL语句 ?query(String sql,ResultSetHandler<T>(Class<T> type))
>query(String sql,ResultSetHandler<T>(Class<T> type),Object...params)
3、ResultSetHandler 接口 结果集的处理
? (1)子类 ? BeanListHandler<T>:将查询的多条记录封装到List集合中
? (2)BeanHandler<T>:将查询的某一条记录封装到实体类中(JavaBean)
? (3)sclarHandler:将单行单列的数据封装到实体类中Object(---转换成需要基本类型)
? (4)MapHanler:将查询的多条记录封装到Map集合中
? (5)ArrayHandler:将查询的多条记录封装到对象数组中...

4、qr.update(sql,实际参数列表) ;----//int 影响的行数?

二、ResultSetHandler 接口 结果集的处理

? (1)子类 ? BeanListHandler<T>:将查询的多条记录封装到List集合中
? (2)BeanHandler<T>:将查询的某一条记录封装到实体类中(JavaBean)
? (3)sclarHandler:将单行单列的数据封装到实体类中Object(---转换成需要基本类型)
? (4)MapHanler:将查询的多条记录封装到Map集合中
? (5)ArrayHandler:将查询的多条记录封装到对象数组中...

三、练习

1、创建jdbc.properties属性列表

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb_01?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("jdbc.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 rollback() throws SQLException {
        Connection connection = DruidJdbcUtils.getConnection();
        //调用回滚方法
        connection.rollback();
        //使用完毕,归还连接池中
        connection.close();
        //从当前线程中解绑
        t1.remove();

    }
    //定义提交的方法---->需要将当前线程中绑定的Connetion remove掉

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


        Connection connection = DruidJdbcUtils.getConnection();
        System.out.println(connection);
    }
}

3、Admin类

import java.io.Serializable;

/**
 * @author Kuke
 * @date 2021/8/19
 * 管理员类
 *
 * JavaBean是一种规范:
 *     1)当前类是具体类
 *     2)当前类中字段(成员变量)私有化
 *     3)需要通过公共setXXX()/getXXX()方法
 *     4)当前类可以实现序列化接口
 */
public class Admin  implements Serializable {

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


    public int getId() {
        return id;
    }

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

    public String getUsername() { //getXXX()  get()去掉 username 称为 当前类bean属性
        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、创建Admin数据库访问接口

import com.qf.pojo.Admin;

import java.util.List;

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

    /**
     * 获取所有管理员列表
     * @return 列表
     */
    List<Admin> findAll();

    /**
     * 查询编号获取Admin实体
     * @param id  编号
     * @return 返回实体对象
     */
    Admin findAdminById(int id);


    /**
     * 查询总记录
     * @return
     */
    long selectTotalCount();

    /**
     * 修改admin
     * @param selectAdmin
     * @return
     */
    int updateAdmin(Admin selectAdmin);
}

5、Admin的数据库访问接口实现类

import com.qf.dao.AdminDao;
import com.qf.pojo.Admin;
import com.qf.utils.DruidJdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.SQLException;
import java.util.List;

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


    @Override
    public List<Admin> findAll() {
        try {
            //创建执行对象
            QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;

            //准备sql语句
            String sql = "select *  from admin" ;
            //执行查询
            //query(String sql,ResuletSetHandler handler)
            //参数1:sql
            //参数2:结果集的处理
            //子类:BeanListHandler<T> 将查询的多条记录封装到List集合中
            //List<当前指定的javeBean实体>
            // BeanListHandler<将查询的结果封装实体类型>(当前实体的类Class)

            List<Admin> list = qr.query(sql, new BeanListHandler<Admin>(Admin.class));
            return list ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }


    //通过id查询Admin实体
    @Override
    public Admin findAdminById(int id) {
        try {
            //创建执行对象
            QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
            //sql
            String sql = "select * from admin where id = ?" ;
            //执行查询
            //query(String sql,ResultSetHandler handler,Object...params)
            //将查询的某一条记录封装到实体类(JavaBean)中,使用到类BeanHandler<T>
            Admin admin = qr.query(sql, new BeanHandler<Admin>(Admin.class), id);
            return admin;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    //查询总记录数
    @Override
    public long selectTotalCount() {
        //QueryRunner执行对象
        try {
            QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
            //sql
            String sql = "select count(id) from admin" ;
            //查询一些单行单列的数据(总记录数),使用单类ScalerHandler<>
            long count = (Long)qr.query(sql, new ScalarHandler<>());
            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }


    //修改Admin

    @Override
    public int updateAdmin(Admin selectAdmin) {
        try {
            //QueryRunner
            QueryRunner qr = new QueryRunner(DruidJdbcUtils.getDataSource()) ;
            //sql
            String sql = "update admin set username = ? ,gender =?,age = ?,address = ? ,phone =? where id = ?" ;
            //更新操作
            int count = qr.update(sql,
                    selectAdmin.getUsername(),
                    selectAdmin.getGender(),
                    selectAdmin.getAge(),
                    selectAdmin.getAddress(),
                    selectAdmin.getPhone(),
                    selectAdmin.getId());
            System.out.println(count);
            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return 0;
    }
}

6、Admin业务接口

import com.qf.pojo.Admin;

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/19
 *
 * 针对Admin业务接口
 */
public interface AdminService {


    /**
     * 获取所有管理员列表
     * @return 列表
     */
    List<Admin> getAllAdmin() ;

    /**
     * 查询编号获取Admin实体
     * @param id  编号
     * @return 返回实体对象
     */
    Admin getAdmin(int id) ;


    /**
     * 查询总记录
     * @return
     */
    long getTotal() ;


    /**
     * 根据id修改admin
     * @param admin
     * @return
     */
    int update(Admin admin) ;
}

7、针对Admin的业务接口实现类

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

import java.util.List;

/**
 * @author Kuke
 * @date 2021/8/19
 * 针对Admin的业务接口实现类
 */
public class AdminServiceImpl implements AdminService {
    @Override
    public List<Admin> getAllAdmin() {

        //调用数据库访问接口
        AdminDao adminDao = new AdminDaoImpl() ;
        List<Admin> list =  adminDao.findAll() ;
        if(list!=null){
            return list ;
        }
        return null ;

    }

    @Override
    public Admin getAdmin(int id) {
        //调用数据库访问接口
        AdminDao adminDao = new AdminDaoImpl() ;
        Admin admin = adminDao.findAdminById(id) ;
        if(admin!=null){
            return admin ;
        }
        return null;
    }

    @Override
    public long getTotal() {
        //调用数据库访问jiekou
        AdminDao adminDao = new AdminDaoImpl() ;
        long count = adminDao.selectTotalCount() ;
        return count;
    }

    @Override
    public int update(Admin admin) {
        //1)修改管理员数据,需要通过id查询Admin
        AdminDao adminDao = new AdminDaoImpl() ;
        //通过编号查询Admin
        Admin selectAdmin = adminDao.findAdminById(admin.getId());
        if(selectAdmin !=null){
            //存在
            //进行修改
            int count = adminDao.updateAdmin(admin) ;
            return  count ;
        }
        return 0;
    }

    public static void main(String[] args) {
        AdminService adminService = new AdminServiceImpl() ;
        Admin admin = new Admin() ;
        admin.setId(3) ;
        admin.setUsername("张三丰");
        admin.setGender("男");
        admin.setAge(20);
        admin.setAddress("南窑国际");
        admin.setPhone("13588889999");
        int count = adminService.update(admin);
        System.out.println(count);

    }
}

8、提供一些业务测试 (单元测试)

import com.qf.pojo.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/19
 * 提供一些业务测试 (单元测试)
 *
 */
public class DbutilsTest {

    @Test
    public void testFindAll(){
        //调用业务层方法
        AdminService adminService = new AdminServiceImpl() ;
        List<Admin> list = adminService.getAllAdmin();
        for (Admin admin : list) {
            System.out.println(admin);
        }
    }

    @Test
    public void testFindById(){
        AdminService adminService = new AdminServiceImpl() ;
        Admin admin = adminService.getAdmin(3);
        System.out.println(admin);
    }

    @Test
    public void testSelectTotalCount(){
        AdminService adminService = new AdminServiceImpl() ;
        long count = adminService.getTotal();
        System.out.println(count);
    }


    @Test
    public void testUpdateAdmin(){
        AdminService adminService = new AdminServiceImpl() ;
        //创建Admin
        Admin admin = new Admin() ;
        admin.setId(3) ;
        admin.setUsername("张三丰2");
        admin.setGender("男2");
        admin.setAge(22);

        admin.setAddress("南窑国际2");
        admin.setPhone("13588889888");
        int count = adminService.update(admin);
        System.out.println(count);
    }
}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:59:40  更:2021-08-23 17:00:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/14 20:08:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码