一、
1、Dao层 对数据库的底层操作 增删改查
package Dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import DBUtil.DBUtil; import User.User; public class Dao{ //Dao层实现对数据库的操作 //增 //添加到 %表名% 表中 public boolean insert(User user){ //插入的sql语句 String sql="insert into user(name,ID,sex,mark) values('"+user.getName()+"','"+user.getID()+"','"+user.getSex()+"','"+user.getMark()+"')"; //insert语句: //insert into table_name (column1,column2,column3,...) values (value1,value2,value3,...); //注意:insert这里 values(100,'String','"+bianliang+"'),数字可以直接上,字符串的话用 '',变量的话要用 '"++"' Connection conn=DBUtil.getConn();//添加数据库,加载驱动 Statement state=null;//创建statement对象并置空 try { //实例化statement对象 方便操作 state=conn.createStatement(); state.executeUpdate(sql); //执行数据库更新操作用于执行insert、update或delete语句以及SQLDDL(数据定义语言)语句, //例如creattable和droptable,(创建表和删除表) } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常), //经常被用在需要释放资源的情况下。 finally { DBUtil.close(state, conn);//clase 释放资源 } return false; } //删 //根据ID删除 public boolean delete(String name,String ID){ //插入sql 语句 String sql="delete from user where ID='"+ID+"' and name='"+name+"' "; //删除语句: //delete from table_name where some_colume=some_value Connection conn =DBUtil.getConn(); Statement state=null; try { state=conn.createStatement(); state.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtil.close(state, conn); } return false; } //改 //根据ID更改 public boolean update(User user) { //插入sql 语句 String sql="update user set name='"+user.getName()+"',sex='"+user.getSex()+"',mark='"+user.getMark()+"' where ID='"+user.getID()+"' "; //update语句: //update table_name set column1=value1,column2=value2 where some_column=some_value; Connection conn=DBUtil.getConn(); Statement state=null; try { state=conn.createStatement(); state.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtil.close(state, conn); } return false; } //查 //按照ID查 public User select(String ID) { //插入sql 语句 String sql="select * from where ID='"+ID+"'"; Connection conn=DBUtil.getConn(); Statement state=null; ResultSet rs=null; try { state=conn.createStatement(); rs=state.executeQuery(sql); User user=null; while(rs.next()) { String name=rs.getString("name"); String sex=rs.getString("sex"); String mark=rs.getString("mark"); user=new User(name,ID,sex,mark); return user; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { DBUtil.close(rs, state, conn); } return null; } //遍历 public List<User> list(){ //插入sql语句 String sql="select * from user order by ID asc"; //select语句 //select * from tabel_name 这是查询所有,若要查询某一列 //select column1_name,column2_name,column3_name from table_name List<User>list=new ArrayList<>(); //给集合list创造(new)一个存储空间用于存放数据 Connection conn=DBUtil.getConn(); Statement state=null; ResultSet rs=null; try{ state=conn.createStatement(); rs=state.executeQuery(sql); User user=null; while(rs.next()) {//注意:这里用双引号,ID是表user里的ID列 String name=rs.getString("name"); String ID=rs.getString("ID"); String sex=rs.getString("sex"); String mark=rs.getString("mark"); user=new User(name,ID,sex,mark); list.add(user); //表示,把bean里的数据存入到list当中 } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(state, conn); } return list; } //验证ID唯一 public boolean only(String ID) { //定义标记 boolean flag=false; //插入sql语句 String sql="select * from user where ID = '"+ID+"'"; Connection conn=DBUtil.getConn(); Statement state=null; ResultSet rs=null; try { state=conn.createStatement(); rs=state.executeQuery(sql); //要用statement类的executeQuery()方法来下达select指令以查询数据库, //executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用。 while (rs.next()) { flag = true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { DBUtil.close(rs, state, conn); } return flag; } }
2、DBUtil 连接数据库(每次更改的时候只需要更改数据库名,如果有多个数据库需要连接则需要多写几个,没有用连接池)
package DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil{ //sql语句字符串 public static String db_url="jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT"; //数据库名 public static String db_name="root"; //数据库密码 public static String db_password="123456"; public static Connection getConn() { //声明connection类型对象,指向空 Connection conn=null; //连接驱动 //链接数据库 try { //驱动程序名 Class.forName("com.mysql.cj.jdbc.Driver"); //具体地连接到数据库——联接字符串(数据库名),联接用户名,联接密码名 conn =DriverManager.getConnection(db_url, db_name, db_password); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void close(Statement state, Connection conn) { if(state !=null) { try { state.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void close(ResultSet rs,Statement state, Connection conn) { if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(state!=null) { try { state.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
3、Service层 这个层内没有什么实际的功能,只是对Dao层的调用,有利于增强系统的安全性
package Service; import java.util.List; import java.util.ArrayList; import Dao.Dao; import User.User; //Service 是服务层 相当于一个封装层,封装那些与业务相关的通用数据接口 public class Service{ Dao cdao=new Dao(); /** * 添加 * @param course * @return */ //增 public boolean insert(User user) { boolean flag=false; if(!cdao.only(user.getID())) { cdao.insert(user); flag=true; } return flag; } //删 public void delete(String name,String ID) { cdao.delete(name, ID); } //改 public void update(User user) { cdao.update(user); } //查 //按照ID查 public User select(String ID) { return cdao.select(ID); } //按照name查 //遍历 public List<User> list() { return cdao.list(); } }
4.servlet层 负责实现页面和数据库之间数据的传递和跳转,通过接受来自页面的命令来选择接下来调用的方法,类似于接话员,如果有多种跳转方式,可以写多个servlet层,避免代码量太大,分解成一个个小问题,使问题简单化
package Servlet; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; 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 Service.Service; import User.User; @WebServlet("/servlet") public class Servlet extends HttpServlet { Service service=new Service(); protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //req是Request(请求)的简写,指的是从jsp/html界面请求回数据,即 jsp/html → 底层 //resp是Response(回答)的简写,指的是发送给jsp/html的数据,,即 底层 → jsp/html req.setCharacterEncoding("utf-8");//设置从jsp或HTML中请求数据的值,也就是设置为中文,防止乱码 String method=req.getParameter("method");//getParameter()获取的是客户端设置的数据。 //增 if("insert".equals(method)) { insert(req,resp); } //删 else if("delete".equals(method)) { delete(req,resp); } //改 else if("update".equals(method)) { update(req,resp); } //查 else if("list".equals(method)) { list(req,resp); } } //增 private void insert(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException { //首先读取前端网页数据并将数据存入创建的User存储空间里,即 jsp/html → servlet req.setCharacterEncoding("utf-8");//解码方式 String name=req.getParameter("name"); String ID=req.getParameter("ID"); String sex=req.getParameter("sex"); String mark=req.getParameter("mark"); //req.getParameter 只能获得String类型的数据 //如果是其他类型的数据需要用到Integer.parseInt(req.getParameter())来数据类型转换 User user=new User(name,ID,sex,mark); //其次进行把user里的数据与添加到数据库里,即 servlet → mysql数据库 //并跳转,req.getRequestDispatcher("add.jsp").forward(req, resp);这一步是跳转到前端jsp/html界面 if(service.insert(user)) { //如果添加成功 req.setAttribute("message", "添加成功"); //这里表示,在req的作用域中设置一个massage变量,变量内容是:添加成功 //然后,当跳转到它下一个界面时,这个作用域里的值可以通过Object message =request.getAttribute("message")拿出来使用 req.getRequestDispatcher("login.jsp").forward(req, resp); } else { //处理失败 req.setAttribute("message", "添加重复,请重新输入"); req.getRequestDispatcher("add.jsp").forward(req, resp); } } //删除 private void delete(HttpServletRequest req,HttpServletResponse resp)throws IOException, ServletException { req.setCharacterEncoding("utf-8"); String ID=req.getParameter("ID"); String name=req.getParameter("name"); service.delete(ID, name); req.setAttribute("message", "删除成功"); req.getRequestDispatcher("servlet?method=list").forward(req, resp); } //修改 private void update(HttpServletRequest req,HttpServletResponse resp)throws IOException, ServletException { req.setCharacterEncoding("utf-8"); String ID=req.getParameter("ID"); String name=req.getParameter("name"); String sex=req.getParameter("sex"); String mark=req.getParameter("mark"); User user=new User(name,ID,sex,mark); service.update(user); //对数据库进行修改; req.setAttribute("message", "修改成功"); req.getRequestDispatcher("servlet?method=list").forward(req,resp); //?method=list表示传一个叫做method的参数,他的值是list,你可以在Servlet中用request.getParam...获取到。 } //查 private void select(HttpServletRequest req,HttpServletResponse resp)throws IOException, ServletException { req.setCharacterEncoding("utf-8"); String ID=req.getParameter("ID"); User user=service.select(ID); req.setAttribute("user", user); req.getRequestDispatcher("list.jsp").forward(req,resp); //?method=list表示传一个叫做method的参数,他的值是list,你可以在Servlet中用request.getParam...获取到。 } //全部 private void list(HttpServletRequest req,HttpServletResponse resp)throws IOException, ServletException { req.setCharacterEncoding("utf-8"); List<User> user = service.list(); req.setAttribute("user", user); req.getRequestDispatcher("select.jsp").forward(req,resp); } }
5、javabean 以user为例,封装一个和数据库相同的类,用来实现数据的封装以及之后数据的传递,内部主要是每个数据成员的get和set以及构造方法的书写和toString等方法的重写等等
package User; public class User { private String name; private String ID; private String sex; private String mark; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getID() { return ID; } public void setID(String iD) { ID = iD; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getMark() { return mark; } public void setMark(String mark) { this.mark = mark; } public User() { } public User(String ID, String name, String sex,String mark) { this.name=name; this.ID=ID; this.sex=sex; this.mark=mark; } }
二、
这个模板是最简单也是最基础的模板,还有高级的如c3p0连接池等等,越高级的代码量越少,所以之后还需要对高级方法的学习。