总结:前前后后做了有一周多一个周末,在自己单独做过一个之后,又以小组的形式基本是重新写又添加了一些功能做了一个比较完整的案例,细节还是有些不完美,所以给大家分享一下部分心得体会,如有错误,望大佬指正!
1.设计流程
①功能确定,数据库表的确定
②原型设计
③案例分工
④代码编写
⑤修改完善制作汇报ppt
2.效果图
部分功能如图;
完成总结:
大部分功能还是比较基础的也比较简单,只有几个点是稍微有些难度,通过这次的小组合作发现同学们学习的知识掌握还是不够全面,所以我希望可以尽自己所能,帮助到自己的同学。我也感觉到了原型设计方面,自己的不足,回头看自己所做的原型设计都谈不上低保真,只有一个大概样子,属实是有些丑的,所以我准备在做一个简单软件,在原型设计上多下功夫,先保证学习中不会有太多遗漏。
3.分享
/**
*
* @Description 自动获取数据库表生成实体类
* @Author Mr.chen
* @Date 2020年11月24日下午10:05:33
*
* 使用方法:
* 修改修改表名,库名,ip,端口,以及账户即可
* 将类放在需要生成实体类的包下,即可自动生成
*
*/
public class DBEntityTool {
public static void main(String[] args) {
try {
new DBEntityTool().setEntityTxt();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private final static String DBTABLENAME = "timeone";
private final static String DBDRIVER = "jdbc:mysql://175.24.68.225:3306/timeone?serverTimezone=UTC";
private final static String DBNAME = "root";
private final static String DBPASS = "root";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取库中的所有列表的名字
*/
private List<String> getTablesName() throws SQLException{
List<String> list = new ArrayList<String>();
Connection connection = DriverManager.getConnection(DBDRIVER,DBNAME,DBPASS);
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getTables(DBTABLENAME, null, null, null);
while(tables.next()) {
list.add(tables.getString("TABLE_NAME"));
}
tables.close();
connection.close();
return list;
}
/*
* 获取库中表的列
*/
private Map<String,List<Colunminfo>> getTableColunm(String tablesname) throws SQLException{
Map<String,List<Colunminfo>> map = new HashMap<>();
Connection connection = DriverManager.getConnection(DBDRIVER,DBNAME,DBPASS);
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getColumns(DBTABLENAME, null, tablesname, null);
List<Colunminfo> list = new ArrayList<Colunminfo>();
while(tables.next()) {
String tname = tables.getString("COLUMN_NAME");
String ttype = tables.getString("TYPE_NAME");
Colunminfo col = new Colunminfo(tname,ttype);
list.add(col);
}
map.put(tablesname,list);
return map;
}
/*
* 生成实体类的文本
*/
private void setEntityTxt() throws SQLException, IOException{
List<String> tablesName = getTablesName();
@SuppressWarnings("rawtypes")
Class clazz = DBEntityTool.class;
Package package1 = clazz.getPackage();
for (String str : tablesName) {
Map<String, List<Colunminfo>> tableColunm = getTableColunm(str);
StringBuffer txt = new StringBuffer();
txt.append(package1.toString() + ";\n");
txt.append("public class " + setFirstUpper(str) + "{\n");
List<Colunminfo> list = tableColunm.get(str);
for (Colunminfo col : list) {
txt.append("\tprivate " + castSqlToJava(col.getCtype()) + " " + col.getCname() + ";\n");
}
for (Colunminfo col : list) {
txt.append("\tpublic void set" + setFirstUpper(col.getCname()) + "(" + castSqlToJava(col.getCtype()) + " " + col.getCname() + "){\n" + "\t\tthis." + col.getCname() + "=" + col.getCname() + ";\n\t}\n" );
txt.append("\tpublic " + castSqlToJava(col.getCtype()) + " get" + setFirstUpper(col.getCname()) + "(){\n" + "\t\treturn " + col.getCname() + ";\n\t}\n" );
}
txt.append("}\n");
createFileEntity(setFirstUpper(str),txt.toString());
}
}
/*
* 将字符串写到当前的路径
*/
public void createFileEntity(String name,String txt) throws IOException {
@SuppressWarnings("rawtypes")
Class clazz = DBEntityTool.class;
Package url = clazz.getPackage();
StringBuffer path = new StringBuffer();
String str = url.getName();
int len;
path.append(".\\src\\");
while(true) {
len = str.indexOf(".");
if(len == -1) {
path.append(str.substring(0, str.length()) + "\\");
break;
}
path.append(str.substring(0, len) + "\\");
str = str.substring(len + 1, str.length());
}
File file = new File(path + name + ".java");
FileOutputStream out = new FileOutputStream(file);
out.write(txt.getBytes());
out.close();
}
/*
* 转换首字母大写
*/
private String setFirstUpper(String str) {
StringBuffer sb = new StringBuffer();
String first = (str.charAt(0) + "").toUpperCase();
String last = str.substring(1, str.length());
sb.append(first);
sb.append(last);
return sb.toString();
}
/*
* 转换sql的数据类型转换为java数据类型
*/
private String castSqlToJava(String str) {
String type = "Object";
switch (str) {
case "VARCHAR":
type = "String";
break;
case "INT":
type = "int";
break;
case "DATE":
type = "java.util.Date";
break;
case "DATETIME":
type = "java.util.Date";
break;
case "FLOAT":
type = "float";
break;
case "DOUBLE":
type = "double";
break;
default:
break;
}
return type;
}
public class Colunminfo{
private String cname;
private String ctype;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCtype() {
return ctype;
}
public void setCtype(String ctype) {
this.ctype = ctype;
}
public Colunminfo(String cname, String ctype) {
super();
this.cname = cname;
this.ctype = ctype;
}
public Colunminfo() {
super();
}
}
}
public class DAOUtil {
/*
* 这个类主要就是针对增删改查,利用反射制作动态的工具类
* 基本满足所有功能的需求
*/
private DAOUtil() {
}
/**
* 查询 根据传入实体类和表名获取表中所有的数据
*/
@SuppressWarnings("unchecked")
public static <T> List<T> getData(@SuppressWarnings("rawtypes") Class t, String tableName) throws SQLException {
String sqlwords = "SELECT * FROM " + tableName;
ResultSet result = jdbcUtil.selectSql(sqlwords);
List<T> objs = null;
try {
objs = castRsultsetToObject(result, t);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtil.closeResource();
}
return objs;
}
/**
* 储存 将传入的对象的所有属性的值写入数据库
*/
public static int saveObject(Object obj, String tableName)
throws SQLException, IllegalArgumentException, IllegalAccessException {
StringBuffer sb = new StringBuffer();
sb.append("INSERT INTO " + tableName + " (");
Class<? extends Object> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
Object[] objArrays = DataUtil.castObjectArrays(obj);
int len = 0;
for (int i = objArrays.length - 1; i >= 0; i--) {
if (objArrays[i] == null || objArrays[i].toString().equals("0")) {
continue;
}
len = i;
break;
}
for (int i = 0; i < objArrays.length; i++) {
if (objArrays[i] == null || objArrays[i].toString().equals("0")) {
continue;
}
if (i == (len)) {
sb.append(fields[i].getName() + ") ");
break;
}
sb.append(fields[i].getName() + ",");
}
sb.append("VALUES (");
for (int i = 0; i < objArrays.length; i++) {
if (objArrays[i] == null || objArrays[i].toString().equals("0")) {
continue;
}
if (objArrays[i].getClass().toString().equals("class java.util.Date")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(((Date) objArrays[i]));
objArrays[i] = format;
}
if (i == (len)) {
sb.append("\'" + objArrays[i].toString() + "\')");
break;
}
sb.append("\'" + objArrays[i].toString() + "\',");
}
System.out.println(sb.toString());
return jdbcUtil.updataSql(sb.toString());
}
/**
* 根据表中符合指定列值返回所有的数据
*/
@SuppressWarnings("unchecked")
public static <T> List<T> selectDatas(@SuppressWarnings("rawtypes") Class t, String tableName, String columnName,
String columnValue) throws SQLException {
StringBuffer sqlwords = new StringBuffer();
sqlwords.append("SELECT * FROM " + tableName + " WHERE ");
sqlwords.append(columnName + "=\'" + columnValue + "\'");
ResultSet result = jdbcUtil.selectSql(sqlwords.toString());
List<T> objs = null;
try {
objs = castRsultsetToObject(result, t);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtil.closeResource();
}
return objs;
}
/**
* 根据对象中的key属性来修改表中指定的数据
*
* @return
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static int updataDatas(String tableName, Object obj, String key)
throws SQLException, IllegalArgumentException, IllegalAccessException {
StringBuffer sb = new StringBuffer();
String value = null;
sb.append("UPDATE " + tableName + " n SET ");
Class<? extends Object> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
Object[] objArrays = DataUtil.castObjectArrays(obj);
for (int i = 0; i < objArrays.length; i++) {
if (fields[i].getName().equals(key)) {
value = objArrays[i].toString();
continue;
}
}
int len = 0;
for (int i = objArrays.length - 1; i >= 0; i--) {
if (objArrays[i] == null || objArrays[i].toString().equals("0")) {
continue;
}
len = i;
break;
}
for (int i = 0; i < objArrays.length; i++) {
if (objArrays[i] == null || objArrays[i].toString().equals("0")) {
continue;
}
if (fields[i].getName().equals(key)) {
continue;
}
if (objArrays[i].getClass().toString().equals("class java.util.Date")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(((Date) objArrays[i]));
objArrays[i] = format;
}
if (i == (len)) {
sb.append("n." + fields[i].getName() + "=\'" + objArrays[i].toString() + "\' ");
break;
}
sb.append("n." + fields[i].getName() + "=\'" + objArrays[i].toString() + "\',");
}
sb.append(" WHERE n." + key + "=" + value);
return jdbcUtil.updataSql(sb.toString());
}
/**
* 删除对应账户的数据
*
* @param key
*/
public static void deleteDatas(String key, Object[] id, String tableName) throws SQLException {
for (int i = 0; i < id.length; i++) {
StringBuffer sb = new StringBuffer();
sb.append("DELETE FROM " + tableName + " n WHERE n." + key + "=");
sb.append(id[i].toString());
jdbcUtil.updataSql(sb.toString());
}
}
/*
* 首字母大写
*/
private static String setFirstUpper(String str) {
StringBuffer sb = new StringBuffer();
String first = (str.charAt(0) + "").toUpperCase();
String last = str.substring(1, str.length());
sb.append(first);
sb.append(last);
return sb.toString();
}
/*
* 将元数据转换为对象
*/
public static <T> List<T> castRsultsetToObject(ResultSet rs, Class<T> clazz) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, IllegalArgumentException, SQLException {
List<T> list = new ArrayList<T>();
while (rs.next()) {
ResultSetMetaData metaData = rs.getMetaData();
int len = metaData.getColumnCount();
String[] name = new String[len];
for (int i = 1; i <= len; i++) {
name[i - 1] = metaData.getColumnName(i);
}
T t = clazz.newInstance();
for (int i = 0; i < name.length; i++) {
Field ff = clazz.getDeclaredField(name[i]);
ff.setAccessible(true);
ff.set(t, rs.getObject(name[i]));
}
list.add(t);
}
return list;
}
}
public class jdbcUtil {
private static final String CLASSDRIVER = "com.mysql.cj.jdbc.Driver";
private static final String MYSQL = "jdbc:mysql://localhost:3306/timeone?serverTimezone=UTC";
private static final String UMYSQL = "root";
private static final String PMYSQL = "root";
private final static String DBNAME = "timeone";
private static PreparedStatement ps;
private static Connection connection;
private static Statement statement;
private jdbcUtil() {
}
/*
* 设置JDBC
*/
static {
try {
Class.forName(CLASSDRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 创建连接
*/
private static Connection getConnection() throws SQLException {
Connection connection = DriverManager.getConnection(MYSQL,UMYSQL,PMYSQL);
return connection;
}
/*
* 创建增删改的执行对象
*/
public static int updataSql(String sql) throws SQLException {
try {
connection = getConnection();
statement = connection.createStatement();
return statement.executeUpdate(sql);
} finally {
if(connection != null) {
connection.close();
}
if(statement != null) {
connection.close();
}
}
}
public static int updataSql(String sql,Object[] params) throws SQLException {
try {
connection = getConnection();
ps = connection.prepareStatement(sql);
for (int i = 1; i <= params.length; i++) {
if (params != null) {
ps.setObject(i,params[i-1]);
}
}
return ps.executeUpdate();
} finally {
if(connection != null) {
connection.close();
}
if(ps != null) {
ps.close();
}
}
}
/*
* 创建查询的执行对象
* 需要外部关闭资源
*/
public static ResultSet selectSql(String sql) throws SQLException {
connection = getConnection();
statement = connection.createStatement();
return statement.executeQuery(sql);
}
public static ResultSet selectSql(String sql,Object[] params) throws SQLException {
connection = getConnection();
ps = connection.prepareStatement(sql);
for (int i = 1; i <= params.length; i++) {
if (params != null) {
ps.setObject(i,params[i-1]);
}
}
return ps.executeQuery();
}
/*
* 关闭当前执行对象的资源
*/
public static void closeResource() throws SQLException {
if(connection != null) {
connection.close();
}
if(statement != null) {
connection.close();
}
}
/*
* 获取库中指定表的列的所有名字
*/
public static Map<String,List<String>> getTableColunm(String tablesname) throws SQLException{
Map<String,List<String>> map = new HashMap<>();
Connection connection = DriverManager.getConnection(MYSQL,UMYSQL,PMYSQL);
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getColumns(DBNAME, null, tablesname, null);
List<String> list = new ArrayList<>();
while(tables.next()) {
String tname = tables.getString("COLUMN_NAME");
list.add(tname);
}
map.put(tablesname,list);
tables.close();
closeResource();
return map;
}
}
public class DataUtil {
/*
* 这个类主要是辅助封装转换,方便代码编写
* 根据传入的对象获取对象的所有属性值并封装在Object[]返回
*/
public static Object[] castObjectArrays(Object obj) throws IllegalArgumentException, IllegalAccessException {
Field[] fields = obj.getClass().getDeclaredFields();
Object[] objArrays = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
objArrays[i] = fields[i].get(obj);
}
return objArrays;
}
}
/**
* 制作一个验证码的照片写入对应位置
*
* @throws IOException
*/
public void createImg(){
StringBuffer str = new StringBuffer();
for (int i = 1; i <= 4; i++) {
int random = this.getRandom();
str.append(random);
}
String randomStr = str.toString();
File file = new File(System.currentTimeMillis() + ".jpg");
BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = im.getGraphics();
for (int j = 1; j <= 80; j++) {
g.setColor(new Color(255,255,255));
g.drawLine(0, j, 200, j);
}
// 增加线条干扰 噪点
for (int i = 0; i < 10; i++) {
g.setColor(new Color(getRandom(255), getRandom(255), getRandom(255)));
g.drawLine(getRandom(width), getRandom(height), getRandom(width), getRandom(height));
}
// 写字颜色 白色
g.setFont(new Font("宋体", Font.BOLD, 40));
g.drawString(randomStr, 0, 50);
// 增加线条干扰 噪点
for (int i = 0; i < 10; i++) {
g.setColor(new Color(getRandom(255), getRandom(255), getRandom(255)));
g.drawLine(getRandom(width), getRandom(height), getRandom(width), getRandom(height));
}
// 将随机数赋值给静态变量,以便其他地方判断
randomcode = randomStr;
imgcode.setIcon(new ImageIcon(im));
file.delete();// 删掉刚才的图片
}
/*
* 这三个方法主要是为了实现JTablePanel标签页有关闭按钮
* 实现思路:在标签页中加入两个JLabel
* 分别设置单机事件,并且一个控制选择一个控制关闭
*/
private void setTab(String name) {
int index = selectComponent(name);
JPanel setJLabel = setJLabel(name);
tabbedPane.setTabComponentAt(index, setJLabel);
tabbedPane.setSelectedIndex(index);
}
private int selectComponent(String name) {
int components = tabbedPane.getTabCount();
for (int i = 0; i < components; i++) {
String titleAt = tabbedPane.getTitleAt(i);
if (name.equals(titleAt)) {
return i;
}
}
throw new RuntimeException("没有找到此容器");
}
private JPanel setJLabel(String name) {
JPanel jpanel = new JPanel();
jpanel.setName(name);
JLabel lblNewLabel_1 = new JLabel(name);
JLabel lblNewLabel_2 = new JLabel(" ×");
lblNewLabel_1.setName(name);
lblNewLabel_2.setName(name);
jpanel.add(lblNewLabel_1);
jpanel.add(lblNewLabel_2);
lblNewLabel_1.addMouseListener(new SelectTablePanel());
lblNewLabel_2.addMouseListener(new CloseTablePanel());
return jpanel;
}