亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP+Servlet培訓班作業管理系統[8] -數據庫操作層實現

2019-11-06 07:46:28
字體:
來源:轉載
供稿:網友

本篇實現數據庫相關的實體類(entity包)和操作類(Operation包),具體代碼如下:

/*entity包下的實體類,與數據庫中的表是對應關系*/package entity;public class Role {//對應system_role PRivate int roleId; private String roleName; public int getRoleId() { return roleId; } public void setRoleId(int roleId) { this.roleId = roleId; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; }}package entity;public class User {//對應system_user private int userId; private String userName; private String userPassWord; private Role userRole; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public Role getUserRole() { return userRole; } public void setUserRole(Role userRole) { this.userRole = userRole; }}package entity;public class Course {//對應system_course private int courseId; private String courseName; private User courseUser; public int getCourseId() { return courseId; } public void setCourseId(int courseId) { this.courseId = courseId; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public User getCourseUser() { return courseUser; } public void setCourseUser(User courseUser) { this.courseUser = courseUser; }}package entity;public class Work {//對應system_work private int workId; private String workTitle; private String workTime; private Course workCourse; public int getWorkId() { return workId; } public void setWorkId(int workId) { this.workId = workId; } public String getWorkTitle() { return workTitle; } public void setWorkTitle(String workTitle) { this.workTitle = workTitle; } public String getWorkTime() { return workTime; } public void setWorkTime(String workTime) { this.workTime = workTime; } public Course getWorkCourse() { return workCourse; } public void setWorkCourse(Course workCourse) { this.workCourse = workCourse; }}package entity;public class Job {//對應work_job private int jobId; private String jobTime; private String jobContent; private int jobScore; private Work jobWork; private User jobUser; public int getJobId() { return jobId; } public void setJobId(int jobId) { this.jobId = jobId; } public String getJobTime() { return jobTime; } public void setJobTime(String jobTime) { this.jobTime = jobTime; } public String getJobContent() { return jobContent; } public void setJobContent(String jobContent) { this.jobContent = jobContent; } public int getJobScore() { return jobScore; } public void setJobScore(int jobScore) { this.jobScore = jobScore; } public Work getJobWork() { return jobWork; } public void setJobWork(Work jobWork) { this.jobWork = jobWork; } public User getJobUser() { return jobUser; } public void setJobUser(User jobUser) { this.jobUser = jobUser; }}

然后來實現對這幾張表基本的增、刪、改、查操作類(對于外鍵的操作和關聯,見仁見智,貓哥的意見是,夠用就好!),操作類均放于包operation下,為了規范操作類的基本必備操作,建立一個接口ObjectOperation如下:

package operation;import java.util.List;public interface ObjectOperation {//操作接口,用于執行對象對應數據庫表的增刪改查操作 public List selectAll();//選取表中所有數據 public Object selectById(int id);//按id獲取一條記錄 public int add(Object obj);//添加一條數據 public int deleteById(String id);//按id刪除一條記錄 public int update(Object obj);//按obj對象的信息修改一條記錄(以obj的id標記需要修改的記錄)}

好的,為了實現數據庫操作,將之前已經設立的數據庫類拷貝進來,放于包MySQL下,并將其中的異常相關類修改如下(跟mysql相關的操作具體見貓哥帶你去戰斗—Java Web開發—Java篇[12]—使用連接池的mysql操作類)(不要忘記將mysql-connector-java-5.1.39-bin.jar放于WEB-INF/lib下):

package mysql;import java.sql.*;import java.util.Date;import java.util.LinkedList;import exception.MyException;/** * MySQL數據庫自定義連接池 * @author 貓哥 * @date 2017.2.6修改 */public class MySQLPool { private static LinkedList<Connection> pool = new LinkedList<Connection>(); private static int maxCount=1;//最大連接數 static{//初始化 for(int i=0;i<maxCount;i++){ MySQLHandler handler=new MySQLHandler(); Connection connection = handler.buildConnection(); pool.add(connection); } } public static Connection getConnecton() throws MyException{ if(pool.size()==0)//分配完了 { throw new MyException(new Date(),"數據庫連接池資源短缺,無連接可分配","數據庫連接錯誤"); } else{ return pool.remove(0);//刪除第一個對象并返回 } } public static void release(Connection connection){//使用完的歸還給池子 pool.add(connection); }}package mysql;import java.sql.*;//導入數據庫相關類庫import java.util.Date;import exception.MyException;/** * MysqlHandler MySQL數據庫管理類,使用數據庫連接池 * @author 貓哥 * @date 2016.1.9 * @modify 2016.2.6 MysqlHandler-MySQLHandler,use MyException */public class MySQLHandler{ //依然是那熟悉的三個必備參數 private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; //建立數據庫連接,此處僅用于提供原始連接,供放入池中使用 public Connection buildConnection() { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/homework?useUnicode=true&characterEncoding=utf-8";//數據庫連接字符串 String user = "root"; String password = "Pass1234"; try{ Class.forName(driver);//加載驅動程序 conn=DriverManager.getConnection(url,user,password); } catch(Exception ex){ //暫時不處理(未throw),加上日志模塊后記在日志里 new MyException(new Date(),ex.getMessage(),"數據庫連接建立異常"); } return conn; } //操作1,“增刪改查”中,增、刪、改都是執行sql語句,無需返回ResultSet結果集,所以設置為一個方法 public int execute(String sql) throws MyException{ try { if(conn==null)//未分配 conn=MySQLPool.getConnecton();//用時從池中取,很爽快 stmt=conn.createStatement(); int affectedCount = stmt.executeUpdate(sql);//此處真正執行stmt定義的操作 return affectedCount;//這個是收到影響的行數 } catch (Exception ex) { throw new MyException(new Date(),ex.getMessage(),"數據庫連接錯誤"); } } //操作2,如果是查詢,需返回結果集 public ResultSet query(String sql)throws Exception{ try{ if(conn==null)//未分配 conn=MySQLPool.getConnecton();//用時從池中取,很爽快 stmt=conn.createStatement(); rs = stmt.executeQuery(sql);//執行pstmt中定義的查詢 return rs;//將結果集返回 } catch (Exception ex) { throw new MyException(new Date(),ex.getMessage(),"數據庫連接錯誤"); } } //操作3,釋放資源 public void sayGoodbye(){ if(rs!=null){//關閉結果集,這個不關閉也浪費 try { rs.close(); } catch (Exception ex) { ex.printStackTrace(); } } if(stmt!=null){//關閉Statement,不要浪費 try { stmt.close(); } catch (Exception ex) { ex.printStackTrace(); } } //此處注意,conn在池中管理,不用關閉,用完回歸連接池繼續使用 MySQLPool.release(conn); }}

最后就是具體的操作類了,暫時只有必要的(接口定義的),也沒測試,之后編碼有問題的話可能略加修改:

package operation;import java.sql.ResultSet;import exception.MyException;import java.util.*;import entity.*;import mysql.*;public class RoleOperation implements ObjectOperation{ @Override public Object selectById(int id) { MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; Role one=new Role();//如果查詢內容為空,則通過one.getRoleId()==0來判斷即可 try { //此處不要寫select *,因為數據庫將*轉換為該表所有列名肯定需要浪費時間 rs=hand.query("select role_id,role_name from system_role r where r.role_id='"+id+"'"); while(rs.next()){ one.setRoleId(rs.getInt("role_id")); one.setRoleName(rs.getString("role_name")); } hand.sayGoodbye(); return one; } catch (Exception ex) { //對于數據庫操作層面的異常,此時不予以向外拋出,記錄在日志中分析即可 //在設計的時候就要明確,什么類型異常要外拋,什么異常不拋出只記錄 new MyException(new Date(),ex.getMessage(),"RoleOperation.selectById異常"); return null;//注意null和new Role()并不同! } } @Override public List selectAll() {//注意返回值null和list.size()==0的區別 MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; ArrayList<Role> list=new ArrayList<Role>();//返回值 try { rs=hand.query("select role_id,role_name from system_role r"); while(rs.next()){ Role one=new Role();//返回值中的一個 one.setRoleId(rs.getInt("role_id")); one.setRoleName(rs.getString("role_name")); list.add(one);//添加到列表 } hand.sayGoodbye();//釋放資源 return list; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"RoleOperation.selectAll異常"); return null; } } @Override public int add(Object obj) { Role one=(Role)obj; MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("insert into system_role(role_name) values('"+one.getRoleName()+"')"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"RoleOperation.add異常"); return 0; } } @Override public int deleteById(String id) { MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("delete from system_role where role_id='"+id+"'"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"RoleOperation.deleteById異常"); return 0; } } @Override public int update(Object obj) { Role one=(Role)obj; MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("update system_role set role_name='"+one.getRoleName() +"' where role_id='"+one.getRoleId()+"'"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"RoleOperation.update異常"); return 0; } }}package operation;import java.sql.ResultSet;import java.util.ArrayList;import java.util.Date;import java.util.List;import mysql.MySQLHandler;import entity.*;import exception.MyException;public class UserOperation implements ObjectOperation{ @Override public Object selectById(int id) { MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; User one=new User();//如果查詢內容為空,則通過one.getUserId()==0來判斷即可 try { //此處不要寫select *,因為數據庫將*轉換為該表所有列名肯定需要浪費時間 rs=hand.query("select user_id,user_name,user_password,role_id,role_name from " +"system_user u,system_role r where u.user_id='"+id+"' and u.user_role=r.role_id"); while(rs.next()){ one.setUserId(rs.getInt("User_id")); one.setUserName(rs.getString("User_name")); one.setUserPassword(rs.getString("user_password")); Role role=new Role(); role.setRoleId(rs.getInt("role_id")); role.setRoleName(rs.getString("role_name")); one.setUserRole(role); } hand.sayGoodbye(); return one; } catch (Exception ex) { //對于數據庫操作層面的異常,此時不予以向外拋出,記錄在日志中分析即可 //在設計的時候就要明確,什么類型異常要外拋,什么異常不拋出只記錄 new MyException(new Date(),ex.getMessage(),"UserOperation.selectById異常"); return null;//注意null和new User()并不同! } } @Override public List selectAll() {//注意返回值null和list.size()==0的區別 MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; ArrayList<User> list=new ArrayList<User>();//返回值 try { rs=hand.query("select user_id,user_name,user_password,role_id,role_name from " +"system_user u,system_role r where u.user_role=r.role_id"); while(rs.next()){ User one=new User();//返回值中的一個 one.setUserId(rs.getInt("User_id")); one.setUserName(rs.getString("User_name")); one.setUserPassword(rs.getString("user_password")); Role role=new Role(); role.setRoleId(rs.getInt("role_id")); role.setRoleName(rs.getString("role_name")); one.setUserRole(role); list.add(one);//添加到列表 } hand.sayGoodbye();//釋放資源 return list; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"UserOperation.selectAll異常"); return null; } } /*需要注意添加用戶時,我們只用到了關聯表的id*/ @Override public int add(Object obj) { User one=(User)obj; MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("insert into system_User(User_name,user_password,user_role)" +" values('"+one.getUserName()+"','"+one.getUserPassword()+"','"+one.getUserRole().getRoleId()+"')"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"UserOperation.add異常"); return 0; } } /*這個方法我是從RoleOperation中拷貝過來的,然后使用User替換了Role,此時定睛一看,竟無需改變*/ @Override public int deleteById(String id) { MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("delete from system_User where User_id='"+id+"'"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"UserOperation.deleteById異常"); return 0; } } /*此處需要注意修改user_role的邏輯,如果設計的是修改用戶信息時同步修改角色,可以就如下寫代碼 而如果修改用戶信息不修改角色,修改角色的功能是單獨的菜單,那么可單獨增加updateUserRole方法 貓哥建議直接在update里都寫好,如果有區分的功能菜單,直接在在command命令層寫不同的代碼即可*/ @Override public int update(Object obj) { User one=(User)obj; MySQLHandler hand=new MySQLHandler(); try { int re=hand.execute("update system_User set User_name='"+one.getUserName() +"',user_password='"+one.getUserPassword()+"',user_role='"+one.getUserRole().getRoleId() +"' where User_id='"+one.getUserId()+"'"); hand.sayGoodbye(); return re; } catch (Exception ex) { new MyException(new Date(),ex.getMessage(),"UserOperation.update異常"); return 0; } }}

因其他幾個operation類的結構和寫法,完全可以由RoleOperation和UserOperation代表,故此處不再一一粘貼代碼,如有需要,可留言獲取。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本黄视频| 欧美成人精品在线| 久久国产一区二区三区| 91精品视频播放| 欧美又大又硬又粗bbbbb| 欧美极品美女电影一区| 亚洲精品欧美一区二区三区| 91久久久久久久久| 欧美丰满少妇xxxx| 亚洲丁香久久久| 亚洲福利视频网| 欧美性生交xxxxxdddd| 在线播放国产精品| 亚洲男人天堂视频| 午夜精品在线观看| 亚洲成人精品视频在线观看| 久久久久久久久久久久av| 日韩av电影免费观看高清| 亚洲免费一级电影| 色偷偷偷亚洲综合网另类| 精品自拍视频在线观看| 久久精品欧美视频| 欧美日韩国产精品一区二区不卡中文| 日本久久久久亚洲中字幕| 国产精品免费一区豆花| 精品性高朝久久久久久久| 欧美日韩成人在线观看| 精品网站999www| 久色乳综合思思在线视频| 狠狠躁夜夜躁久久躁别揉| 91精品视频一区| 亚洲精品成人av| 高清一区二区三区四区五区| 欧美黄色免费网站| 亚洲一区亚洲二区亚洲三区| 日韩亚洲综合在线| 久久影院在线观看| 精品久久久久久中文字幕| 亚洲97在线观看| 91在线国产电影| 性欧美视频videos6一9| 成人疯狂猛交xxx| 亚洲精品mp4| 国a精品视频大全| 久久久av亚洲男天堂| 亚洲精品98久久久久久中文字幕| 欧美日韩在线免费| 国产99久久精品一区二区永久免费| 日韩美女在线看| 国产精品白丝av嫩草影院| 中文字幕一区日韩电影| 亚洲91精品在线观看| 国产精品免费福利| 亚洲已满18点击进入在线看片| 国产亚洲视频中文字幕视频| 欧美成人性生活| 成人免费淫片aa视频免费| 久久视频中文字幕| 久久免费国产视频| 韩曰欧美视频免费观看| 国产精品亚洲视频在线观看| 亚洲无限乱码一二三四麻| 91九色视频导航| 国产精品久久久久影院日本| 日韩免费观看在线观看| 国产精品白嫩初高中害羞小美女| 日韩成人中文字幕| 午夜精品一区二区三区在线视频| 欧美高清视频免费观看| 最新国产精品亚洲| 亚洲成人999| 亚洲国产一区二区三区四区| 在线观看中文字幕亚洲| 人体精品一二三区| 91免费看片网站| 岛国av一区二区三区| 亚洲情综合五月天| 国产色婷婷国产综合在线理论片a| 欧美在线国产精品| 中文字幕日本精品| 欧美制服第一页| 久久男人的天堂| 久久97久久97精品免视看| 国产精品久在线观看| 国产一区二区三区久久精品| 亚洲天堂av电影| 久久精品中文字幕电影| 亚洲国产天堂网精品网站| 亚洲嫩模很污视频| 91亚洲永久免费精品| 久久九九热免费视频| 国产精品欧美一区二区| 色婷婷综合成人av| 欧美午夜片欧美片在线观看| 欧美特黄级在线| 日韩视频在线一区| 欧美视频精品一区| 亚洲成人网av| 在线观看国产精品日韩av| 韩国国内大量揄拍精品视频| 国产91在线播放九色快色| 92看片淫黄大片看国产片| 日韩高清不卡av| 国产视频丨精品|在线观看| 国产欧美亚洲精品| 日韩av网站电影| 国产91av在线| 亚洲欧美日韩图片| 亚洲黄页视频免费观看| 日韩在线播放一区| 久久中文久久字幕| 91在线色戒在线| 国产精品一区二区久久精品| 精品国产31久久久久久| 亚洲男人7777| 91久久国产综合久久91精品网站| 亚洲欧美资源在线| 亚洲精品综合精品自拍| 国产精品日韩在线观看| 日韩精品中文字幕在线观看| 欧美成人网在线| 丰满岳妇乱一区二区三区| 欧美成人三级视频网站| 欧美日韩成人精品| 欧美一级淫片丝袜脚交| 日本不卡免费高清视频| 亚洲午夜精品久久久久久性色| 国产精品女主播视频| 欧美特级www| 欧美成人中文字幕| 久久91亚洲精品中文字幕奶水| 亚洲影影院av| 一区二区三区回区在观看免费视频| 狠狠久久五月精品中文字幕| 欧美一区视频在线| 日本亚洲欧美三级| 亚洲第一区第二区| 精品久久中文字幕久久av| 成人国产精品av| 亚洲成年人在线播放| 亚洲欧洲黄色网| 456国产精品| 91精品久久久久久久久久| 91精品国产高清久久久久久久久| 一本色道久久88亚洲综合88| 另类少妇人与禽zozz0性伦| 亚洲午夜精品久久久久久久久久久久| 欧美精品videos另类日本| 亚洲日韩中文字幕在线播放| 久久伊人精品天天| 精品久久久久久国产| 亚洲电影免费在线观看| 国产脚交av在线一区二区| 最近2019好看的中文字幕免费| 亚洲欧美资源在线| 国产午夜精品一区二区三区| 亚洲裸体xxxx| 国内精品久久久久久久| 国产一区欧美二区三区| 91免费看片在线| 在线观看免费高清视频97| 久久久97精品| 国产精品扒开腿做爽爽爽男男| 国产精品久久久久久久久久久新郎|