1. 学生管理系统使用JdbcUitl,BaseDao完成数据持久化操作
1.1 Student实体类
public class Student {
private Integer id;
private String name;
private Integer age;
private Boolean gender;
private Float score;
private String address;
public Student() {
}
public Student(String name, Integer age, Boolean gender, Float score, String address) {
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
this.address = address;
}
public Student(Integer id, String name, Integer age, Boolean gender, Float score, String address) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
this.address = address;
}
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Float getScore() {
return score;
}
public void setScore(Float score) {
this.score = score;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", score=" + score +
", address='" + address + '\'' +
'}';
}
}
1.2 StudentDao规范
public interface StudentDao {
int addStudent(Student student);
int deleteStudent(int id);
int updateStudent(Student student);
Student findStudentById(int id);
List<Student> findAllStudent();
}
1.3 StudentDaoImpl实现
public class StudentDaoImpl extends BaseDao implements StudentDao {
@Override
public int addStudent(Student student) {
String sql = "insert into student(name, age, gender, score, address) value (?, ?, ?, ?, ?)";
Object[] parameters = {student.getName(), student.getAge(), student.getGender()
, student.getScore(), student.getAddress()};
return super.update(sql, parameters);
}
@Override
public int deleteStudent(int id) {
String sql = "delete from student where id = " + id;
return super.update(sql, null);
}
@Override
public int updateStudent(Student student) {
String sql = "update student set name = ?, age = ?, gender = ?, score = ?, address = ? where id = ?";
Object[] parameters = {student.getName(), student.getAge(), student.getGender()
, student.getScore(), student.getAddress(), student.getId()};
return super.update(sql, parameters);
}
@Override
public Student findStudentById(int id) {
String sql = "select * from student where id = " + id;
Student student = super.queryBean(sql, null, Student.class);
return student;
}
@Override
public List<Student> findAllStudent() {
String sql = "select * from student";
return super.queryBeanList(sql, null, Student.class);
}
}
1.4 StudentService规范
public interface StudentService {
boolean addStudent(Student student);
boolean deleteStudentById(Integer id);
boolean updateStudent(Student student);
Student findStudentById(Integer id);
List<Student> findAllStudents();
List<Student> sortUsingCompare(Comparator<Student> comparator);
}
1.5 StudentServiceImpl实现
public class StudentServiceImpl implements StudentService {
StudentDao studentDao = new StudentDaoImpl();
@Override
public boolean addStudent(Student student) {
return studentDao.addStudent(student) != 0;
}
@Override
public boolean deleteStudentById(Integer id) {
return studentDao.deleteStudent(id) != 0;
}
@Override
public boolean updateStudent(Student student) {
return studentDao.updateStudent(student) != 0;
}
@Override
public Student findStudentById(Integer id) {
return studentDao.findStudentById(id);
}
@Override
public List<Student> findAllStudents() {
return studentDao.findAllStudent();
}
@Override
public List<Student> sortUsingCompare(Comparator<Student> comparator) {
List<Student> list = studentDao.findAllStudent();
if (list != null) {
list.sort(comparator);
}
return list;
}
}
1.6 StudentView规范
public interface StudentView {
void inputStudentId();
void inputStudentName();
void inputStudentAge();
void inputStudentGender();
void inputStudentScore();
void inputStudentAddress();
void showStudentInfo(Student student);
void deleteConfirm();
void operationCancel();
void notFound();
void showStudentList(List<Student> students);
void sortOperationChoose();
void modifyStudentMenu(Student student);
void chooseError();
void mainMenu();
}
1.7 StudentViewImpl实现
public class StudentViewImpl implements StudentView {
@Override
public void inputStudentId() {
System.out.println("请输入学生的ID号:");
}
@Override
public void inputStudentName() {
System.out.println("请输入学生的姓名:");
}
@Override
public void inputStudentAge() {
System.out.println("请输入学生的年龄:");
}
@Override
public void inputStudentGender() {
System.out.println("请输入学生的性别 true => 男 false => 女:");
}
@Override
public void inputStudentScore() {
System.out.println("请输入学生的成绩:");
}
@Override
public void inputStudentAddress() {
System.out.println("请输入学生的地址:");
}
@Override
public void showStudentInfo(Student student) {
System.out.println(student);
}
@Override
public void deleteConfirm() {
System.out.println("确定删除吗? true or false");
}
@Override
public void operationCancel() {
System.out.println("操作取消");
}
@Override
public void notFound() {
System.out.println("查无此人");
}
@Override
public void showStudentList(List<Student> students) {
for (Student student : students) {
System.out.println(student);
}
}
@Override
public void sortOperationChoose() {
System.out.println("1. 年龄升序");
System.out.println("2. 成绩降序");
}
@Override
public void modifyStudentMenu(Student student) {
System.out.println("ID:" + student.getId() + " Name:" + student.getName());
System.out.println("Age:" + student.getAge() + " Gender:" + (student.getGender() ? "男" : "女"));
System.out.println("Score:" + student.getScore() + " Address:" + student.getAddress());
System.out.println("1. 修改学生的名字");
System.out.println("2. 修改学生的年龄");
System.out.println("3. 修改学生的性别");
System.out.println("4. 修改学生的成绩");
System.out.println("5. 修改学生的地址");
System.out.println("6. 退出保存");
}
@Override
public void chooseError() {
System.out.println("选择错误!!!");
}
@Override
public void mainMenu() {
System.out.println("1. 添加学生");
System.out.println("2. 删除指定ID学生");
System.out.println("3. 修改指定ID学生");
System.out.println("4. 查询指定ID学生");
System.out.println("5. 查询所有学生");
System.out.println("6. 按照条件排序学生信息");
System.out.println("7. 退出");
}
}
1.8 StudentController实现
public class StudentController {
private StudentService studentService = new StudentServiceImpl();
private StudentView studentView = new StudentViewImpl();
private Scanner scanner = new Scanner(System.in);
public void addStudent() {
studentView.inputStudentName();
String name = scanner.next();
studentView.inputStudentAge();
int age = scanner.nextInt();
studentView.inputStudentGender();
boolean gender = scanner.nextBoolean();
studentView.inputStudentScore();
float score = scanner.nextFloat();
studentView.inputStudentAddress();
String address = scanner.next();
Student student = new Student(name, age, gender, score, address);
studentService.addStudent(student);
}
public void deleteStudent() {
studentView.inputStudentId();
int id = scanner.nextInt();
Student student = studentService.findStudentById(id);
if (null == student) {
studentView.notFound();
return;
}
studentView.showStudentInfo(student);
studentView.deleteConfirm();
if (scanner.nextBoolean()) {
studentService.deleteStudentById(id);
} else {
studentView.operationCancel();
}
}
public void modifyStudentById() {
studentView.inputStudentId();
int id = scanner.nextInt();
Student student = studentService.findStudentById(id);
if (null == student) {
studentView.notFound();
return;
}
int choose = 0;
boolean flag = false;
while (true) {
studentView.modifyStudentMenu(student);
choose = scanner.nextInt();
switch (choose) {
case 1:
studentView.inputStudentName();
String name = scanner.next();
student.setName(name);
break;
case 2:
studentView.inputStudentAge();
int age = scanner.nextInt();
student.setAge(age);
break;
case 3:
studentView.inputStudentGender();
boolean gender = scanner.nextBoolean();
student.setGender(gender);
break;
case 4:
studentView.inputStudentScore();
float score = scanner.nextFloat();
student.setScore(score);
break;
case 5:
studentView.inputStudentAddress();
String address = scanner.next();
student.setAddress(address);
break;
case 6:
flag = true;
break;
default:
studentView.chooseError();
break;
}
if (flag) {
studentService.updateStudent(student);
break;
}
}
}
public void findStudentById() {
studentView.inputStudentId();
int id = scanner.nextInt();
Student student = studentService.findStudentById(id);
if (student != null) {
studentView.showStudentInfo(student);
} else {
studentView.notFound();
}
}
public void findAllStudent() {
List<Student> list = studentService.findAllStudents();
if (list != null) {
studentView.showStudentList(list);
} else {
studentView.notFound();
}
}
public void sort() {
studentView.sortOperationChoose();
int choose = scanner.nextInt();
List<Student> list = null;
switch (choose) {
case 1:
list = studentService.sortUsingCompare(Comparator.comparingInt(Student::getAge));
break;
case 2:
list = studentService.sortUsingCompare((stu1, stu2) -> {
BigDecimal bigDecimal1 = new BigDecimal(stu1.getScore() + "");
BigDecimal bigDecimal2 = new BigDecimal(stu2.getScore() + "");
return bigDecimal2.compareTo(bigDecimal1);
});
break;
default:
studentView.chooseError();
break;
}
if (list != null) {
studentView.showStudentList(list);
} else {
studentView.notFound();
}
}
public void mainMenu() {
studentView.mainMenu();
}
public void chooseError() {
studentView.chooseError();
}
}
1.9 StudentProject main方法
public class MainProject {
private static Scanner scanner = new Scanner(System.in);
private static StudentController studentController = new StudentController();
public static void main(String[] args) {
int choose = 0;
boolean flag = true;
while (flag) {
studentController.mainMenu();
choose = scanner.nextInt();
switch (choose) {
case 1:
studentController.addStudent();
break;
case 2:
studentController.deleteStudent();
break;
case 3:
studentController.modifyStudentById();
break;
case 4:
studentController.findStudentById();
break;
case 5:
studentController.findAllStudent();
break;
case 6:
studentController.sort();
break;
case 7:
flag = false;
break;
default:
studentController.chooseError();
break;
}
}
}
}
2. 轻量级数据库ORM框架DbUtils
2.1 DbUtils介绍
Apache组织下的一个轻量级ORM框架
Commons DbUtils: JDBC Utility Component
两个核心方法
update方法 ==> insert,update,delete
query方法 ==> select
一个核心类
QueryRunner DbUtils的核心类
2.2 DbUtils ORM工具使用
import com.qfedu.b_studentsys.entity.Student;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import util.JdbcUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class DbUtilsTest {
@Test
public void testInsert() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "insert into student(name, age, gender, score, address) value(?, ?, ?, ?, ?)";
Object[] parameters = {"lb", 20, true, 82, "lnas"};
Connection connection = JdbcUtil.getConnection();
runner.update(connection, sql, parameters);
JdbcUtil.close(connection);
}
@Test
public void testQuery1() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id = 1";
Connection connection = JdbcUtil.getConnection();
Student student = runner.query(connection, sql, rs -> {
Student stu = null;
if (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
boolean gender = rs.getBoolean("gender");
float score = rs.getFloat("score");
String address = rs.getString("address");
stu = new Student(id, name, age, gender, score, address);
}
return stu;
});
System.out.println(student);
JdbcUtil.close(connection);
}
@Test
public void queryBean() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id = 1";
Connection connection = JdbcUtil.getConnection();
Student student = runner.query(connection, sql, new BeanHandler<>(Student.class));
System.out.println(student);
JdbcUtil.close(connection);
}
@Test
public void queryBeanList() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id > ?";
Connection connection = JdbcUtil.getConnection();
List<Student> list = runner.query(connection, sql, new BeanListHandler<>(Student.class), 2);
for (Student student : list) {
System.out.println(student);
}
JdbcUtil.close(connection);
}
@Test
public void queryArray() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id = 1";
Connection connection = JdbcUtil.getConnection();
Object[] values = runner.query(connection, sql, new ArrayHandler());
System.out.println(Arrays.toString(values));
JdbcUtil.close(connection);
}
@Test
public void queryArrayList() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id > ?";
Connection connection = JdbcUtil.getConnection();
List<Object[]> list = runner.query(connection, sql, new ArrayListHandler(), 2);
for (Object[] values : list) {
System.out.println(Arrays.toString(values));
}
JdbcUtil.close(connection);
}
@Test
public void queryMap() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id = 1";
Connection connection = JdbcUtil.getConnection();
Map<String, Object> map = runner.query(connection, sql, new MapHandler());
System.out.println(map);
}
@Test
public void queryMapList() throws SQLException {
QueryRunner runner = new QueryRunner();
String sql = "select * from student where id > ?";
Connection connection = JdbcUtil.getConnection();
List<Map<String, Object>> mapList = runner.query(connection, sql, new MapListHandler(), 2);
for (Map<String, Object> map : mapList) {
System.out.println(map);
}
}
}
2.3 ResultHandler以及其子类
ResultSetHandler 核心接口
ResultSet结果集 Handler处理,
核心方法 handler(ResultSet rs)
BeanHandler:
处理符合JavaBean规范的类对象,传入参数是对应JavaBean规范 Class对象
BeanListHandler:
处理符合JavaBean规范的实体类,并且返回值是一个List集合包含制定的JavaBean实体类
ArrayHandler:
查询一个数据行,数据行中的所有数据整合成一个Object类型数组返回
ArrayListHandler:
查询结果集中所有数据行,每一行数据对应一个Object类型数组,存储在List集合中
MapHandler:
处理一个数据行,数据行中字段是对应Key,字段对应数据是value,组成一个Map双边队列
MapListHandler:
结果集中所有的数据行,每一行对应一个Map对象,字段名为Key,字段对应的数据为value,所有数据行存储在List中