JDBC小记 练手项目-Faker


工程目录结构

在这里插入图片描述

数据库表结构

在这里插入图片描述


依赖与配置说明

  • 数据库驱动 jarmysql-connector-java-5.1.37.jar 一定要跟数据库版本匹配
  • Druid 配置文件
    • url 末尾参数:
    • ?useSSL=false&serverTimezone=UTC —连接失败
    • &useUnicode=true&characterEncoding=utf8 —中文乱码
    • 数据库名、用户名、密码、最大连接数 根据具体情况更改
    • 也就是下面代码块 { } 中的部分。实际配置时不用 { }
url=jdbc:mysql://localhost:3306/{db_name}?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
username={user_name}
password={pass_word}
driverClassName=com.mysql.jdbc.Driver

initialSize={10}
maxActive={10}

模块结构简单说明

在这里插入图片描述

  • Beans 与数据库表对应的对象 ORM1
  • Faker 对应数据库中的 faker
    • 属性:对应数据表中的字段(可以不同名),但是查询的时候,需要采用别名显示查询结果
    • SetterGetter
    • toString:用于打印Faker对象
    • 以及构造方法【图没截全,代码文末展示】
      在这里插入图片描述
      在这里插入图片描述
  • Dao2
  • 访问数据信息的类和接口 Data Access Object
  • 部包含任何业务相关的信息
  • BaseDao
    • 抽象父类
    • 定义了对数据的CRUD(Create、Retrival、Update、Delete)
  • FakerDao
    • 一个接口
    • 规定了一系列 针对 faker 表 Faker 对象 的操做(包括但不限于

  • dao.impl
  • Dao 的实现
  • 继承 BaseDao 抽象父类 ;使用 FakerDao 接口
  • FakerDaoImpl
  • 继承 BaseDao 对数据库的增删改查基本方法
  • 并运用到 重写 FakerDao 接口定义的操做中
  • 实现对具体 Faker 对象 / faker 表 的操作

  • utils
  • 通用工具包
  • JDBCUtils
  • 需要配置 druid.properties 配置文件
  • 运用 Druid 实现数据库连接,关闭操作
  • 主要用来实现:
    • 返回数据库连接对象
    • 关闭数据库连接

项目源代码

druid.properties
JDBCUtils.java
Faker
BaseDao.java
FakerDao.java
FakerDaoImpl.java


druid.properties

url=jdbc:mysql://localhost:3306/{db_name}?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
username={user_name}
password={pass_word}
driverClassName=com.mysql.jdbc.Driver

initialSize={10}
maxActive={10}

JDBCUtils.java

package com.这个包.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.DbUtils;

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

/**
 * @version 1.0
 * @description: TODO
 * @date 2021-11-30 10:39
 */
public class JDBCUtils {

    public static DataSource source;
    static{
        try{
            Properties pros = new Properties();
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            pros.load(is);
            source = DruidDataSourceFactory.createDataSource(pros);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * @Description: TODO  druid 连接池技术 获取连接对象
     * @params
     * @return java.sql.Connection
     * @throws Exception
     * @date 2021-11-30 10:47
     */
    public static Connection getConnection() throws Exception{
        Connection conn = source.getConnection();
        return conn;
    }

    /**
     * @Description: TODO 关闭数据库连接
    * @param conn:
     * @param ps:
     * @param rs:
     * @return void
     * @date 2021-11-30 10:46
     */
    public static void closeResource(Connection conn, Statement ps, ResultSet rs){
        DbUtils.closeQuietly(conn);
        DbUtils.closeQuietly(ps);
        DbUtils.closeQuietly(rs);
    }
}

Faker.java

package com.这个包.beans;

public class Faker {
    private Integer id;
    private String ssn;
    private String name;
    private Integer age;
    private String gender;
    private String job;
    private String address;
    private String mail;
    private String phone;

    public Faker(Integer id, String ssn, Integer age, String name, String gender, String job, String address, String mail, String phone) {
        this.id = id;
        this.ssn = ssn;
        this.age = age;
        this.name = name;
        this.gender = gender;
        this.job = job;
        this.address = address;
        this.mail = mail;
        this.phone = phone;
    }

    public Faker() {}

    public Integer getAge(){
        return age;
    }

    public String getSsn() {
        return ssn;
    }

    public void setSsn(String ssn) {
        this.ssn = ssn;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

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

    public String getJob() {
        return job;
    }

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

    public void setJob(String job) {
        this.job = job;
    }

    public String getAddress() {
        return address;
    }

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

    public String getMail() {
        return mail;
    }

    public void setMail(String email) {
        this.mail = email;
    }

    public String getPhone() {
        return phone;
    }

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

    @Override
    public String toString() {
        return "Faker{" +
                "id=" + id +
                ", ssn='" + ssn + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", job='" + job + '\'' +
                ", address='" + address + '\'' +
                ", mail='" + mail + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

BaseDao.java

package com.这个包.dao;

import com.pxo.utils.JDBCUtils;
import org.apache.commons.dbutils.DbUtils;
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.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @version 1.0
 * @description: TODO
 * @date 2021-11-30 10:56
 */
public abstract class BaseDao<T> {
    private QueryRunner runner = new QueryRunner();
    private Class<T> type;

    /**
     * @Description: TODO  构造方法;获取T的class对象,获取泛型的类型
     * @date 2021-11-30 11:05
     */
    public BaseDao() {
        Class clazz = this.getClass();
        ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
        Type[] types = parameterizedType.getActualTypeArguments();

        this.type = (Class<T>) types[0];
    }

    /**
     * @Description: TODO update;通用增删改 操作
     * @param conn:
     * @param sql:
     * @param params:
     * @return int
     * @date 2021-11-30 11:09
     */
    public int update(Connection conn, String sql, Object...params){
        int count = 0;
        try{
            count = runner.update(conn, sql, params);
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        return count;
    }

    /**
     * @Description: TODO 插入等多条记录,返回插入数据量;报错则回滚;采用数据库事务处理;
     * @param conn:
     * @param sql:
     * @param list:
     * @return int
     * @date 2021/12/1 16:15
     */
    public int batch(Connection conn, String sql, Object[][] list){
        try {
            conn.setAutoCommit(false);
            runner.batch(conn, sql, list);
            conn.commit();
            return list.length;
        } catch (SQLException e) {
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
            return -1;
        }finally{
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Description: TODO  获取一个Bean对象
     * @param conn:
     * @param sql:
     * @param params:
     * @return T
     * @date 2021-11-30 11:12
     */
    public T getBean(Connection conn, String sql, Object...params){
        T t = null;
        try{
            t = runner.query(conn, sql, new BeanHandler<T>(type), params);
        }catch (SQLException e){
            e.printStackTrace();
        }
        return t;
    }

    /**
     * @Description: TODO  获取所有Beans对象, 准确说是多个
     * @param conn:
     * @param sql:
     * @param params:
     * @return java.util.List<T>
     * @date 2021-11-30 11:15
     */
    public List<T> getBeanList(Connection conn, String sql, Object...params){
        List<T> list = null;
        try{
            list = runner.query(conn, sql, new BeanListHandler<T>(type), params);
        }catch(SQLException e){
            e.printStackTrace();
        }
        return list;
    }

    /**
     * @Description: TODO 获取单一值; 执行 select count(*) .... 之类语句
     * @param conn:
     * @param sql:
     * @return java.lang.Object
     * @date 2021-11-30 11:18
     */
    public Object getValue(Connection conn, String sql, Object...params){
        Object count = null;
        try{
            count = runner.query(conn, sql, new ScalarHandler(), params);
        }catch (SQLException e){
            e.printStackTrace();
        }
        return count;
    }
}

FakerDao.java

package com.这个包.dao;

import com.这个包.beans.Faker;

import java.sql.Connection;
import java.util.List;

public interface FakerDao {

    // 获取所有人的信息
    List<Faker> getFakers(Connection conn);

    // 插入单个记录
    void saveFaker(Connection conn, Faker faker);

    // 插入多个记录
    void saveFaker(Connection conn, List<Faker> list);

    // 根据Id 删除单个记录
    void deleteFakerById(Connection conn, String fakerId);

    // 根据 id 获取一条记录
    Faker getFakerById(Connection conn, String fakerId);

    // 根据 性别获取多个记录
    List<Faker> getFakersByGender(Connection conn, String gender);


    // 根据年龄获取多个记录
    List<Faker> getFakerByAge(Connection conn, int _age, int age_);

    // 更新单个记录
    void updateFaker(Connection conn, Faker faker);
}

FakerDaoImpl.java

package com.这个包.dao.impl;

import com.这个包.beans.Faker;
import com.这个包.dao.BaseDao;
import com.这个包.dao.FakerDao;

import java.sql.Connection;
import java.util.List;

public class FakerDaoImpl extends BaseDao<Faker> implements FakerDao {

    /**
     * @Description: TODO  返回所有查询结果
     * @param conn:
     * @return java.util.List<com.这个包.beans.Faker>
     * @author **
     * @date 2021/12/1 15:47
     */
    @Override
    public List<Faker> getFakers(Connection conn) {
        List<Faker> beanList = null;
        String sql = "select * from faker";
        beanList = getBeanList(conn, sql);
        return beanList;
    }

    /**
     * @Description: TODO 插入单条数据
     * @param conn:
     * @param faker:
     * @author **
     * @date 2021/12/1 15:48
     */
    @Override
    public void saveFaker(Connection conn, Faker faker) {
        String sql = "insert into faker(ssn,name,age,gender,job,address,phone,mail) " +
                "values(?,?,?,?,?,?,?,?)";
        update(conn, sql, faker.getSsn(),faker.getName(),faker.getAge(),
                faker.getGender(),faker.getJob(),faker.getAddress(),faker.getPhone(),
                faker.getMail());
    }

    /**
     * @Description: TODO 插入多条数据;
     * @param conn:
     * @param list:
     * @author **
     * @date 2021/12/1 16:19
     */
    @Override
    public void saveFaker(Connection conn, List<Faker> list) {
        String sql = "insert into faker(ssn,name,age,gender,job,address,phone,mail) " +
                "values(?,?,?,?,?,?,?,?)";
        Object[][] fList = new Object[list.size()][];
        int i = 0;
        for(Faker faker: list){
            Object[] one = {faker.getSsn(),faker.getName(),faker.getAge(),
                    faker.getGender(),faker.getJob(),faker.getAddress(),faker.getPhone(),
                    faker.getMail()};
            fList[i] = one;
            i++;
        }
        batch(conn, sql, fList);
    }

    /**
     * @Description: TODO 根据 id 删除记录
     * @param conn:
     * @param fakerId:
     * @author **  2021/12/1 16:24
     */
    @Override
    public void deleteFakerById(Connection conn, String fakerId) {
        String sql = "delete from faker where id=?";
        update(conn, sql, fakerId);
    }

    /**
     * @Description: TODO 根据 id 获取记录
     * @param conn:
     * @param fakerId:
     * @return com.这个包.beans.Faker
     * @author **  2021/12/1 16:26
     */
    @Override
    public Faker getFakerById(Connection conn, String fakerId) {
        Faker faker = null;
        String sql = "select * from faker where id=?";
        faker = getBean(conn, sql, fakerId);
        return faker;
    }

    /**
     * @Description: TODO 根据 性别 获取多条记录
     * @param conn:
     * @param gender:
     * @return java.util.List<com.这个包.beans.Faker>
     * @author **  2021/12/1 16:27
     */
    @Override
    public List<Faker> getFakersByGender(Connection conn, String gender) {
        String sql = "select * from faker where gender=?";
        return getBeanList(conn, sql, gender);
    }

    /**
     * @Description: TODO
     * @param conn:
     * @param _age:
     * @param age_:
     * @return java.util.List<com.这个包.beans.Faker>
     * @author **  2021/12/1 16:37
     */
    @Override
    public List<Faker> getFakerByAge(Connection conn, int _age, int age_) {
        String sql = "select * from faker where age between ? and ?";
        return getBeanList(conn, sql, _age, age_);
    }

    /**
     * @Description: TODO 更新对应的 faker 对象(在表中的值)
     * @param conn:
     * @param faker:
     * @author **  2021/12/1 16:30
     */
    @Override
    public void updateFaker(Connection conn, Faker faker) {
        String sql = "update faker set ssn=?,name=?,age=?,gender=?,job=?, " +
                "address=?,phone=?,mail=? where id=?";
        update(conn, sql, faker.getSsn(),faker.getName(),faker.getAge(),
                faker.getGender(),faker.getJob(),faker.getAddress(),faker.getPhone(),
                faker.getMail(),faker.getId());
    }
}

测试代码

QueryTest.java

package com.另一个包.test4xueou;

import com.另一个包.utils.JDBCUtils;
import com.这个包.beans.Faker;
import com.这个包.dao.impl.FakerDaoImpl;

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

public class QueryTest {
    static FakerDaoImpl fakerDao = new FakerDaoImpl();

    /**
     * @Description: TODO  测试根据性别获取faker
     * @author   2021/12/2 10:52
     */
    public static void test01(){
        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
            List<Faker> fakers = fakerDao.getFakersByGender(conn, "F");
            for (Faker faker : fakers) {
                System.out.println(faker.getName() + "  " + faker.getAge());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.closeResource(conn, null, null);
        }
    }
    /*
     * @Description: TODO 测试添加单条数据
     * @author **  2021/12/2 10:56
     */
    public static void test02(){
        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
            Faker faker = new Faker(null,"371*******7132",26,"一个名字",
                    "F", "铲车司机", "湖南省大冶市假的街道U座 140957",
                    "kzheng@假的.com","1509********");
            fakerDao.saveFaker(conn, faker);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.closeResource(conn, null, null);
        }
    }

    /**
     * @Description: TODO 测试 批量添加
     * @author **  2021/12/2 10:57
     */
    public static void insert_many(){
        Connection conn = null;
        try {
            List<Faker> list = GenFakers.get_list();
            conn = JDBCUtils.getConnection();
            fakerDao.saveFaker(conn, list);
            System.out.println("Ok! --");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.closeResource(conn, null, null);
        }
    }

    /**
     * @Description: TODO 测试 获取单条数据的某个值;靠 BaseDao 的 getValue 实现
     * @param args:
     * @author **  2021/12/2 10:57
     */
    public static void main(String[] args){
        Connection conn = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select mail from faker where id=?";
            Object value = fakerDao.getValue(conn, sql, "321");
            System.out.println(value);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.closeResource(conn, null, null);
        }
    }
}

GenFakers.java

  • 测试代码需要用到的类
  • 用于从txt文件提取处 List<Faker> 信息
package com.另一个包.test4xueou;

import com.这个包.beans.Faker;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class GenFakers {
    static String path = "txt/fakers.txt";
    /**
     * @Description: TODO  通过txt 文件,解析出 List<Faker>
     * @return java.util.List<com.这个包.beans.Faker>
     * @author **  2021/12/1 18:31
     */
    public static List<Faker> get_list(){
        List<Faker> fakers = new ArrayList<>();
        File file = new File(path);
        FileReader filereader = null;
        try {
            filereader = new FileReader(file);
            BufferedReader reader = new BufferedReader(filereader);

            Object[] lines = reader.lines().toArray();
            for(Object line: lines){
                Faker fk = new Faker();
                String one = (String) line;
                String[] faker = one.split("\\t");
                fk.setAge(randint(18, 60));
                fk.setSsn(faker[0]);
                fk.setName(faker[1]);
                fk.setGender(faker[2]);
                fk.setJob(faker[3]);
                fk.setAddress(faker[4]);
                fk.setMail(faker[5]);
                fk.setPhone(faker[6]);
                fakers.add(fk);
            }
            filereader.close();
            reader.close();
            return fakers;
        } catch (Exception e) {
            e.printStackTrace();
            return fakers;
        }
    }

    /**
     * @Description: TODO 产生随机整数
     * @param _min:
     * @param _max:
     * @return int
     * @author **  2021/12/1 18:31
     */
    public static int randint(int _min, int _max){
        Date date = new Date();
        Long seed = Long.parseLong(String.format("%tN", date));
        Random r = new Random(seed);
        return _min + r.nextInt(_max - _min);
    }
	// 测试函数
    public static void test_main(String[] args){
        List<Faker> fakers = get_list();
        for (int i=0; i< 20;i++){
            System.out.println(fakers.get(i));
        }
    }
}

fakers.txt

  • 虽然是由 Python Faker 生成的一些假的人物信息
  • 但保不齐就有谁的 身份证号、手机号、邮箱给对上了
  • 这就简单编几个,文件展示的主要也是数据存储格式
  • 每一行单个数据中间时 \t 制表符隔开
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
假的身份证号	假的名字	假的性别	假的职业	假的住址	假的邮箱	假的电话号码
                 ........

  1. ORM–Object relation Mapping;对象关系映射 ↩︎

  2. Dao–Data Access Object.访问数据信息的类和接口 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

薛定谔的壳

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值