try-with-resources实现JDBC查询操作
数据库准备
CREATE DATABASE `cloud_note`;
USE `cloud_note`;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(50) DEFAULT NULL,
`user_pwd` VARCHAR(50) DEFAULT NULL,
`nick` VARCHAR(50) DEFAULT NULL,
`head` VARCHAR(100) DEFAULT NULL,
`mood` VARCHAR(500) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
数据库命名规则
- 不要使用关键字作为字段、表名;对应的名称替换如下
user
->sys_user
create
->user_create
name
->user_name
password
->user_pwd
数据库表与字段的对应
建议以下划线转驼峰规则进行一一对应
public class User {
public Integer userId;
public String userName;
public String userPwd;
public String nick;
public String head;
public Stirng mood;
// 构造器和getter & setter 方法
}
DAO层使用TWR实现的JDBC查询操作的资源自动关闭
public SysUser selectByName(String userName) {
SysUser user = null;
String sql = "select user_id, user_name, user_pwd, nick, head, mood " +
"from sys_user where user_name = ?";
try (Connection con = JDBCUtil.getConnection();
PreparedStatement ps = con.prepareStatement(sql)) {
ps.setString(1, userName);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
user = new SysUser(rs.getInt("user_id"),
rs.getString("user_name"),
rs.getString("user_pwd"),
rs.getString("nick"),
rs.getString("head"),
rs.getString("mood"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
注意事项
- 尽量使用try-with-resources的方法关闭资源,当然前提是资源实现了
AutoCloseable
接口 - 尽管有些资源会因为某些资源的释放而释放,但保险还是自己释放所有资源,就如上述的
ResultSet
可能会自动释放 - 尽量保证资源的申请和释放顺序相反
- Note that the close methods of resources are called in the opposite order of their creation.
- In a try-with-resources statement, any catch or finally block is run after the resources declared have been closed.
- 在 try-with-resources 中,如果创建资源发生异常,即 try (…) 中小括号里的代码出现异常,以及 close 时发生异常,都是会在 catch 中捕捉到的
- try()里面的变量会自动变成final
TWR与IO处理
。。。挖个坑