//单位主键
if(jsonObj.getString(“organization_id”)!= null && (!jsonObj.getString (“organization_id”).equals(“”)))
curForm.setOrganization_id(jsonObj.getLong(“organization_id”));
//考试主键
if(jsonObj.getString(“id”)!= null && (!jsonObj.getString(“id”).equals(“”)))
curForm.setId(jsonObj.getLong(“id”));
//考场主键
if(jsonObj.getString(“examroom_id”)!= null && (!jsonObj.getString (“examroom_id”).equals(“”)))
curForm.setExamroom_id(jsonObj.getLong(“examroom_id”));
//用户主键
if(jsonObj.getString(“user_id”)!= null && (!jsonObj.getString(“user_id”).equals(“”)))
curForm.setUser_id(jsonObj.getLong(“user_id”));
//专业代码
if(jsonObj.getString(“specialtyCode”)!= null && (!jsonObj.getString (“specialtyCode”).equals(“”)))
curForm.setSpecialtyCode(jsonObj.getLong(“specialtyCode”));
//报考岗位
if(jsonObj.getString(“postionCode”)!= null && (!jsonObj.getString (“postionCode”).equals(“”)))
curForm.setPostionCode(jsonObj.getLong(“postionCode”));
//报考等级
if(jsonObj.getString(“gradeCode”)!= null && (!jsonObj.getString (“gradeCode”).equals(“”)))
curForm.setGradeCode(jsonObj.getLong(“gradeCode”));
//考试开始时间
curForm.setExamStartTime(jsonObj.getString(“examStartTime”));
//考试结束时间
curForm.setExamEndTime(jsonObj.getString(“examEndTime”));
…
}
优化之后的代码如下。
public class ExammingFormVo extends ExammingForm{
private String examinationPaperId; //试卷主键
private String leavTime; //剩余时间
private String organizationId; //单位主键
private String id; //考试主键
private String examRoomId; //考场主键
private String userId; //用户主键
private String specialtyCode; //专业代码
private String postionCode; //报考岗位
private String gradeCode; //报考等级
private String examStartTime; //考试开始时间
private String examEndTime; //考试结束时间
…
}
public void setExammingForm(ExammingForm form,String parameters)throws BaseException {
try {
JSONObject json = new JSONObject(parameters);
ExammingFormVo vo = JSONObject.parseObject(json,ExammingFormVo.class);
form = vo;
}catch (Exception e){
e.printStackTrace();
}
}
[](()2 更好地重构项目
平时我们写的代码虽然满足了需求,但往往不利于项目的开发与维护,以下面的JDBC代码为例。
public void save(Student stu){
String sql = “INSERT INTO t_student(name,age) VALUES(?,?)”;
Connection conn = null;
Statement st = null;
try{
//1. 加载注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2. 获取数据库连接
conn=DriverManager.getConnection(“jdbc:mysql:///jdbc_demo”,“root”,“root”);
//3. 创建语句对象
PreparedStatement ps=conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(st != null)
st.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn != null)
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
//删除学生信息
public void delete(Long id){
String sql = “DELETE FROM t_student WHERE id=?”;
Connection conn = null;
Statement st = null;
try{
//1. 加载注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2. 获取数据库连接
conn=DriverManager.getConnection(“jdbc:mysql:///jdbc_demo”,“root”,“root”);
//3. 创建语句对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,id);
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(st != null)
st.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn != null)
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
//修改学生信息
public void update(Student stu){
String sql = “UPDATE t_student SET name=?,age=? WHERE id=?”;
Connection conn = null;
Statement st = null;
try{
//1. 加载注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//2. 获取数据库连接
conn=DriverManager.getConnection(“jdbc:mysql:///jdbc_demo”,“root”,“root”);
//3. 创建语句对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
ps.setObject(3,stu.getId());
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(st != null)
st.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn != null)
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
上述代码的功能没问题,但是代码重复得太多,因此可以进行抽取,把重复代码放到一个工具类JdbcUtil里。
//工具类
public class JdbcUtil {
private JdbcUtil() { }
static {
//1. 加载注册驱动
try {
Class.forName(“com.mysql.jdbc.Driver”);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
//2. 获取数据库连接
return DriverManager.getConnection(“jdbc:mysql:///jdbc_demo”, “root”, “root”);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//释放资源
public static void close(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
只需要在实现类中直接调用工具类JdbcUtil中的方法即可。
//增加学生信息
public void save(Student stu) {
String sql = “INSERT INTO t_student(name,age) VALUES(?,?)”;
Connection conn = null;
PreparedStatement ps=null;
try {
conn = JDBCUtil.getConnection();
//3. 创建语句对象
ps = conn.prepareStatement(sql);
ps.setObject(1, stu.getName());
ps.setObject(2, stu.getAge());
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(null, ps, conn);
}
}
//删除学生信息
public void delete(Long id) {
String sql = “DELETE FROM t_student WHERE id=?”;
Connection conn = null;
PreparedStatement ps = null;
try {
conn=JDBCUtil.getConnection();
//3. 创建语句对象
ps = conn.prepareStatement(sql);
ps.setObject(1, id);
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(null, ps, conn);
}
}
//修改学生信息
public void update(Student stu) {
String sql = “UPDATE t_student SET name=?,age=? WHERE id=?”;
Connection conn = null;
PreparedStatement ps = null;
try {
conn=JDBCUtil.getConnection();
//3. 创建语句对象
ps = conn.prepareStatement(sql);
ps.setObject(1, stu.getName());
ps.setObject(2, stu.getAge());
ps.setObject(3, stu.getId());
//4. 执行SQL语句
ps.executeUpdate();
//5. 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(null, ps, conn);
}
}
public Student get(Long id) {
String sql = “SELECT * FROM t_student WHERE id=?”;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps=null;
try {
conn = JDBCUtil.getConnection();
//3. 创建语句对象
ps = conn.prepareStatement(sql);
ps.setObject(1, id);
//4. 执行SQL语句
rs = ps.executeQuery();
if (rs.next()) {
String name = rs.getString(“name”);
int age = rs.getInt(“age”);
Student stu = new Student(id, name, age);
return stu;
}
//5. 释放资源
} catch (Exception e) {
e.pr 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 intStackTrace();
} finally {
JDBCUtil.close(rs, ps, conn);
}
return null;
}
public List list() {
List list = new ArrayList<>();
String sql = "SELECT * FROM t_student ";
Connection conn = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps=null;
try {
conn=JDBCUtil.getConnection();
//3. 创建语句对象
ps = conn.prepareStatement(sql);
//4. 执行SQL语句
rs = ps.executeQuery();
while (rs.next()) {
long id = rs.getLong(“id”);
String name = rs.getString(“name”);
int age = rs.getInt(“age”);
Student stu = new Student(id, name, age);
list.add(stu);
}
//5. 释放资源
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, ps, conn);
}
return list;
}
虽然完成了重复代码的抽取,但数据库中的账号密码等直接显示在代码中,不利于后期账户密码改动的维护。可以建立一个db.propertise文件,用来存储这些信息。
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=root
只需要在工具类JdbcUtil中获取里面的信息即可。
static {
//1. 加载注册驱动
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = loader.getResourceAsStream(“db.properties”);
p = new Properties();
p.load(inputStream);
Class.forName(p.getProperty(“driverClassName”));
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
//2. 获取数据库连接
return DriverManager.getConnection(p.getProperty(“url”), p.getProperty(“username”),
p.getProperty(“password”));
} catch (Exception e) {
e.printStackTrace();
}