本部份内容,主要实现对数据库的基本操做,并更换数据访问部分,将原来的使用文件存储更换为数据库进行数据的存储java
在项目中,要引入mysql的驱动程序mysql
在项目根目录下,建立lib文件夹,将mysql的驱动程序复制到lib目录下,而后在项目中引用sql
数据库名称: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');
db.properties文件中保存数据库的链接信息,一行一组数据,格式是key=value内容以下 ide
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db_book user=root password=hyg760414
对应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(); } } }
在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); }
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; } }
该类主要实现数据访问层的功能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); } }
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; } }
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); } }
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();