jdbc02

Posted @想太多先森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdbc02相关的知识,希望对你有一定的参考价值。

分层实现新闻管理系统

1.创建新闻信息实体类,jdbc配置文件以及工具类

public class News { // 新闻信息的实体类

    private Integer id;   //编号
    private String categoryId;
    private String title;   //标题
    private String summary;
    private String content;  //内容
    private String picPath;
    private String author;
    private Date createDate;  //创建时间
    private Date modifyDate;  //修改时间
    
    
    @Override
    public String toString() {
        return "News [id=" + id + ", categoryId=" + categoryId + ", title="
                + title + ", summary=" + summary + ", content=" + content
                + ", picPath=" + picPath + ", author=" + author
                + ", createDate=" + createDate + ", modifyDate=" + modifyDate
                + "]";
    }
    
    
    
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }


    public String getCategoryId() {
        return categoryId;
    }
    public void setCategoryId(String categoryId) {
        this.categoryId = categoryId;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getSummary() {
        return summary;
    }
    public void setSummary(String summary) {
        this.summary = summary;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getPicPath() {
        return picPath;
    }
    public void setPicPath(String picPath) {
        this.picPath = picPath;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

}
新闻信息的实体类
//通用的工具类
public class BaseDao {
    //jdbc 需要的API 创建出来
    protected Connection con;   //连接对象
    protected PreparedStatement ps; //执行sql  防止sql注入
    protected ResultSet rs;     //查询的返回结果集
        
    
    //01.开启连接
    public boolean getConnection(){
        //读取配置文件
        String url=ConfigManager.getInstance().getValue("url");
        String user=ConfigManager.getInstance().getValue("userName");
        String password=ConfigManager.getInstance().getValue("password");
        String driver=ConfigManager.getInstance().getValue("driverClass");
        try {
            Class.forName(driver); //加载驱动
            con=DriverManager.getConnection(url,user,password); //创建连接
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    
    //02.关闭连接
   public boolean closeConnection(){
        //如果对象都没有创建 就没法关闭  所以 要非空判断
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
       if (con!=null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
       }
        return true;
    }
    
   /*
    * 03.增删改   executeUpdate
    * 
    * delete from user where name=\'小黑\' and name=\'小白\'
    * 
    * Object ... o 
    * 参数类型是数组类型的!在作为参数的时候  参数个数 可以为0和任意多个
    */
   public  int executeUpdate(String sql,Object... params){
       int updateRow=0;
       if (getConnection()) {  //如果有连接进行操作
           try {
               ps=con.prepareStatement(sql);
               //你在传sql语句的时候   有参数 就给参数赋值
               for (int i = 0; i < params.length; i++) {
                   ps.setObject(i+1, params[i]);
               }
               //执行sql语句
               updateRow=ps.executeUpdate();
           } catch (SQLException e) {
               e.printStackTrace();
           }finally{
               closeConnection();
           }
          }
       return updateRow;
   }
   
   //04.查询  select  * from user  where  id=1
   public  ResultSet executeQuery(String sql,Object... params){
       if (getConnection()) {  //如果有连接进行操作
          try {
            ps=con.prepareStatement(sql);
            //你在传sql语句的时候   有参数 就给参数赋值
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i+1, params[i]);
            }
            //执行sql语句
            rs=ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
         }
       }
       return rs;
   }
   
   
    
    

}
BaseDao
url=jdbc\\:mysql\\://localhost\\:3306/对应的数据库
userName=用户名
password=密码
driverClass=com.mysql.jdbc.Driver
jdbc.properties配置文件
//单例  读取配置文件的工具类
public class ConfigManager {
   //01.创建静态的自身对象
    private  static  ConfigManager manager=new ConfigManager();
    //我们读取的配置文件需要的类
    private static Properties properties;
    
    //02.构造私有化
    private ConfigManager(){
        String  path="jdbc.properties";
        properties=new Properties();
        //获取流
        InputStream stream = 
                ConfigManager.class.getClassLoader().getResourceAsStream(path);
         try {
            properties.load(stream); //读取配置文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //03.提供外部访问的接口
    public  static synchronized ConfigManager getInstance(){
        return manager;
    }
    
    //提供一个获取配置文件 value的方法
    public   static String  getValue(String key){
        return properties.getProperty(key);
    }
    
}
DriverManager工具类

2.创建新闻增删改查功能的接口

public interface NewsDao {  //新闻功能的接口
    //查询所有的新闻信息
    List<News> getAllNews();
    
    //新增新闻
    int addNews(News news);

    //修改新闻
    int updateNews(News news);
    
    //删除新闻
    int deleteNews(News news);
    
    //根据ID查询指定的新闻信息
    News findById(String  id);
}
NewsDao

3.创建Dao层的实现类

//新闻功能的实现类    继承BaseDao  实现  NewsDao
public class NewsDaoImpl extends BaseDao implements NewsDao {

    //获取所有新闻信息
    @Override
    public List<News> getAllNews() {
        getConnection();//获取连接
        String sql="select * from news_detail";
        rs=executeQuery(sql);
        //创建一个集合用来存贮新闻信息
        List<News> list=new ArrayList<News>();
        try {
            while(rs.next()){
                News news=new News();
                //给新闻对象赋值
                news.setId(rs.getInt("id"));
                news.setTitle(rs.getString("title"));
                news.setContent(rs.getString("content"));
                news.setCreateDate(rs.getTimestamp("createDate"));
                news.setAuthor(rs.getString("author"));
                news.setCategoryId(rs.getString("categoryId"));
                news.setModifyDate(rs.getTimestamp("modifyDate"));
                news.setSummary(rs.getString("summary"));
                //把新闻放入集合
                list.add(news);
                }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            closeConnection();
        }
        return list;
    }

    //新增新闻
    @Override
    public int addNews(News news) {
        getConnection();
        String sql="insert into news_detail(id,title,content,createDate) " +
                " values(?,?,?,?)";
        Object [] params={news.getId(),news.getTitle(),news.getContent(),news.getCreateDate()};
        int num=executeUpdate(sql, params);
        return num;
    }

    //修改新闻
    @Override
    public int updateNews(News news) {
        getConnection();
        String sql="update  news_detail set title=? where id=?";
        Object [] params={news.getTitle(),news.getId()};
        int num=executeUpdate(sql, params);
        return num;
    }

    //删除新闻
    @Override
    public int deleteNews(News news) {
        getConnection();
        String sql="delete from  news_detail where id=?";
        Object [] params={news.getId()};
        int num=executeUpdate(sql, params);
        return num;
    }
    
    //查询指定的新闻信息
    @Override
    public News findById(String id) {
        getConnection();
        String sql="select * from  news_detail where id=?";
        Object [] params={id};
        rs=executeQuery(sql, params);
        News news=null;
        try {
            if (rs.next()) {
                news=new News();
                //给新闻对象赋值
                news.setId(rs.getInt("id"));
                news.setTitle(rs.getString("title"));
                news.setContent(rs.getString("content"));
                news.setCreateDate(rs.getTimestamp("createDate"));
                news.setAuthor(rs.getString("author"));
                news.setCategoryId(rs.getString("categoryId"));
                news.setModifyDate(rs.getTimestamp("modifyDate"));
                news.setSummary(rs.getString("summary"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return news;
    }

}
NewsDaoImpl

4.创建业务逻辑层的接口

public interface NewsService {  //新闻的业务逻辑层
      //查询所有的新闻信息
        List<News> getAllNews();
        
        //新增新闻
        void addNews(News news);

        //修改新闻
        void updateNews(News news);
        
        //删除新闻
        void deleteNews(News news);
        //根据ID查询指定的新闻信息
        News findById(String  id);
}
NewsService

5.创建业务逻辑层的实现类

public class NewsServiceImpl implements NewsService {

    // 在不改变dao层代码的前提下,对dao层的方法进行一个逻辑操作/增强!
    private NewsDao dao = new NewsDaoImpl();

    //查询所有的新闻信息
    @Override
    public List<News> getAllNews() {
        return dao.getAllNews();
    }

    // 新增新闻
    @Override
    public void addNews(News news) {
        int num = dao.addNews(news);
        if (num > 0) {
            System.out.println("新增成功");
        } else {
            System.out.println("新增失败");
        }
    }

    //修改新闻
    @Override
    public void updateNews(News news) {
        int num = dao.updateNews(news);
        if (num > 0) {
            System.out.println("更新成功");
        } else {
            System.out.println("更新失败");
        }
    }

    //删除新闻
    @Override
    public void deleteNews(News news) {
        int num = dao.deleteNews(news);
        if (num > 0) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }
    }

    //查询指定的新闻信息
    @Override
    public News findById(String id) {
        return dao.findById(id);
    }

}
NewsServiceImpl

6.创建测试类

public class NewsTest {
    //查询所有新闻
    @Test
    public  void test01(){
        NewsService service=new NewsServiceImpl();
        List<News> list = service.getAllNews();
        for (News news : list) {
            System.out.println(news);
        }
    }
    
    //新增新闻
    @Test
    public  void test02(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(5);
        news.setTitle("新闻5");
        news.setContent("内容5");
        news.setCreateDate(new Date());
        service.addNews(news);
    }
    
    //修改新闻
    @Test
    public  void test03(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(1);
        news.setTitle("新闻5");
        service.updateNews(news);
    }
    
    //删除新闻
    @Test
    public  void test04(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(5);
        service.deleteNews(news);
    }
    //查询指定的新闻
    @Test
    public  void test05(){
        NewsService service=new NewsServiceImpl();
        News news = service.findById("1");
        System.out.println(news);
    }
    
    
    
}
测试类代码

7.总结以及任务

/*连接数据库出现异常信息  try to repair it

在数据库中 使用repair table  表名    即可!

分层开发:   前提已经有了 对应的数据库
 1.jdbc.properties  配置文件
         连接数据库的4要素  
    01.url
    02.驱动
    03.用户名
    04.密码
 2.创建DriverManager 单例的方式 来读取 配置文件

 3.书写了BaseDao   开启 关闭 连接   增删改查 通用操作
 
 4.创建对应的实体类 News
  
 5.创建数据访问层的接口  NewsDao
 
 6. 创建数据访问层的实现类   要继承BaseDao  因为BaseDao中有我需要的获取连接 以及增删改查操作
     实现NewsDao接口
 
 7.创建业务逻辑层的接口  NewsService  目前 因为没有很复杂的逻辑,所以看的时候  感觉    
   NewsService 和 NewsDao代码一致
 
 8.创建业务逻辑层的实现类  NewsServiceImpl
       类中创建了 NewsDao的实例 ,调用dao层的方法
     
 9.书写测试类   
    
    
  
  
  任务
  
  01.数据库  
  创建一个数据库   School  
    创建一个表Student   
     字段   
      id    int
      name  varchar  
      age   int
      birthday  date
   至少5条测试数据   
      
      
 02.java代码实现的功能
    001.查询所有学生信息
    002.根据ID查询指定学生的信息
    003.修改指定学生的信息
    004.删除指定学生
    */
总结以及任务部分

 8.把后台的数据拿到前台的jsp页面

<%@page import="cn.bdqn.bean.News"%>
<%@page import="cn.bdqn.service.impl.NewsServiceImpl"%>
<%@page import="cn.bdqn.service.NewsService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html>
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP \'index.jsp\' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <style type="text/css">
    <%-- 表格中的数据 居中显示    --%>
     td{
    text-align: center;  
     }
    </style>
  </head>
  
  <body>
  
  <h1>显示新闻信息</h1>
  <table border="1">
     <tr>
      <td>新闻编号</td>
      <td>新闻标题</td>
      <td>新闻作者</td>
      <td>创建时间</td>
     </tr>
     
     <jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl"/>
  <%
      //NewsService service=new NewsServiceImpl();  
     List<News> news= service.getAllNews();
     for(News n:news){
  %>
    <tr>
       <td><%=n.getId()%></td>
      <td><%=n.getTitle()%></td>
      <td><%=n.getAuthor()%></td>
      <td><%=n.getCreateDate()%></td>
    </tr>
    <% }%>
     </table>
  </body>
</html>
newsList.jsp

9.分页

 

 

 

  mysql的分页 

SELECT * FROM news_detail  LIMIT 0,2   从第一条数据开始,每页显示2条数据

SELECT * FROM news_detail  LIMIT 1,2   从第二条数据开始,每页显示2条数据

SELECT * FROM news_detail  LIMIT 2,2   从第三条数据开始,每页显示2条数据

pageIndex====当前页

pageSize=====每页显示几条数据

totalPageCount===总页数

totalCountSize===总记录数   数据库中 一共有多少条(行)数据

问题?

现在我们写是 新闻管理系统!  需要分页显示!

之后写的别的项目  超市管理系统! 需要分页不???

都有分页的需求!

写一个分页的工具类!分页的工具类写什么???就写分页的四要素!

 

public class PageUtil {   //分页的工具类

    private Integer pageIndex=1;// 当前页
    private Integer pageSize=0;// 每页显示几条数据
    private Integer totalPageCount=1;// 总页数
    private Integer totalCountSize=0;// 总记录数
    
    //  set   赋值操作
    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    
    public void setTotalPageCount(Integer totalPageCount) {
        this.totalPageCount = totalPageCount;
    }
    /*
     * 只要我们知道了 总记录数    总页数就可以计算了!
     * 我们如果按照 下面的方式 进行书写 
     * 那么 必须先给 总记录数 赋值
     * 之后才能取总页数的值
     */
    public void setTotalCountSize(Integer totalCountSize) {
        if (totalCountSize>0) {  //如果大于0   可以分页
            this.totalCountSize = totalCountSize; 
            //计算总页数??   总记录数%页大小==0?(总记录数/页大小):(总记录数/页大小+1)
            totalPageCount=
                    (totalCountSize%pageSize==0)?(totalCountSize/pageSize):(totalCountSize/pageSize+1);
        }
    }
    
    
    //   get方法
    public Integer getPageIndex() {
        return pageIndex;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public Integer getTotalPageCount() {
        return totalPageCount;
    }
    public Integer getTotalCountSize() {
        return totalCountSize;
    }
    
}
PageUtil工具类

10.在对应的类或接口中增加方法

/**
     * 分页查询 所有的新闻信息     但是 前提   必须要获取 新闻信息的总记录数
     * @param pageIndex   当前的页码
     * @param pageSize    每页显示的条数
     * @return           分页显示的所有新闻列表
     */
    List<News> getNewsByPageList(int  pageIndex,int pageSize);
    
    //获取新闻的总记录数
    int getTotalCountSize();
NewsDao
//查询总记录数
    public int getTotalCountSize() {
        getConnection();
        String  sql="select  count(*)  as count from news_detail";
        rs=executeQuery(sql);
        //定义变量 来接收 返回的 总记录数
        int totalCountSize=0;
        try {
            if (rs.next()) {
                totalCountSize=rs.getInt("count");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            closeConnection();
        }
        return totalCountSize;
    }

    
    
    
      //分页查询    
        public List<News> getNewsByPageList(int pageIndex, int pageSize) {
            //既然返回一个集合  我就创建一个news的泛型集合
            ArrayList <News> list=new ArrayList<News>();
            /*
             * 
             * 用户输入的页码pageIndex               转化成第几条给数据库查询
             *           1                                     0  
             *           2                                     1  
             *           3                                     2  
             *  用户传1  我们变成0  代表从第一条数据开始
             *  用户传2 我们变成2 代表从第三条数据开始
             *  
             * 我们想给数据库的值=(用户输入的页码-1)*每页显示的数量
             * pageIndex=(pageIndex-1)*pageSize
             */
            String sql="select * from news_detail limit ?,?";
            pageIndex=(pageIndex-1)*pageSize;
            Object [] params={pageIndex,pageSize};
            rs=executeQuery(sql, params);
            try {
                while(rs.next()){
                    News news=new News();
                    news.setId(rs.getInt("id"));
                    news.setTitle(rs.getString("title"));
                    news.setAuthor(rs.getString("author"));
                    news.setCreateDate(rs.getTimestamp("createDate"));
                    //向集合中增加数据
                    list.add(news);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                closeConnection();
            }
            return list;
        }
NewsDaoImpl
 /**
         * 分页查询 所有的新闻信息     但是 前提   必须要获取 新闻信息的总记录数
         * @param pageIndex   当前的页码
         * 关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

[linux][c/c++]代码片段02

JDBC操作数据库之查询数据

JDBC02 加载JDBC驱动 建立连接