1. 程式人生 > >Java圖書管理系統練習程式(六)

Java圖書管理系統練習程式(六)

本部分內容,主要實現對資料庫的基本操作,並更換資料訪問部分,將原來的使用檔案儲存更換為資料庫進行資料的儲存

在專案中,要引入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();