【mysql】JDBC高级封装和数据库连接池

JDBC高级封装和数据库连接池

1. JDBC高级封装

在这里插入图片描述

1.1 JDBC通用查询方法
方法分析:
	权限修饰符:
		public
	是否静态:
		不需要static修饰
    返回值类型:
    	1. 一定带有泛型
    	2. 数据量不确定
    		List<T>
    方法名:
    	query
    形式参数列表:
    	1. String sql 对应的DQL语句
    	2. 对应当前查询SQL语句的参数
    	3. Class<T> cls
    	(String sql, Class<T> cls, Object... parameters);
	情况分析:
 		当前操作是一个查询方法,我们期望可以从数据库中,数据行 ==> Java中指定数
		据类型的类对象。
		a. 需要告知方法,这里查询的类型是哪一个类型
			类型需要满足多样性,又需要满足数据类型类型一致化
			存在使用泛型的期望。
		b. 在方法中,需要按照用户指定的数据类型,来创建对应的类对象。
			1. new + 构造方法 局限性过大!!!不合适
			2. 通过反射获取Constructor对象,借助于newInstance方法创建。
				存在操作的空间!!!
		需要
			1. 泛型
			2. 反射的万恶之源 Class
		Class<T> cls
        例如:
			Person.class ==> 
				cls ==> Person类
				<T> ==> <Person>

方法声明:
	public <T> List<T> query(String sql, Class<T> cls, Object... parameters);

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
【补充知识点 BeanUtils】
第三方Jar包,用于提供操作符合JavaBeans类对象一些统一化操作方式。
	1. 赋值成员变量
		setProperty
	2. 取值成员变量
		getProperty
	3. 拷贝类对象
		copyProperties
	4. Map双边队列转类对象。

对应Jar包
	commons-beanutils-1.8.3.jar
	commons-logging-1.1.3.jar
	需要使用beanutils,必须有对应的logging Jar包。必要依赖关系!!!
	
	Maven
		==> pom.xml
package com.qfedu.b_beanutils;

import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

public class Demo1 {
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        Person person = new Person();
        Person person1 = new Person();

        /*
        public static void setProperty(Object bean, String name, Object value)
        bean 是符合JavaBean规范的类对象
        name 指定赋值的成员变量名字
        value 对应当前成员变量名字的数据
         */
        BeanUtils.setProperty(person, "id", 1);
        BeanUtils.setProperty(person, "name", "苟磊");
        BeanUtils.setProperty(person, "age", 16);
        System.out.println(person);

        System.out.println();
        /*
        public static String getProperty(Object bean, String name);
        bean 符合JavaBean规范的类对象
        name 对应的需要获取数据成员变量名字
        returnType String 对应数据String类型
         */
        String id = BeanUtils.getProperty(person, "id");
        String name = BeanUtils.getProperty(person, "name");
        String age = BeanUtils.getProperty(person, "age");
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);

        System.out.println();

        System.out.println(person1);
        /*
        public static void copyProperties(Object dest, Object orig)
        dest 目标类对象,要求符合JavaBean规范
        orig 源数据类型对象,要求符合JavaBean规范
         */
        BeanUtils.copyProperties(person1, person);
        System.out.println(person1);

        HashMap<String, String> map = new HashMap<>();

        map.put("id", "123");
        map.put("gender", "男");
        map.put("name", "骚磊");
        map.put("salary", "20");
        map.put("age", "6");


        /*
        public static void populate(Object bean, Map properties)
        bean 符合Javabeans规范的类对象
        properties Map双边队列类型 Key=Value
         */
        BeanUtils.populate(person1, map);
        System.out.println(person1);

    }
}
2. JDBC封装完成项目数据持久化操作
student类
package com.zx.studentsystem.entity;

public class Student {
    private int id;
    private String name;
    private int age ;
    private boolean gender;
    private int score;

    public Student() {
    }

    public Student(String name, int age, boolean gender, int score) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.score = score;
    }

    public Student(int id, String name, int age, boolean gender, int score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.score = score;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public boolean isGender() {
        return gender;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", score=" + score +
                '}';
    }
}

数据库端
package com.zx.studentsystem.dao;

import com.zx.studentsystem.entity.Student;

import java.util.List;

/**
 * StudentDao接口,是Student数据持久化层接口
 * 用于规范关于Student类对象操作数据库的方式方法
 */
public interface StudentDao {

    /**
     * 添加学生对象到当前数据库中保存对应数据
     *
     * @param student Student类对象
     * @return 当前SQL语句操作对应数据库的影响行数
     */
    int addStudent(Student student);


    /**
     * 根据id删除指定Student类对象
     *
     * @param id 用户指定id号
     * @return 当前SQL语句操作对应数据库的影响行数
     */
    int deleteStudent(int id);


    /**
     * 更新对应学生的数据库信息
     *
     * @param student Student类对象
     * @return 当前SQL语句操作对应数据库的影响行数
     */
    int updateStudent(Student student);


    /**
     * 找到对应id号的Student类对象
     *
     * @param id 用户指定id号
     * @return 找到返回Student类对象,未找到返回null
     */
    Student findStudent(int id);


    /**
     * 找到当前数据库中的所有学生对象list集合
     *
     * @return list集合,包含所有的Student类对象,如果当前数据库中数据行为空
     * 返回null
     */
    List<Student> findAll();
}

数据库端实现
package com.zx.studentsystem.dao.impl;

import com.zx.studentsystem.dao.StudentDao;
import com.zx.studentsystem.entity.Student;
import com.zx.studentsystem.util.BaseDao;

import java.util.List;

/**
 * StudentDaoImpl 数据持久化操作的实现类
 */
public class StudentDaoImpl extends BaseDao implements StudentDao {
    @Override
    public int addStudent(Student student) {
        String sql = "insert into mysql2005.student(name, age, gender, score) values (?, ?, ?, ?)";
        Object[] parameters = {student.getName(), student.getAge(), student.isGender(), student.getScore()};

        return super.update(sql, parameters);
    }

    @Override
    public int deleteStudent(int id) {
        String sql = "delete from mysql2005.student where id =" + id;
        return super.update(sql);
    }

    @Override
    public int updateStudent(Student student) {

        String sql = "update mysql2005.student set name = ?, age = ?, gender = ?, score = ? where  id = ?";
        Object[] parameters = {student.getName(), student.getAge(), student.isGender(), student.getScore(), student.getId()};

        return super.update(sql, parameters);
    }

    @Override
    public Student findStudent(int id) {
        String sql = "select * from mysql2005.student where id =" + id;
        List<Student> list = super.query(sql, Student.class);
        return list != null ? list.get(0) : null;
    }

    @Override
    public List<Student> findAll() {
        String sql = "select * from mysql2005.student";
        return super.query(sql, Student.class);
    }
}

服务端
package com.zx.studentsystem.service;

/**
 * 对外提供关于Student操作服务
 *      增加学生
 *      开除学生
 *      查询指定id学生
 *      修改学生信息
 *      查询所有学生
 *      按照指定条件过滤学生
 *      按照指定条件排序学生
 */
public interface StudentService {
    /**
     * 添加学生
     */
    void addStudent();

    /**
     * 开除学生
     */
    void removeStudent();

    /**
     * 查询指定学生
     */
    void findOneStudent();


    /**
     * 修改指定学生
     */
    void modifyStudent();


    /**
     * 查询所有学生
     */
    void  findAllStudent();


    /**
     * 过滤条件展示学生信息
     */
    void filterStudent();


    /**
     * 按照指定条件展示学生信息
     */
    void sortStudent();
}

服务端实现
package com.zx.studentsystem.service.Impl;

import com.zx.studentsystem.dao.StudentDao;
import com.zx.studentsystem.dao.impl.StudentDaoImpl;
import com.zx.studentsystem.entity.Student;
import com.zx.studentsystem.service.StudentService;

import java.util.List;
import java.util.Scanner;

public class StudentServiceImpl implements StudentService {

    /**
     * 当前StudentServiceImpl实现类中需要操作数据库持久操作
     * 这里需要StudentDao实现类支持
     */

    private StudentDao studentDao = new StudentDaoImpl();
    private static Scanner sc = new Scanner(System.in);

    @Override
    public void addStudent() {
        System.out.println("请输入学生的姓名:");
        String name = sc.nextLine();

        System.out.println("请输入学生的年龄:");
        int age = sc.nextInt();

        System.out.println("请输入学生的性别:");
        boolean gender = sc.nextBoolean();

        System.out.println("请输入学生的成绩:");
        int score = sc.nextInt();

        Student student = new Student(name, age, gender, score);

        studentDao.addStudent(student);
    }

    @Override
    public void removeStudent() {
        System.out.println("请输入学生的id号:");
        int id = sc.nextInt();

        studentDao.deleteStudent(id);

    }

    @Override
    public void findOneStudent() {

        System.out.println("请输入学生的id号:");
        int id = sc.nextInt();
        System.out.println(studentDao.findStudent(id));
    }

    @Override
    public void modifyStudent() {
        System.out.println("请输入要修改的学生的id号:");
        int id = sc.nextInt();

        sc.nextLine();
        System.out.println("请输入学生的姓名:");
        String name = sc.nextLine();

        System.out.println("请输入学生的年龄:");
        int age = sc.nextInt();

        System.out.println("请输入学生的性别:");
        boolean gender = sc.nextBoolean();

        System.out.println("请输入学生的成绩:");
        int score = sc.nextInt();

        Student student = new Student(id, name, age, gender, score);

        studentDao.updateStudent(student);

    }

    @Override
    public void findAllStudent() {

        List<Student> list = studentDao.findAll();
        if (list != null) {
            for (Student stu : list) {
                System.out.println(stu);
            }
        }
    }

    @Override
    public void filterStudent() {

        List<Student> list = studentDao.findAll();

        if (list != null) {
            System.out.println("1,年龄大于20的");
            System.out.println("2,成绩小于60的");
            int choose = sc.nextInt();

            switch (choose) {
                case 1:
                    list.stream()
                            .filter(s -> s.getAge() > 20)
                            .forEach(System.out::println);
                    break;
                case 2:
                    list.stream()
                            .filter(s -> s.getScore() < 60)
                            .forEach(System.out::println);
                    break;
            }
        }
    }

    @Override
    public void sortStudent() {
        List<Student> list = studentDao.findAll();

        if (list != null) {
            System.out.println("1,年龄升序");
            System.out.println("2,成绩降序");
            int choose = sc.nextInt();

            switch (choose) {
                case 1:
                    list.stream()
                            .sorted((s1, s2) -> s1.getAge() - s2.getAge())
                            .forEach(System.out::println);
                    break;
                case 2:
                    list.stream()
                            .sorted((s1,s2) -> s2.getScore() - s1.getScore())
                            .forEach(System.out::println);
                    break;
            }
        }

    }
}

控制台
package com.zx.studentsystem.controller;

import com.zx.studentsystem.service.Impl.StudentServiceImpl;
import com.zx.studentsystem.service.StudentService;
import com.zx.studentsystem.util.MethodEnum;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class StudentController {

    private Scanner sc = new Scanner(System.in);

    /**
     * 提供Student范围,StudentService实现类
     */
    private StudentService service = new StudentServiceImpl();

    public void controller() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        Map<Integer, String> methodMap = getMethodMap();
        while (true) {
            System.out.println("1.添加学生 addStudent");
            System.out.println("2.开除指定学生 removerStudent");
            System.out.println("3.修改指定学生 modifyStudent");
            System.out.println("4.查询指定学生 findOneStudent");
            System.out.println("5.查询所有学生 findAllStudent");
            System.out.println("6.过滤条件展示学生信息 filterStudent");
            System.out.println("7.按照指定条件展示学生信息 sortStudent");
            System.out.println("8.退出");

            int choose = sc.nextInt();
            sc.nextLine();

            if (8 == choose) {
                break;

                 /*
                choose不得大于8 不得小于等于0,不然无法在map双边队列中获取对应的数据
                 */
            } else if (choose <= 0 || choose > 8) {
                continue;
            }
             /*
            从Map中跟腱对应的choose获取对应MethodName方法名字,从StudentServiceImpl对应Class对象
            中获取对应的方法Method对象,invoke执行操作
             */
            StudentServiceImpl.class.getMethod(methodMap.get(choose)).invoke(service);
        }
    }

    /**
     * 预处理对应的Map方法双边队列
     *
     * @return Integer类型映射String方法名字的Map双边队列
     */
    private  Map<Integer, String> getMethodMap() {
        HashMap<Integer, String> map = new HashMap<>();

        map.put(1,"addStudent");
        map.put(2, "removeStudent");
        map.put(3, "modifyStudent");
        map.put(4, "findOneStudent");
        map.put(5, "findAllStudent");
        map.put(6, "filterStudent");
        map.put(7, "sortStudent");

        return map;
    }

}

主程序函数
package com.zx.studentsystem.mainProject;

import com.zx.studentsystem.controller.StudentController;

import java.lang.reflect.InvocationTargetException;

public class StudentSystem {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        new StudentController().controller();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值