连接数据库进行增删改查(基本)上
这里需要用到jar包
1.首先在数据库中建表
2.编写工具类,用来连接数据库以及关流,3306是数据库MySQL的端口号
public static Connection getconn() { Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/newdb_17?useUnicode=true&"; try { conn=DriverManager.getConnection(url, "root", "root");//(这里是链接地址,以及连接数据库的用户名,密码) System.out.println("连接成功!!!"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void close(Connection conn,Statement state,ResultSet res) throws SQLException {//关闭流 if (res!=null) { res.close(); } if (state!=null) { state.close(); } if (conn!=null) { conn.close(); } }
3.根据数据库中的数据来创建实体类
例如这个实体类,根据数据库中的字段来写,一定要有get,set方法
private int newsId; private String newsTitle; private String newsAuthor; public int getNewsId() { return newsId; } public void setNewsId(int newsId) { this.newsId = newsId; } public String getNewsTitle() { return newsTitle; } public void setNewsTitle(String newsTitle) { this.newsTitle = newsTitle; } public String getNewsAuthor() { return newsAuthor; } public void setNewsAuthor(String newsAuthor) { this.newsAuthor = newsAuthor; }
4.这里是关于dao层,servlet层的一些介绍
dao层接口,这里写增删改查的一些方法
import java.util.List; import com.bw.Beng.NewsBeng; public interface NewsDao {
//查询返回的是一个集合,所以是list List<NewsBeng> listseclet();
//这是删除的方法,返回的是影响行数,所以是int类型,
//删除哪一条数据是根据主键id来删除,所以这里传来一个id参数,因为从前台传来的数据默认是string类型,所以是string类型的id int deletenews(String id);
//这是修改的方法,因为要确认修改成功所以返回影响行数,所以是int类型
//修改是要修改这个数据库里的一行数据,不是单个的数据,所以传入的参数是一个实体类 int updateNews(NewsBeng newsBeng);
//修改涉及到一个数据的回显,因为要修改是要参照之前的数据来进行修改,所以这里的方法是根据要修改的这一条数据的id来查找到这要修改的一行数据的内容
//所以这里返回的是一个实体类,传入的参数也是一个实体类 NewsBeng selectnews(NewsBeng newsBeng);
//这个方法是用来添加的,要判断这一条数据是否添加成功,返回的是一个影响行数
//因为添加的是一条数据,所以传入的参数是一个实体类 int insertNews(NewsBeng newsBeng); }
因为接口里写了这些增删改查的方法,要让这些方法真正的起作用,就要实现这个接口,重写里面的增删改查的方法
public class NewsDaoPlml implements NewsDao{ }
然后就是servlet层,这里创建servlet层是要点击鼠标右键->new->servlet
这个servlet层存在就是要把后台获取到的数据传到前台,或者前台的数据返回给后台
5.首先我们可以写一个数据的查询,在页面显示
第一步:在dao层的接口中写出查询的方法
//查询返回的是一个集合,所以是list List<NewsBeng> listseclet();
第二步:在实现这个dao接口的类中,重写这个查询的方法(注释都在代码里)
@Override public List<NewsBeng> listseclet() { // TODO Auto-generated method stub List<NewsBeng> list=new ArrayList<NewsBeng>();//因为查询返回的是一个集合,所以先new一个list集合 Connection conn=null;//代表与数据源也就是数据库进行的唯一会话,也就是用来连接数据库的 PreparedStatement prestate=null;//这是用来编译sql语句的 ResultSet res=null;//这是返回的结果集,用来获取数据 conn=BaseDao.getconn();//连接数据库的工具类 String sql="select * from news";//写出sql语句 try { prestate=conn.prepareStatement(sql);//编译sql语句 res=prestate.executeQuery();//得到结果集 while (res.next()) {//因为查询是查到的所有数据所以这里写了一个循环res.next()这个方法是用来判断有没有下一条数据,没有循环结束 NewsBeng newsBeng=new NewsBeng();//因为我们查询到的数据是一条一条的而不是一个一个的所以就要把一条中的数据通过set方法保存到所对应的实体类中 newsBeng.setNewsId(res.getInt("newsId"));//这里的结果集中的数据的字段名与数据库中的字段名保持一致 newsBeng.setNewsTitle(res.getString("newsTitle")); newsBeng.setNewsAuthor(res.getString("newsAuthor")); list.add(newsBeng);//最后把实体类存入list集合 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { BaseDao.close(conn, prestate, res);//关流 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return list;//返回这个集合 }
接着就是写servlet层,一般都是在dopost()的方法里面写(注释里有过程)
@WebServlet("/ShowServlet.do") public class ShowServlet extends HttpServlet { private static final long serialVersionUID = 1L; NewsDaoPlml daoPlml=new NewsDaoPlml();//new一个dao层实现类 /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response);//这里就要写doPost的方法 } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");//修改字符集,防止出现乱码 response.setCharacterEncoding("utf-8"); List<NewsBeng> list = daoPlml.listseclet();//因为要得到从数据库中查询到的数据,所以要调用dao层实现类的查询方法 if (list!=null) {//判断得到的结果是不是空的,如果不是空的说明查询到数据了,就要传给前台 request.setAttribute("list", list);//这个方法是用来给吧后台的数据传给前台 request.getRequestDispatcher("show.jsp").forward(request, response);//这是转发到哪个页面,这个类对应着运行哪个页面 } } }
后台处理完之后就开始处理前台,首先这个查询的页面的命名要与sevlet层所对应的页面的命名保持一致
<%@ page language="java"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>//导入c标签,就可以用c标签里的方法
<!DOCTYPE html>
<html>
<head>
<title>新闻表</title>
</head>
<body>
<table border="1">//border表示表格的线的宽度
<tr>//tr代表行
<td>编号</td>//td代表一行里面的字段
<td>标题</td>
<td>作者</td>
<td>操作</td>
</tr>//items表示所要遍历的集合,要与后台传的字段名保持一致 var表示设置一个字段,根据这个字段来遍历
<c:forEach items="${list}" var="a" varStatus="status">//因为我们从数据库中查询到的是一个集合,所以用c标签中的forEach来遍历
<tr>
<td>${a.newsId}</td>//这里的字段名要与实体类中的字段名保持一致
<td>${a.newsTitle}</td>
<td>${a.newsAuthor}</td>
<td><a href="DeleteServlet.do?newsId=${a.newsId}">删除</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
到这里查询就写完了,记住在运行的时候要把自己的这个项目放入Tomcat server中,可以找到server->Tomcat->然后右击->找到Add and Remove,对这个项目进行添加
运行在浏览器的地址最后写的 项目名/ShowServlet.do这里是servlet层里的
@WebServlet("/ShowServlet.do")里面写的地址
6.写完查询之后,作者认为删除方法是最好写的,所以这里是删除方法的写作过程
首先是在查询中的页面协商删除的超链接
//这里的参数要传入的地址是servlet层处理删除的@WebServlet("/DeleteServlet.do")里面写的地址,不要传错了
<td><a href="DeleteServlet.do?newsId=${a.newsId}">删除</a> //因为删除是要根据主键id来进行删除的,所以要在这里传一个所要删除的那一条数据的id </td>
接着写dao层接口写删除的方法
//这是删除的方法,返回的是影响行数,所以是int类型, //删除哪一条数据是根据主键id来删除,所以这里传来一个id参数,因为从前台传来的数据默认是string类型,所以是string类型的id int deletenews(String id);
接着就是在实现类中重写这个方法
@Override public int deletenews(String id) { // TODO Auto-generated method stub Connection conn=null; PreparedStatement prestate=null; int reluset=0;//这里就是获取影响行数所创建的int型 conn=BaseDao.getconn(); String sql="delete from news where newsId=?"; try { prestate=conn.prepareStatement(sql); prestate.setString(1, id);//因为sql语句中有问号,这里是给那个问号赋值,1表示是第几个问号,id表示从前端页面传过来的id数据 reluset=prestate.executeUpdate();//通过这个方法获取影响行数,给int类型的变量赋值 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { BaseDao.close(conn, prestate, null); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return reluset;//返回影响行数 }
创建servlet层
package com.bw.ServletPlml; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bw.Dao.plml.NewsDaoPlml; /** * Servlet implementation class DeleteServlet */ @WebServlet("/DeleteServlet.do")//要删除的页面的地址传数据写的是这里的地址 public class DeleteServlet extends HttpServlet { private static final long serialVersionUID = 1L; NewsDaoPlml daoPlml=new NewsDaoPlml();//new一个dao层的实现类,以为要调用里面重写的方法 /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String id = request.getParameter("newsId");//因为从前台发送数据给了后台,所以这个方法是用来获取所传过来的数据 int deletenews = daoPlml.deletenews(id);//调用dao层实现类的删除方法,获得一个影响行数 if (deletenews>0) {//当影响行数大于0时,说明数据删除成功,就可以在页面进行数据更新了 request.getRequestDispatcher("ShowServlet.do").forward(request, response);//转发到查询的页面,更新数据 } } }
到这里删除就结束了