(由于忙于考研没有进行很好的测试,功能不够全,bug在所难免,望见谅)
LibraryManageSystem整体设计说明
LibraryManageSystem 使用了三层的架构:数据访问(Data acess)层、业务(business)层、视图(View)层。
数据访问层:使用JDBC来访问数据库,并对jdbc进行了简单的封装,使用Template mothod模式和回调接口大大减少了对jdbc的低级操作。其中JdbcTemplate类提供了使用jdbc访问数据库的模板,提供了queryForObject和queryForList方法来分别获取查询到的对象和对象的聚集,execute方法来更新、插入、删除操作。提供了RowCallBackHandler接口,可以通过实现该接口来提供对查询一行的回调处理,使用PreparedStatementCallBack回调接口,来提供对PreparedStatement参数的设置,提供了ORMaping接口,通过实现该接口可以很容易实现关系数据库与domain对象的映射,并产生可重用的逻辑。使用Dao模式和AbstractFactory模式对数据访问层进行封装,可以轻易实现数据库间的移植。
业务层:业务层实现了LibraryManageSystem的各项服务,通过业务层使得视图(View)层不依赖于具体的数据访问(Data acess)层的实现。
View层:对MVC进行了清晰地划分。领域对象作为Model,使用java Swing实现了view,
使用ActionLisenter和Controller来实现controller。Controller接口使用命令模式,通过实现该接口来封装对业务的执行并获取执行的结果。真正的控制器其实是ActionLisenter,通过它来监听事件的发生,并分发对命令,并将该命令封装成Controller的某个实现类的对象,执行业务方法,获取执行结果,并将结果显示在view上。
LibraryManageSystem是一个松耦合的系统,并且可以使得数据访问(Data acess)层、业务(business)层可以轻易的被重用与替换,可以使用其他的view技术(如jsp)来复用这两层。提供了对jdbc进行的简单的封装的基础设施,可以在其他项目中重用并扩展。
源码如下:
对jdbc进行封装的部分:
//
JdbcTemplate.java
package edu.jlu.fuliang.library.jdbc;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTemplate {
public List query(String sql,RowCallBackHandler handler){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
ResultSet rs = null ;
List list = new ArrayList();
try {
rs = ps.executeQuery();
while (rs.next()){
list.add(handler.processRow(rs));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
return list;
}
public Object queryForObject(String sql,RowCallBackHandler handler){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
ResultSet rs = null ;
Object o = null ;
try {
rs = ps.executeQuery();
rs.next();
o = handler.processRow(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
return o;
}
public void executeUpdate(String sql,PreparedStatementCallBack pareparedStatementCallBack){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
try {
pareparedStatementCallBack.doInStatement(ps);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
}
}
// 回调接口RowCallBackHandler
package edu.jlu.fuliang.library.jdbc;
import java.sql.ResultSet;
public interface RowCallBackHandler {
public Object processRow(ResultSet rs);
}
// /回调接口PreparedStatementCallBack
package edu.jlu.fuliang.library.jdbc;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public interface PreparedStatementCallBack {
public void doInStatement(PreparedStatement stmt) throws SQLException;
}
// ORMaping接口
package edu.jlu.fuliang.library.jdbc;
import java.sql.ResultSet;
public interface ORMaping {
public Object mapping(ResultSet rs,Object o);
}
// JdbcUtils.java
package edu.jlu.fuliang.library.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUtils {
public static Connection createConnection(){ // 为了简单,进行了硬编码
String user = " root " ;
String passwd = " 123456 " ;
String url = " jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=gb2312 " ;
Connection connection = null ;
try {
Class.forName( " com.mysql.jdbc.Driver " ).newInstance();
connection = DriverManager.getConnection(url,user,passwd);
}
catch (Exception e){
e.printStackTrace();
}
return connection;
}
public static PreparedStatement createPreparedStatement(String sql,Connection connection){
PreparedStatement stmt = null ;
try {
stmt = connection.prepareStatement(sql);
} catch (Exception e){
e.printStackTrace();
}
return stmt;
}
public static void closeStatement(Statement s){
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void relaseConnection(Connection connection){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 以下是数据访问对象:
// BorrowerDao.java
package edu.jlu.fuliang.library.dao;
import edu.jlu.fuliang.library.domain.Borrower;
public interface BorrowerDao {
public Borrower queryByLastName(String lastName);
public void updateBorrower(Borrower borrower);
public void insertBorrower(Borrower borrower);
public void deleteBorrowerByLastName(String lastName);
}
// BookDao.java
package edu.jlu.fuliang.library.dao;
import java.util.List;
import edu.jlu.fuliang.library.domain.Book;
public interface BookDao {
public Book queryByTitle(String title);
public List queryByAuthor(String author);
public List queryByBorrowerLastName(String firstName);
public void updateBook(Book book);
public void insertBook(Book book);
public void deleteBookByTile(String title);
}
// BorrowOrReturnDao.java
package edu.jlu.fuliang.library.dao;
public interface BorrowOrReturnDao {
public void borrowBook(String borrowerLastName,String bookTile);
public void returnBook(String borrowerLastName,String bookTile);
}
// 抽象工厂:
package edu.jlu.fuliang.library.dao;
public interface DaoFactory {
public BookDao createBookDao();
public BorrowerDao createBorrowerDao();
public BorrowOrReturnDao createBorrowOrReturnDao();
}
// 具体工厂:
package edu.jlu.fuliang.library.dao;
import edu.jlu.fuliang.library.dao.mysql.BookDaoImpl;
import edu.jlu.fuliang.library.dao.mysql.BorrowerDaoImpl;
public class MysqlDaoFactory implements DaoFactory{
public BookDao createBookDao() {
return new BookDaoImpl();
}
public BorrowerDao createBorrowerDao() {
return new BorrowerDaoImpl();
}
public BorrowOrReturnDao createBorrowOrReturnDao() {
return new BorrowOrReturnDaoImpl();
}
}
// BookDao的具体实现:
// BookDaoImpl.java
package edu.jlu.fuliang.library.dao.mysql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import edu.jlu.fuliang.library.dao.BookDao;
import edu.jlu.fuliang.library.domain.Book;
import edu.jlu.fuliang.library.jdbc. * ;
public class BookDaoImpl implements BookDao{
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
public Book queryByTitle(String title) {
String sql = " select * from book where title = " + title;
return (Book)jdbcTemplate.queryForObject(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BookMaping map = new BookMaping();
Book book = (Book)map.mapping(rs, new Book());
return book;
}
});
}
public List queryByAuthor(String author) {
String sql = " select * from book where author = " + author;
return jdbcTemplate.query(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BookMaping map = new BookMaping();
Book book = (Book)map.mapping(rs, new Book());
return book;
}
});
}
// Borrower的具体实现:
// BookDaoImpl.java
package edu.jlu.fuliang.library.dao.mysql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import edu.jlu.fuliang.library.dao.BorrowerDao;
import edu.jlu.fuliang.library.domain.Borrower;
import edu.jlu.fuliang.library.jdbc.JdbcTemplate;
import edu.jlu.fuliang.library.jdbc.PreparedStatementCallBack;
import edu.jlu.fuliang.library.jdbc.RowCallBackHandler;
public class BorrowerDaoImpl implements BorrowerDao{
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
public Borrower queryByLastName(String lastName) {
String sql = " select * from borrower where lastName = " + lastName;
return (Borrower)jdbcTemplate.queryForObject(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BorrowerMaping borrowerMaping = new BorrowerMaping();
return borrowerMaping.mapping(rs, new Borrower());
}
});
}
public void updateBorrower( final Borrower borrower) {
String sql = " update borrower set lastname = ?,firstname=? " +
" ,address =?,city =?,zip=?,state=? where lastname = ? " ;
jdbcTemplate.executeUpdate(sql, new PreparedStatementCallBack(){
public void doInStatement(PreparedStatement stmt) throws SQLException {
stmt.setString( 1 ,borrower.getLastName());
stmt.setString( 2 ,borrower.getFirstName());
stmt.setString( 3 ,borrower.getAddress());
stmt.setString( 4 ,borrower.getCity());
stmt.setString( 5 ,borrower.getZip());
stmt.setString( 6 ,borrower.getState());
stmt.setString( 7
package edu.jlu.fuliang.library.jdbc;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTemplate {
public List query(String sql,RowCallBackHandler handler){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
ResultSet rs = null ;
List list = new ArrayList();
try {
rs = ps.executeQuery();
while (rs.next()){
list.add(handler.processRow(rs));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
return list;
}
public Object queryForObject(String sql,RowCallBackHandler handler){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
ResultSet rs = null ;
Object o = null ;
try {
rs = ps.executeQuery();
rs.next();
o = handler.processRow(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
return o;
}
public void executeUpdate(String sql,PreparedStatementCallBack pareparedStatementCallBack){
Connection connection = JdbcUtils.createConnection();
PreparedStatement ps = JdbcUtils.createPreparedStatement(sql,connection);
try {
pareparedStatementCallBack.doInStatement(ps);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeStatement(ps);
JdbcUtils.relaseConnection(connection);
}
}
}
// 回调接口RowCallBackHandler
package edu.jlu.fuliang.library.jdbc;
import java.sql.ResultSet;
public interface RowCallBackHandler {
public Object processRow(ResultSet rs);
}
// /回调接口PreparedStatementCallBack
package edu.jlu.fuliang.library.jdbc;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public interface PreparedStatementCallBack {
public void doInStatement(PreparedStatement stmt) throws SQLException;
}
// ORMaping接口
package edu.jlu.fuliang.library.jdbc;
import java.sql.ResultSet;
public interface ORMaping {
public Object mapping(ResultSet rs,Object o);
}
// JdbcUtils.java
package edu.jlu.fuliang.library.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUtils {
public static Connection createConnection(){ // 为了简单,进行了硬编码
String user = " root " ;
String passwd = " 123456 " ;
String url = " jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=gb2312 " ;
Connection connection = null ;
try {
Class.forName( " com.mysql.jdbc.Driver " ).newInstance();
connection = DriverManager.getConnection(url,user,passwd);
}
catch (Exception e){
e.printStackTrace();
}
return connection;
}
public static PreparedStatement createPreparedStatement(String sql,Connection connection){
PreparedStatement stmt = null ;
try {
stmt = connection.prepareStatement(sql);
} catch (Exception e){
e.printStackTrace();
}
return stmt;
}
public static void closeStatement(Statement s){
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void relaseConnection(Connection connection){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 以下是数据访问对象:
// BorrowerDao.java
package edu.jlu.fuliang.library.dao;
import edu.jlu.fuliang.library.domain.Borrower;
public interface BorrowerDao {
public Borrower queryByLastName(String lastName);
public void updateBorrower(Borrower borrower);
public void insertBorrower(Borrower borrower);
public void deleteBorrowerByLastName(String lastName);
}
// BookDao.java
package edu.jlu.fuliang.library.dao;
import java.util.List;
import edu.jlu.fuliang.library.domain.Book;
public interface BookDao {
public Book queryByTitle(String title);
public List queryByAuthor(String author);
public List queryByBorrowerLastName(String firstName);
public void updateBook(Book book);
public void insertBook(Book book);
public void deleteBookByTile(String title);
}
// BorrowOrReturnDao.java
package edu.jlu.fuliang.library.dao;
public interface BorrowOrReturnDao {
public void borrowBook(String borrowerLastName,String bookTile);
public void returnBook(String borrowerLastName,String bookTile);
}
// 抽象工厂:
package edu.jlu.fuliang.library.dao;
public interface DaoFactory {
public BookDao createBookDao();
public BorrowerDao createBorrowerDao();
public BorrowOrReturnDao createBorrowOrReturnDao();
}
// 具体工厂:
package edu.jlu.fuliang.library.dao;
import edu.jlu.fuliang.library.dao.mysql.BookDaoImpl;
import edu.jlu.fuliang.library.dao.mysql.BorrowerDaoImpl;
public class MysqlDaoFactory implements DaoFactory{
public BookDao createBookDao() {
return new BookDaoImpl();
}
public BorrowerDao createBorrowerDao() {
return new BorrowerDaoImpl();
}
public BorrowOrReturnDao createBorrowOrReturnDao() {
return new BorrowOrReturnDaoImpl();
}
}
// BookDao的具体实现:
// BookDaoImpl.java
package edu.jlu.fuliang.library.dao.mysql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import edu.jlu.fuliang.library.dao.BookDao;
import edu.jlu.fuliang.library.domain.Book;
import edu.jlu.fuliang.library.jdbc. * ;
public class BookDaoImpl implements BookDao{
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
public Book queryByTitle(String title) {
String sql = " select * from book where title = " + title;
return (Book)jdbcTemplate.queryForObject(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BookMaping map = new BookMaping();
Book book = (Book)map.mapping(rs, new Book());
return book;
}
});
}
public List queryByAuthor(String author) {
String sql = " select * from book where author = " + author;
return jdbcTemplate.query(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BookMaping map = new BookMaping();
Book book = (Book)map.mapping(rs, new Book());
return book;
}
});
}
// Borrower的具体实现:
// BookDaoImpl.java
package edu.jlu.fuliang.library.dao.mysql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import edu.jlu.fuliang.library.dao.BorrowerDao;
import edu.jlu.fuliang.library.domain.Borrower;
import edu.jlu.fuliang.library.jdbc.JdbcTemplate;
import edu.jlu.fuliang.library.jdbc.PreparedStatementCallBack;
import edu.jlu.fuliang.library.jdbc.RowCallBackHandler;
public class BorrowerDaoImpl implements BorrowerDao{
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
public Borrower queryByLastName(String lastName) {
String sql = " select * from borrower where lastName = " + lastName;
return (Borrower)jdbcTemplate.queryForObject(sql, new RowCallBackHandler(){
public Object processRow(ResultSet rs) {
BorrowerMaping borrowerMaping = new BorrowerMaping();
return borrowerMaping.mapping(rs, new Borrower());
}
});
}
public void updateBorrower( final Borrower borrower) {
String sql = " update borrower set lastname = ?,firstname=? " +
" ,address =?,city =?,zip=?,state=? where lastname = ? " ;
jdbcTemplate.executeUpdate(sql, new PreparedStatementCallBack(){
public void doInStatement(PreparedStatement stmt) throws SQLException {
stmt.setString( 1 ,borrower.getLastName());
stmt.setString( 2 ,borrower.getFirstName());
stmt.setString( 3 ,borrower.getAddress());
stmt.setString( 4 ,borrower.getCity());
stmt.setString( 5 ,borrower.getZip());
stmt.setString( 6 ,borrower.getState());
stmt.setString( 7