记录一下 在进行java学习以及尝试开发项目过程中所遇到的一些问题:
项目一:是利用SWT进行界面设计,使用JDBC连接Oracle数据库 纯java开发的酒店管理系统
2022.04.27
- 在项目初期搭建数据库,创建单人间,双人间等不同类别房间表格空间时,就直接为不同的房间类型创建不同的表格,刚开始感觉查询起来应该互不干扰还挺好的,但后面发现这些表结构完全一样可以试着重构一下,就改写分成了房间信息表roomInfo和房间类型roomType两个表,在房间信息表中引入房间类型的外键约束,这样极大的简化了表结构,后期也只是加了sql语句的查询条件,也可以进行多条查询。
- 在添加列名desc时也在报错,百思不得其解sql语句没毛病,后面才知道desc是 oracle 的 关键字,所以字段名不能叫desc,否则插入数据库报错。
- OS:在下载安装 Oracle数据库时,也很容易出错,出错又得删除重来
2022.04.29
- 在JDBC连接Oracle数据库时,配置相关信息 -> 加载驱动 -> 建立连接 -> 释放连接,并尝试将这一固定步骤 封装成一个DBHelper类,并且将驱动也进行封装成数据库连接配置文件db.properties(放在类路径下),省下一大波事;
/**
* 自定义的JDBC优化类
* 封装操作数据库的相关方法
* @author sunliang
* @date 2022年4月29日
* @version 1.0
* Email 269224347@qq.com
*/
public class DBHelper {
//配置信息
//ORACLE
//private static String driverClassName = "oracle.jdbc.driver.OracleDriver";
//private String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
//private String user = "scott";
//private String password = "a";
//MySQL
//相关对象
private Connection conn = null;//连接对象
private PreparedStatement pstmt = null;//预编译
private ResultSet rs = null;//结果集
// 只在类中第一次加载才执行 且 执行一次 -> 当使用JNDI连接数据库时 可以注释该静态加载
static {
//2、加载并注册依赖oracle.jdbc.driver.OracleDriver 包路径 + 类名
try {
Class.forName( ReadConfig.getInstance().getProperty("driverClassName"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 建立连接
private Connection getConn() {
// 3、建立连接 url uname pwd ctrl 1 + 2 -> L
// jdbc:oracle:thin:@<要访问的数据库服务器的ip地址>:<数据库服务器的端口>:<要访问的数据库名>
// url 统一资源定位符 jdbc:oracle:thin:@数据库的IP地址:端口号:实例名 127.0.0.1 | localhost:1521:ORCL
try {
// conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "a");
conn = DriverManager.getConnection(ReadConfig.getInstance().getProperty("url"), ReadConfig.getInstance());
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 释放资源
@SuppressWarnings("unused")
private void closes(ResultSet rs, PreparedStatement pstmt, Connection conn) {
//7、关闭资源 先开启的后关闭 后开启的先关闭 结果集 -> 语句块 -> 连接
if( rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if( conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
db.properties
#Oracle
#driverClassName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#password=a
2022.05.04
- 在DAO层进行数据添加时,控制台报 未找到父项关键字
错误;初步判断以为是在sql语句中未指明,后面查原因才发现时数据库中出现问题,解释如下:
-------------表A中有个字段是外键,关联了表B中的某字段,再往表A插入数据时,会出现这种情况。可能原因:1.在往A表插入时,外键关联的字段在B表中必须有数据,如果B表中没有数据则又这种情况。2.产生了外键环,就是B表中被外键关联的字段又关联了C表中的字段,而C中相应字段却没有数据,则产生这种情况。
-------------所以得知原因,重新在表中添加数据后再进行数据操作,问题解决。 - OS:在进行DAO层数据操作时,也要注意进行容错判断,注意定义方法中的查询参数个数和参数名称,sql语句在方法中并不会直接报错,所以也要格外注意
2022.05.08
- 今天在对部分DAO层方法构建完成后进行Junit单元测试时,发现在数据库中插入的值,结果在console控制台查询不出来;以为是查询语句出错,校对了好久,结果是因为oracle更新数据后没有commit,它不会正式提交到数据库; 引以为戒!!!
2022.05.12
- 利用SWT进行登录界面设计时,登录界面的背景中 总有部分被组件label的颜色挡住,无法通过组件背景颜色透明化来显示登录界面全屏背景,看着突出那一块就很不舒服。也尝试通过给shell设置
shell.setBackgroundMode(SWT.INHERIT_DEFAULT);
也无法使得界面背景完全呈现,后面才发现是调用了在uitl工具类中定义的图片自适应方法,背景自适应大小 使得界面不断重绘, ?
2022.05.14