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

猜你喜欢

转载自my.oschina.net/u/3537796/blog/2907009