国庆假期之前的一段时间,由于实习公司没有什么事情,在公司划水给学弟学习jdbc的时候提供了一个很简单的图书管理程序,手写的含有数据库操作,觉得挺有意思,之前没有认真想过java封装的好处,一些调用的关系,我们通过方法的互调之间可以将思路理清楚,springboot的一个启动类直接就能开启内部的切入服务器,当然springboot不需要我们写那么多的配置代码,原因自然是人家内部写好了,约定大于配置可不是随口一说的。使用多了springboot让我对于spring框架也产生了厌倦。现在我们进入正题,设计的案例描述在这里:
案例描述:要求运行主类main方法后,控制台提示输入管理员账号密码登录,登陆成功后显示如下:
------------------------------------------------------------
请您输入编号进行相关书籍管理操作:
- 查看书籍列表
- 添加书籍
- 删除书籍
------------------------------------------------------------
当输入1之后显示全部书籍信息(书籍编号,书籍名称,书籍余量,书籍分类);
当输入2之后控制台显示如下:
------------------------------------------------------------
请您输入新书籍的名称:
------------------------------------------------------------
当输入书籍名称之后控制台显示如下:
------------------------------------------------------------
请您输入新书籍的数量:
------------------------------------------------------------
当输入书籍数量之后控制台显示如下:
------------------------------------------------------------
请您输入新书籍的分类:
------------------------------------------------------------
当输入书籍分类之后控制台显示:
------------------------------------------------------------
添加新书籍成功!输入index返回功能页面
删除目前案例可以不完成,但是可以模仿以上的逻辑设计删除书籍的操作交互,另外存储书籍信息必须采用mysql数据库,如采用List等java容器存储实现则视为案例失败。
案例技术需求:java语言基础,java JDBC。
案例提示:无。
案例描述就如此简单,相信很多学java的小伙伴会觉得很简单,但是如何优化其中的代码确是我们需要考虑的一个点,其次,代码不复用,降低耦合度也是一个点,这里我就不再说太多啦,大家看我写的一个实现,当然我写的也是有一部分问题的,但是呢,哈哈哈哈我懒啊!留给感兴趣的小伙伴修改吧!
1、首先是图书实体:
import lombok.Data;
@Data
/**
* 配置一个Book对象接收数据查询出来的一条记录
*/
public class Book {
private int bookId;
private String bookName;
private int bookAccount;
private String bookKind;
}
2、其次是封装的jdbc操作实现类:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBC {
private static final String url = "jdbc:mysql://localhost:3306/test";
private static final String username = "root";
private static final String password = "数据库用户密码";
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static Connection connection;
/**
* 获取数据库连接,有开有闭记得写释放连接的方法。
*/
public static void getConnection() {
try {
/*反射加载驱动*/
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println("反射驱动类失败!");
}
try {
/*利用驱动管理对象获取数据库连接*/
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败!");
}
}
/**
* 案例模拟登录
*
* @param phone 手机号
* @param password 密码
* @return 是否登录成功
*/
public static Boolean login(String phone, String password) {
int sign = 0;
getConnection();
try {
ResultSet resultSet = connection.createStatement().
executeQuery("select * from test.sys_user where phoneNum =" + phone + " and password = " + password + " limit 1");
if (resultSet.next())
sign = 1;
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
shutConnection();
return sign == 1;
}
/**
* 查询全部书籍
*
* @return 书籍列表容器对象
*/
public static List<Book> findAllBook() {
/*容器初始化为16,超过16时会触发容器的扩容机制*/
List<Book> bookList = new ArrayList<>(16);
getConnection();
try {
ResultSet resultSet = connection.createStatement().executeQuery("select * from jdbctest.jdbc_book");
while (resultSet.next()) {
Book book = new Book();
book.setBookId(resultSet.getInt("bookId"));
book.setBookName(resultSet.getString("bookName"));
book.setBookAccount(resultSet.getInt("bookAccount"));
book.setBookKind(resultSet.getString("bookKind"));
bookList.add(book);
}
resultSet.close();
shutConnection();
return bookList;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 增加新书籍
*
* @param book 书籍对象
* @return 是否添加新书籍成功
*/
public static Boolean addNewBook(Book book) {
getConnection();
try {
int i = 0;
PreparedStatement preparedStatement = connection.prepareStatement("insert into jdbctest.jdbc_book (BOOKNAME, BOOKACCOUNT, BOOKKIND) value (?,?,?)");
preparedStatement.setString(1,book.getBookName());
preparedStatement.setInt(2,book.getBookAccount());
preparedStatement.setString(3,book.getBookKind());
i = preparedStatement.executeUpdate();
shutConnection();
return i == 1;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 删除书籍根据书籍名称
*
* @param bookName 书籍名称
* @return 是否删除书籍成功
*/
public static Boolean deleteBookByBookName(String bookName) {
getConnection();
try {
PreparedStatement preparedStatement = connection.prepareStatement("delete from jdbctest.jdbc_book where bookName = ?");
preparedStatement.setString(1,bookName);
int i = preparedStatement.executeUpdate();
shutConnection();
return i == 1;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 释放数据库连接,有开有闭。
*/
public static void shutConnection() {
try {
connection.close();
} catch (SQLException e) {
System.out.println("关闭数据库连接失败!");
}
}
}
3、然后是封装的一些简单的工具类:
import java.util.List;
import java.util.Scanner;
public class Util {
/**
* 主体功能选项页面
*/
public static void getIndexNum() {
for (int i = 0; i <= 10; i++)
System.out.print("-");
System.out.println("请输入选项编号确认您的操作:");
System.out.println("1,查看全部书籍");
System.out.println("2,添加新书籍");
System.out.println("3,删除书籍");
for (int i = 0; i <= 10; i++)
System.out.print("-");
}
/**
* 判定输入的功能选项参数给出响应
*
* @param num 功能选项参数
* @return 相应的功能执行体
*/
public static Object judgeIndexNum(int num) {
if (num == 1) {
List<Book> bookList = JDBC.findAllBook();
if (bookList != null)
System.out.println(bookList);
else
System.out.println("查看全部书籍失败");
} else if (num == 2) {
Book book = new Book();
System.out.println("请输入新书籍名");
book.setBookName(getScanner().nextLine());
System.out.println("请输入新书籍数量");
book.setBookAccount(getScanner().nextInt());
System.out.println("请输入新书籍种类");
book.setBookKind(getScanner().nextLine());
Boolean addNewBook = JDBC.addNewBook(book);
if (Boolean.TRUE.equals(addNewBook))
System.out.println("添加新书籍成功!");
else
System.out.println("添加新书籍失败!");
} else {
System.out.println("请输入您想要删除的书籍名:");
String bookName = getScanner().nextLine();
Boolean deleteBookByBookName = JDBC.deleteBookByBookName(bookName);
if (Boolean.TRUE.equals(deleteBookByBookName))
System.out.println("删除书籍成功!");
else
System.out.println("删除书籍失败!");
}
return null;
}
/**
* 通过判定返回功能主体页面
*
* @param index 返回确认参数
*/
public static void returnIndex(String index) {
if (index.equals("index"))
getIndexNum();
}
/*获取输入流,定向系统输入*/
public static Scanner getScanner() {
return new Scanner(System.in);
}
}
4、最后是启动类:
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
System.out.println("欢迎登录图书管理系统");
System.out.println("请输入管理员手机号:");
Scanner scanner = Util.getScanner();
String phone = scanner.nextLine();
System.out.println("请输入管理员密码:");
String password = scanner.nextLine();
System.out.println("正在登录校验........");
Boolean login = JDBC.login(phone, password);
if (login){
System.out.println("亲爱的"+phone+",欢迎登录!");
com.jdbc.AnLi_2.Util.getIndexNum();
while (true){
int num = com.jdbc.AnLi_2.Util.getScanner().nextInt();
com.jdbc.AnLi_2.Util.judgeIndexNum(num);
System.out.println("---------------输入index返回功能主页----------------------");
String index = com.jdbc.AnLi_2.Util.getScanner().nextLine();
com.jdbc.AnLi_2.Util.returnIndex(index);
}
}
else
System.out.println("登录失败!");
}
}
这些代码运行起来之后就是按照我们案例上描述的那样运行,实现的是假web页面的交互,当然这个案例对刚学习jdbc的小伙伴们比较有好处哈!
以下是运行的图片展示: