3.1 本项目的将按照企业标准开发流程,将程序分成几个层次,同时使用mysql数据库,IDEA开发工具
|
3.2 本程序主要是对新闻数据(编号、标题、发布日期、内容)的一个维护,具体要求:
a. 业务层--增加新闻数据
数据层--新闻表中保存新增的数据
b. 业务层--要列表实现新闻数据,同时还要求分页
数据层--通过数据库查询部分数据
数据层--统计所有新闻数据量
c. 业务层--可以修改新闻数据
数据层--修改标题和内容,不允许修改编号和发布日期
d. 业务层--可以删除指定新闻数据
数据层--通过编号批量删除数据
3.3 本次开发只实现最核心的功能,不涉及数据验证。
3.4 编写数据库脚本
news.sql
-- 删除数据库
DROP DATABASE IF EXISTS ms ;
-- 创建数据表
CREATE DATABASE ms CHARACTER SET UTF8 ;
-- 使用数据库
USE ms ;
-- 删除数据表
DROP TABLE IF EXISTS news ;
-- 创建数据表
CREATE TABLE news (
nid INT AUTO_INCREMENT ,
title VARCHAR(50) ,
pubdate DATETIME ,
content TEXT ,
CONSTRAINT pk_nid PRIMARY KEY (nid)
)type=innodb;
|
3.5 利用IDEA工具创建一个NewsProject项目,并导入bootstrap开发包和jquery的js文件,然后导入数据库脚本到src目录下
3.6 利用mysql数据库工具运行上面的脚本从而建立一个数据表
|
3.7 通过以上步骤完成了一些准备工作,现在为项目继续准备数据库的驱动程序
|
3.8 现在定义一个数据库连接的类,它只负责数据库的打开与关闭
DatabaseConnection.java
public class DatabaseConnection {
private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
private static final String DBURL = "jdbc:mysql://localhost:3306/ms" ;
private static final String USER = "root" ;
private static final String PWD = "o" ;
private Connection conn ;
public DatabaseConnection(){
try {
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL, USER, PWD);
}catch(Exception e){
e.printStackTrace();
}
}
public Connection getConnection(){
return conn ;
}
public void close(){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
|
public class News implements Serializable{
private Integer nid ;
private String title ;
private String content ;
private Date pubdate ;
public Integer getNid() {
return nid;
}
public void setNid(Integer nid) {
this.nid = nid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getPubdate() {
return pubdate;
}
public void setPubdate(Date pubdate) {
this.pubdate = pubdate;
}
}
|
3.10 定义数据层的开发,这个层主要通过PreparedStatement类进行操作
|
3.11 首先定义一个dao层的接口
INewsDAO.java
public interface INewsDAO {
public boolean doCreate(News vo) throws Exception ;
public boolean doUpdate(News vo) throws Exception ;
public boolean doRemoveBatch(Set<Integer> nids) throws Exception ;
public News findById(Integer nid)throws Exception ;
public List<News> findAll(Integer currentPage,Integer lineSize)throws Exception ;
public Integer getAllCount()throws Exception ;
}
|
3.12 然后再定义上面接口的实现子类
NewsDAOImpl.java
public class NewsDAOImpl implements INewsDAO{
private Connection conn ;
private PreparedStatement pstmt ;
String sql = null ;
public NewsDAOImpl(Connection conn){
this.conn = conn ;
}
public boolean doCreate(News vo) throws Exception {
sql = "INSERT INTO news(title,pubdate,content) VALUES(?,?,?)" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,vo.getTitle());
pstmt.setDate(2,new java.sql.Date(vo.getPubdate().getTime()));
pstmt.setString(3,vo.getContent());
return pstmt.executeUpdate()>0;
}
public boolean doUpdate(News vo) throws Exception {
sql = "UPDATE news SET title=?,content=? WHERE nid=?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,vo.getTitle());
pstmt.setString(2,vo.getContent());
pstmt.setInt(1,vo.getNid());
return pstmt.executeUpdate()>0;
}
public boolean doRemoveBatch(Set<Integer> nids) throws Exception {
if(nids.size() == 0)
return false ;
StringBuffer sql = new StringBuffer("DELETE FROM news WHERE nid IN (");
Iterator<Integer> iter = nids.iterator() ;
while(iter.hasNext()){
sql.append(iter.next()+",") ;
}
sql.delete(sql.length()-1,sql.length()).append(")") ; //删除最后那个逗号
pstmt = conn.prepareStatement(sql.toString()) ;
return pstmt.executeUpdate() == nids.size(); //不能用"> 0"这样不能保证所有的都能被删除
}
public List<News> findAll(Integer currentPage, Integer lineSize) throws Exception {
sql = "SELECT nid,title,content,pubdate FROM news LIMIT ?,? " ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setInt(1,(currentPage-1)*lineSize);
pstmt.setInt(2,lineSize);
List<News> list = new ArrayList<News>() ;
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
News news = new News();
news.setNid(rs.getInt("nid"));
news.setTitle(rs.getString("title"));
news.setContent(rs.getString("content"));
news.setPubdate(rs.getDate("pubdate"));
list.add(news) ;
}
return list;
}
public Integer getAllCount() throws Exception {
sql = "SELECT COUNT(*) FROM news" ;
pstmt = conn.prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
if(rs.next())
return rs.getInt(1);
return 0 ;
}
}
|
3.13 在定义了DAO层的实现类和接口以后,那么就需要为这个dao层定义一个工厂类,通过此工厂类就能得到DAO接口的对象