Java圖書管理系統練習程式(六)
阿新 • • 發佈:2018-12-08
本部分內容,主要實現對資料庫的基本操作,並更換資料訪問部分,將原來的使用檔案儲存更換為資料庫進行資料的儲存
在專案中,要引入mysql的驅動程式
在專案根目錄下,建立lib資料夾,將mysql的驅動程式複製到lib目錄下,然後在專案中引用
一、建立資料庫與資料表
資料庫名稱:dbbook 書籍資訊表:tbook 使用者資訊表:tuser 資料庫操作命令如下:
create database dbbook; use dbbook; create table tbook( id int autoincrement, bookname varchar(30), bookauthor varchar(30), count int, primary key(id) )engine=innodb default charset=utf8; insert into tbook(bookname,bookauthor,count) values('Java','admin',10); create table tuser( id int autoincrement, name varchar(20) null, password varchar(20) null, email varchar(20) null, primary key(id) )engine=innodb default charset=utf8; insert into t_user(name,password,email) values('admin','admin','[email protected]');
二、建立DBUtil
1.在src下建立db.properties檔案
db.properties檔案中儲存資料庫的連線資訊,一行一組資料,格式是key=value內容如下
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db_book user=root password=hyg760414
2.載入配置檔案
對應properties檔案處理,使用Properties物件進行處理,採用載入properties檔案獲得流,然後使用Properties物件進行處理,程式碼如下:
private static String driver; private static String url; private static String user; private static String password; //靜態程式碼塊 static{ try { Properties props=new Properties();//使用Properties Reader is=new FileReader("db.properties"); props.load(is);//使用Load方法載入指定的流 //通過getProperty(key),通過key獲得需要的值 driver=props.getProperty("driver"); url=props.getProperty("url"); user=props.getProperty("user"); password=props.getProperty("password"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
3.建立連線資料庫的方法和關閉連線的方法
在DBUtil類中新增如下方法
/** * 獲得連線 * @return */ public static Connection getConnection(){ try { Class.forName(driver); Connection conn=DriverManager.getConnection(url,user,password); return conn; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 關閉連線 * @param conn * @param pstat * @param rs */ public static void close(Connection conn, PreparedStatement pstat, ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(pstat!=null){ try { pstat.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
三、編寫MyDbExecute抽象類
在dao包中建立MyDbExecute抽象類,程式碼如下
package sky.book.dao; import sky.book.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; public abstract class MyDbExecut<T> { /** * 執行Insert、Update、Delete語句 * @param sql * @param args * @return */ public int executeUpdate(String sql,Object[] args){ int n=0; Connection conn=null; PreparedStatement pstat=null; conn=DBUtil.getConnection(); try { pstat=conn.prepareStatement(sql); for(int i=0;i<args.length;i++){ pstat.setObject((i+1),args[i]); } n=pstat.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,pstat,null); } return n; } /** * 執行select語句 * @param sql * @param args * @return 物件的List集合 */ public abstract List<T> executeQuery(String sql,Object[] args); }
四、編寫BookDbExecute類,繼承自MyDbExecute類
package sky.book.dao; import sky.book.bean.Book; import sky.book.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class BookDbExecute extends MyDbExecut<Book> { /** * 執行select語句 * * @param sql * @param args * @return 物件的List集合 */ @Override public List<Book> executeQuery(String sql, Object[] args) { List<Book> books=new ArrayList<>(); Connection conn=null; PreparedStatement pstat=null; ResultSet rs=null; conn=DBUtil.getConnection(); try { pstat=conn.prepareStatement(sql); for(int i=0;i<args.length;i++){ pstat.setObject((i+1),args[i]); } rs=pstat.executeQuery(); while(rs.next()){ Book book=new Book(); book.setId(rs.getInt(1)); book.setBookname(rs.getString(2)); book.setBookauthor(rs.getString(3)); book.setCount(rs.getInt(4)); books.add(book); } } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,pstat,rs); } return books; } }
五、編寫DbBookRepository類實現IBookRepository類
該類主要實現資料訪問層的功能
package sky.book.dao; import sky.book.bean.Book; import sky.book.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; public class DbBookRepository implements IBookRepository { private Connection conn=null; private PreparedStatement pstat=null; private ResultSet rs=null; private BookDbExecute bookDbExecute=new BookDbExecute(); /** * 儲存資料 * * @return */ @Override public boolean saveDate() { return false; } /** * 取得所有書籍資訊 * * @return 所有書籍資訊的集合 */ @Override public List<Book> selectAllBook() { String sql="select * from t_book"; Object[] args={}; return bookDbExecute.executeQuery(sql,args); } /** * 根據書籍的id取得書籍資訊 * * @param id 使用者的id * @return */ @Override public Book selectBookById(int id) { String sql="select * from t_book where id=?"; Object[] args={id}; List<Book> books=bookDbExecute.executeQuery(sql,args); if(books.size()>0){ return books.get(0); }else{ return null; } } /** * 新增書籍 * * @param book 欲新增的書籍 * @return 返回受影響的記錄數 */ @Override public int insertBook(Book book) { String sql="insert into t_book(bookname,bookauthor,count) values(?,?,?)"; Object[] args={book.getBookname(),book.getBookauthor(),book.getCount()}; return bookDbExecute.executeUpdate(sql,args); } /** * 根據書名查詢書籍 * * @param name 使用者名稱 * @return 如果有該書籍返回書籍物件,否則返回null */ @Override public Book selectBookByName(String name) { String sql="select * from t_book where bookname=?"; Object[] args={name}; List<Book> books=bookDbExecute.executeQuery(sql,args); if(books.size()>0){ return books.get(0); }else{ return null; } } /** * 更新書籍資訊 * * @param book 欲更新的書籍資訊 * @return 返回受影響的記錄數 */ @Override public int updateBook(Book book) { String sql="update t_book set bookname=?,bookauthor=?,count=? where id=?"; Object[] args={book.getBookauthor(),book.getBookauthor(),book.getBookauthor(),book.getId()}; return bookDbExecute.executeUpdate(sql,args); } /** * 刪除書籍 * * @param id 書籍id * @return 返回受影響的記錄數 */ @Override public int deleteBookById(int id) { String sql="delete from t_book where id=?"; Object[] args={id}; return bookDbExecute.executeUpdate(sql,args); } }
六、編寫UserDbExecute類繼承自MyDbExecute
package sky.book.dao; import sky.book.bean.User; import sky.book.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDbExecute extends MyDbExecut<User> { /** * 執行select語句 * * @param sql * @param args * @return 物件的List集合 */ @Override public List<User> executeQuery(String sql, Object[] args) { List<User> users=new ArrayList<>(); Connection conn=null; PreparedStatement pstat=null; ResultSet rs=null; conn=DBUtil.getConnection(); try { pstat=conn.prepareStatement(sql); for(int i=0;i<args.length;i++){ pstat.setObject((i+1),args[i]); } rs=pstat.executeQuery(); while(rs.next()){ User u=new User(); u.setId(rs.getInt(1)); u.setName(rs.getString(2)); u.setPassword(rs.getString(3)); u.setEmail(rs.getString(4)); users.add(u); } } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,pstat,rs); } return users; } }
七、編寫DbUserRepository類實現IUserRepository
package sky.book.dao; import sky.book.bean.User; import java.util.List; public class DbUserRepository implements IUserRepository { private UserDbExecute uExecute=new UserDbExecute(); /** * 儲存資料 * * @return */ @Override public boolean saveDate() { return false; } /** * 取得所有使用者資訊 * * @return 所有使用者資訊的集合 */ @Override public List<User> selectAllUser() { String sql="select * from t_user"; Object[] args={}; List<User> users=uExecute.executeQuery(sql,args); if(users.size()>0){ return users; } return null; } /** * 根據使用者的id取得使用者資訊 * * @param id 使用者的id * @return */ @Override public User selectUserById(int id) { String sql="select * from t_user where id=?"; Object[] args={id}; List<User> users=uExecute.executeQuery(sql,args); if(users.size()>0){ return users.get(0); } return null; } /** * 新增使用者 * * @param user 欲新增的使用者 * @return 返回受影響的記錄數 */ @Override public int insertUser(User user) { String sql="insert into t_user(name,password,email) values(?,?,?)"; Object[] args={user.getName(),user.getPassword(),user.getEmail()}; return uExecute.executeUpdate(sql,args); } /** * 根據使用者名稱查詢使用者 * * @param name 使用者名稱 * @return 如果有該使用者返回使用者物件,否則返回null */ @Override public User selectUserByName(String name) { String sql="select * from t_user where name=?"; Object[] args={name}; List<User> users=uExecute.executeQuery(sql,args); if(users.size()>0){ return users.get(0); } return null; } /** * 更新使用者資訊 * * @param user 欲更新的使用者資訊 * @return 返回受影響的記錄數 */ @Override public int updateUser(User user) { String sql="update t_user(name,password,email) values(?,?,?) where id=?"; Object[] args={user.getName(),user.getPassword(),user.getEmail(),user.getId()}; return uExecute.executeUpdate(sql,args); } }
八、建立DaoFactory類
1.在dao下建立DalFactory類
package sky.book.dao; public class DaoFactory { public static IBookRepository getBookRepository(){ return new DbBookRepository(); } public static IUserRepository getUserRepository(){ return new DbUserRepository(); } }
2.修改BookService和UserService類
private IBookRepository bookRepository=new BookRepository();//建立資料訪問層物件
更改為
private IBookRepository bookRepository=DaoFactory.getBookRepository();//建立資料訪問層物件
private IUserRepository userRepository=new UserRepository();
更改為
private IUserRepository userRepository=DaoFactory.getUserRepository();