This commit is contained in:
LittleBoy 2020-12-23 16:51:59 +08:00
commit fe9e8b1482
19 changed files with 723 additions and 0 deletions

8
.classpath Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="lib" path="src/jars/mysql-connector-java-5.1.37.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
<classpathentry kind="output" path="bin"/>
</classpath>

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
.DS_Store
*.bak
bin

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Book</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7

70
src/Application.java Normal file
View File

@ -0,0 +1,70 @@
import java.sql.SQLException;
import java.util.List;
import bean.Book;
import utils.DbUtil;
import utils.system;
public class Application {
private DbUtil db = DbUtil.createDBUtil();
public static void main(String[] args) {
new Application().run();
}
private void run() {
System.out.println("欢迎使用图书管理系统 ");
System.out.println("\t v1.0.0");
System.out.println("--------系统菜单---------");
System.out.println(" 1.检索全部图书");
System.out.println(" 2.根据编号查询图书");
System.out.println(" 3.添加图书");
System.out.println(" 4.修改图书信息");
System.out.println(" 5.删除图书");
System.out.println(" 6.退出系统");
System.out.println("--------------------------");
try {
int input = Integer.parseInt(system.input("请选择要进行的操作编号:")); // 获取输入
if (input == 1) {
// 全部
showAllBook();
}
// else if (input == 2) {
// // 根据编号查询
// queryBook();
// } else if (input == 3) {
// // 添加
// addBook();
// } else if (input == 4) {
// modifyBook();// 修改
// } else if (input == 5) {
// removeBook(); // 删除
// }
else if (input == 6) {
System.out.println("已经退出系统了");
return; // 推出递归
} else {
System.err.println("选择错误");
}
run();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void showAllBook() throws SQLException {
if (db.count("book") == 0) {
system.error("还没有入库任何图书");
return;
}
system.println("编号\t图书名称\t作者\t价格\t出版社");
List<Book> list = db.queryList(Book.class);
for (Book book : list) {
system.println(book.getId(), '\t', book.getName(), '\t', book.getAuthor().getName(), '\t', book.getPrice(),
'\t', book.getPublisher().getName());
}
}
}

50
src/bean/Author.java Normal file
View File

@ -0,0 +1,50 @@
package bean;
import utils.Table;
import utils.TableField;
@Table(name = "author")
public class Author extends BaseModel {
@TableField(pk = true, autoIncrement = true)
private int id;
@TableField()
private String name;
public Author() {
super();
}
public Author(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Author(String name) {
super();
this.name = name;
}
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;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id + "@" + this.name;
}
}

33
src/bean/BaseModel.java Normal file
View File

@ -0,0 +1,33 @@
package bean;
import java.util.Date;
import utils.TableField;
public class BaseModel {
@TableField(name="create_time")
protected Date createTime;
@TableField(name="update_time")
protected Date updateTime;
protected short status;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public short getStatus() {
return status;
}
public void setStatus(short status) {
this.status = status;
}
}

52
src/bean/Book.java Normal file
View File

@ -0,0 +1,52 @@
package bean;
import utils.TableField;
import utils.Table;
@Table(name = "book")
public class Book extends BaseModel {
@TableField()
private int id;
@TableField()
private String name;
@TableField()
private Author author;
@TableField()
private Publisher publisher;
@TableField()
private float price;
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 Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Publisher getPublisher() {
return publisher;
}
public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}

24
src/bean/Publisher.java Normal file
View File

@ -0,0 +1,24 @@
package bean;
import utils.TableField;
import utils.Table;
@Table(name = "publisher")
public class Publisher extends BaseModel {
@TableField()
private int id;
@TableField()
private String name;
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;
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

29
src/jars/t.sql Normal file
View File

@ -0,0 +1,29 @@
DROP TABLE IF EXISTS author;
CREATE TABLE author(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL,
create_time DATETIME,
update_time DATETIME,
STATUS TINYINT(2) DEFAULT 1
);
DROP TABLE IF EXISTS publisher;
CREATE TABLE publisher(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL,
create_time DATETIME,
update_time DATETIME,
STATUS TINYINT(2) DEFAULT 1
);
DROP TABLE IF EXISTS book;
CREATE TABLE book(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL,
author INT(10) REFERENCES author(id),
publisher INT(10) REFERENCES publisher(id),
price DECIMAL(10,2) NOT NULL,
create_time DATETIME,
update_time DATETIME,
STATUS TINYINT(2) DEFAULT 1
);
INSERT INTO `books`.`author`(`id`,`name`,`create_time`,`update_time`,`status`) VALUES ( NULL,'zhangsan','2020-12-22','2020-12-22','1')

61
src/test/DbUtilTest.java Normal file
View File

@ -0,0 +1,61 @@
package test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import bean.Author;
import utils.DbUtil;
public class DbUtilTest {
DbUtil db = DbUtil.createDBUtil();
@Test
public void testGetModel() throws Exception {
Map<String, String> fs = db.getModel("bean.Book");
Assert.assertEquals("price", fs.get("price"));
Assert.assertEquals("update_time", fs.get("updateTime"));
}
@Test
public void testAuthor() throws Exception {
Author t = db.get(Author.class, "select * from author where id = ?",1);
// assertNotNull(t);
if(t != null) {
assertEquals(1, t.getId());
System.out.println(t);
}
List<Author> list = db.queryList(Author.class, "select * from author limit 1");
assertEquals(1, list.size());
}
@Test
public void testAddAuthor() throws SQLException {
int ret = db.save("insert into author (name,create_time,update_time) values (?,now(),now())","lisi");
assertEquals(1, ret);
}
public static void main(String[] args) throws Exception {
// testGetModel();
Class<Author> cls = Author.class;
List<Field> fs = new ArrayList<Field>();
fs.addAll(Arrays.asList(cls.getDeclaredFields()));
Class<?> parent = cls.getSuperclass();
if (parent.getName().equalsIgnoreCase("bean.BaseModel")) {
fs.addAll(Arrays.asList(parent.getDeclaredFields()));
}
for (Field f : fs) {
System.out.println(f.getName());
}
}
}

View File

@ -0,0 +1,55 @@
package utils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class BeanProperty {
public String name;
public String field;
public String type;
public String pk = null;
public boolean autoIncrement = false;
public boolean fromSuper = false;
public BeanProperty() {
}
public BeanProperty(String name, String field, String type) {
this.name = name;
this.field = field;
this.type = type;
}
public BeanProperty(String name, String field, String type, boolean fromSuper) {
this.name = name;
this.field = field;
this.type = type;
this.fromSuper = fromSuper;
}
public static List<BeanProperty> getProperties(String className) throws ClassNotFoundException {
List<BeanProperty> map = new ArrayList<BeanProperty>();
Class<?> cls = Class.forName(className);
Class<?> parent = cls.getSuperclass();
parseFields(cls.getDeclaredFields(), map, false);
if (parent.getName().equalsIgnoreCase("bean.BaseModel")) {
parseFields(parent.getDeclaredFields(), map, true);
}
return map;
}
private static void parseFields(Field[] fs, List<BeanProperty> map, boolean fromSuper) {
for (Field f : fs) {
TableField tf = f.getAnnotation(TableField.class);
if (tf != null) {
BeanProperty bp = new BeanProperty(f.getName(), "".equals(tf.name()) ? f.getName() : tf.name(),
f.getType().getName(), fromSuper);
bp.pk = tf.relationKey();
map.add(bp);
}
}
}
}

246
src/utils/DbUtil.java Normal file
View File

@ -0,0 +1,246 @@
package utils;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbUtil {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("加载驱动失败:" + e.getMessage());
}
}
private static Connection conn;
private PreparedStatement ps;
private ResultSet rs;
// private static DbUtil dbUtil = null;
public static DbUtil createDBUtil() {
return createDBUtil("jdbc:mysql://127.0.0.1:3306/books", "root", "123456");
}
public static DbUtil createDBUtil(String url, String user, String pwd) {
// if (dbUtil == null) {
// dbUtil =;
// }
return new DbUtil(url, user, pwd);
}
private DbUtil(String url, String user, String pwd) {
try {
conn = DriverManager.getConnection(url, user, pwd);
} catch (SQLException e) {
e.printStackTrace();
}
}
public Map<String, String> getModel(String className) throws ClassNotFoundException {
Map<String, String> map = new HashMap<String, String>();
Class<?> cls = Class.forName(className);
Class<?> parent = cls.getSuperclass();
List<Field> fs = new ArrayList<Field>();
fs.addAll(Arrays.asList(cls.getDeclaredFields()));
if (parent.getName().equalsIgnoreCase("bean.BaseModel")) {
fs.addAll(Arrays.asList(parent.getDeclaredFields()));
}
for (Field f : fs) {
TableField tf = f.getAnnotation(TableField.class);
if (tf != null) {
map.put(f.getName(), "".equals(tf.name()) ? f.getName() : tf.name());
}
}
return map;
}
public void dispose() {
dispose(false);
}
public void dispose(boolean closeConnection) {
if (null != rs) {
try {
rs.close();
this.rs = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != ps) {
try {
ps.close();
this.ps = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
if (closeConnection) {
if (null != conn) {
try {
conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public <T> int save(String sql, Object... params) throws SQLException {
prepareStatement(sql, params);
int count = ps.executeUpdate();
this.dispose();
return count;
}
private void prepareStatement(String sql, Object... params) throws SQLException {
ps = conn.prepareStatement(sql);
if (params.length > 0) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
}
}
private void executeQuery(String sql, Object... params) throws SQLException {
prepareStatement(sql, params);
rs = ps.executeQuery();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> T get(Class cls, String sql, Object... params) throws SQLException {
executeQuery(sql, params);
T t = null;
if (rs.next()) {
t = (T) convertToBean(cls);
}
this.dispose();
return t;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> List<T> queryList(Class cls, String sql, Object... params) throws SQLException {
executeQuery(sql, params);
List<T> ts = new ArrayList<T>();
while (rs.next()) {
ts.add((T) convertToBean(cls));
}
this.dispose();
return ts;
}
@SuppressWarnings("unused")
private boolean inArray(String[] arr, String str) {
for (String s : arr) {
if (str.equalsIgnoreCase(s)) {
return true;
}
}
return false;
}
// private static SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@SuppressWarnings("unused")
private boolean isDBNull(ResultSet rs,String key) {
return true;
}
private <T> Object getValueFromResult(BeanProperty p, Field f, T t) throws SQLException, ClassNotFoundException {
// String[] basicType = { "int", "float", "short", "long", "java.lang.String" };
String type = p.type.toLowerCase();
if (type.equals("int")) { // 基本类型
return rs.getInt(p.field);
}else if (type.equals("float")) { // 基本类型
return rs.getFloat(p.field);
}else if (type.equals("double")) { // 基本类型
return rs.getDouble(p.field);
}else if (type.equals("short")) { // 基本类型
return rs.getShort(p.field);
}else if (type.equals("long")) { // 基本类型
return rs.getLong(p.field);
}else if (type.equals("java.lang.string")) { // 基本类型
return rs.getString(p.field);
} else if (type.equals("java.util.date")) { // 日期类型
Object v = rs.getObject(p.field);
if(null == v) return null;
return new Date(rs.getDate(p.field).getTime());
} else {
String pk = p.pk;
if (null == p.pk || "".equals(p.pk)) {
pk = "id";
}
Class<?> cls = Class.forName(p.type);
Table table = cls.getAnnotation(Table.class);
if(table == null) return null;
String tableName = table.name();
if (tableName == null || "".equals(tableName)) {
tableName = cls.getSimpleName();
}
return createDBUtil().get(cls, "select * from " + tableName + " where " + pk + "=?", rs.getObject(p.field));
}
}
private <T> T convertToBean(Class<T> cls) throws SQLException {
String name = cls.getName();
T t = null;
try {
t = (T) cls.newInstance();
List<BeanProperty> props = BeanProperty.getProperties(name);
Class<?> parent = cls.getSuperclass();
for (BeanProperty p : props) {
Field f = p.fromSuper ? parent.getDeclaredField(p.name) : cls.getDeclaredField(p.name);
f.setAccessible(true);
f.set(t, getValueFromResult(p, f, t));
}
} catch (ClassNotFoundException e) {
throw new SQLException("ClassNotFoundException:" + name);
} catch (NoSuchFieldException e) {
throw new SQLException("转换实体失败(没有找到对应字段 " + e.getMessage() + ")");
} catch (SecurityException e) {
throw new SQLException("SecurityException:" + e.getMessage());
} catch (IllegalArgumentException e) {
throw new SQLException("IllegalArgumentException:" + e.getMessage());
} catch (IllegalAccessException e) {
throw new SQLException("IllegalAccessException:" + e.getMessage());
} catch (InstantiationException e) {
throw new SQLException("InstantiationException:" + e.getMessage());
}
return t;
}
public int count(String tableName) {
int count = 0;
try {
executeQuery("select count(*) as total_count from " + tableName);
if (rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.dispose();
}
return count;
}
public <T> List<T> queryList(Class<T> cls) throws SQLException {
String tableName = cls.getAnnotation(Table.class).name();
if (tableName == null || "".equals(tableName)) {
tableName = cls.getSimpleName();
}
return queryList(cls, "select * from " + tableName);
}
}

12
src/utils/Table.java Normal file
View File

@ -0,0 +1,12 @@
package utils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
public String name();
}

18
src/utils/TableField.java Normal file
View File

@ -0,0 +1,18 @@
package utils;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableField {
public String name() default "";
public String relationKey() default "";
public boolean pk() default false;
public boolean autoIncrement() default false;
// public Class<?> reference();
}

33
src/utils/system.java Normal file
View File

@ -0,0 +1,33 @@
package utils;
import java.util.Scanner;
public class system {
private static String parseMessage(Object... params) {
StringBuilder sb = new StringBuilder();
for (Object o : params) {
sb.append(o);
}
return sb.toString();
}
public static void println(Object... params) {
System.out.println(parseMessage(params));
}
public static void error(Object... params) {
System.err.println(parseMessage(params));
}
public static String input() {
return input(null);
}
public static String input(String msg) {
if (null != msg) {
System.out.print(msg);
}
Scanner s = new Scanner(System.in);
return s.nextLine();
}
}