JDBC高级封装和数据库连接池
1. JDBC高级封装
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9be65bb805e2c65dd6c423ba374af106.png)
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();
BeanUtils.setProperty(person, "id", 1);
BeanUtils.setProperty(person, "name", "苟磊");
BeanUtils.setProperty(person, "age", 16);
System.out.println(person);
System.out.println();
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);
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");
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;
public interface StudentDao {
int addStudent(Student student);
int deleteStudent(int id);
int updateStudent(Student student);
Student findStudent(int id);
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;
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;
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 {
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);
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;
} else if (choose <= 0 || choose > 8) {
continue;
}
StudentServiceImpl.class.getMethod(methodMap.get(choose)).invoke(service);
}
}
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();
}
}