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

本部份內容,主要實現對數據庫的基本操做,並更換數據訪問部分,將原來的使用文件存儲更換爲數據庫進行數據的存儲java

在項目中,要引入mysql的驅動程序mysql

在項目根目錄下,建立lib文件夾,將mysql的驅動程序複製到lib目錄下,而後在項目中引用sql

1、建立數據庫與數據表

數據庫名稱: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','admin@126.com');

2、建立DBUtil

1.在src下建立db.properties文件

db.properties文件中保存數據庫的鏈接信息,一行一組數據,格式是key=value內容以下 ide

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_book
user=root
password=hyg760414

2.加載配置文件

對應properties文件處理,使用Properties對象進行處理,採用加載properties文件得到流,而後使用Properties對象進行處理,代碼以下:url

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.建立鏈接數據庫的方法和關閉鏈接的方法spa

在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();
        }
    }
}

3、編寫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);
}

4、編寫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;
    }
}

5、編寫DbBookRepository類實現IBookRepository類

該類主要實現數據訪問層的功能rem

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);
    }
}

6、編寫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;
    }
}

7、編寫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);
    }
}

8、建立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();
相關文章
相關標籤/搜索