首先一定要下载好驱动文件。然后记得一定要先加载到项目中!驱动文件下载连接:已经有写好的数据库文件以及前端页面了
例如我的是mysql驱动。就将mysql-connector-java-5.1.38-bin.jar添加到webcontent的web-inf下的lib中就可以了~
遵循固定代码格式,不必多说:
最基本必经步骤(demo在后面)
1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
我这里以mysql为例,其它的数据库对应不同的名字。
2.建立连接( url , 用户,密码)
Connection conn=DriverManager.getConnection(url,user,psw);
这里的url,例如 String url="jdbc:mysql://localhost/diary"; 表示数据库diary的url。
由于mysql默认端口是3306,所以上面的字符串也可以替换为jdbc:mysql://localhost:3306/diary。改端口可防止别人攻击。
user一般都是“root";使用数据库的人,即我们。mysql的用户就只有我们本人(开发者),不是用户。
psw:数据库密码,emm..每个人的都不同,输入进入数据库的密码即可。
3.得到数据库对象
Statement stmt=conn.createStatement();
可以将stmt理解成它就是一个和mysql等价的数据库(映射)。
4.根据sql语句得到的结果集
ResultSet rs=stmt.executeQuery(sql);
例如我们的sql语句是”select * from tb_user“(数据库操作语句,代表从数据库中打印出tb_user表的所有内容)
5.操作完成要关闭数据库
rs.close();
stmt.close();
conn.close();
关闭的顺序要和创建的相反,因为,例如stmt是由conn得到的,如果先关闭conn,可能导致stmt失去目标,可能会出错。
必须注意:不论是.ResultSet,Statement,Connection 还是 DriverManager,
导包的时候必须使用java.sql包!不能是其它的否则报错!
在数据库中将表创建好(或者直接复制我上面提供的资源里面的表也行).
例如我的数据库diary中的某张表 tb_user如下:
在jsp文件中写个小demo运行下:
<%@page import="java.sql.ResultSet"%> <%@page import="java.sql.Statement"%> <%@page import="java.sql.Connection"%> <%@page import="java.sql.DriverManager"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% String url="jdbc:mysql://localhost/diary"; String user="root"; String psw="0410"; String sql="select * from tb_user";//sql语句,查询diary下的tb_user表 //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.建立连接(url,用户,密码) Connection conn=DriverManager.getConnection(url,user,psw); //3.生成statement对象 ,即我们的数据库 Statement stmt=conn.createStatement(); //4.生成可以对数据库进行操作的对象,根据sql语句得到的结果集 ResultSet rs=stmt.executeQuery(sql); //对结果集进行操作 while(rs.next()){ //getInt()中可以填两个值columnIndex和colunmnLabel。 //前者通过列索引去搜索,后者是直接通过字段名字得到数据。 out.print("ID:"+rs.getInt(1)); out.print("username:"+rs.getString("username")); out.print("psw:"+rs.getString(3)); out.print("<br>"); } //5.取值完成要关闭 rs.close(); stmt.close(); conn.close(); %> </body> </html>输出: ID:1username:amypsw:123
ID:2username:Benpsw:123。
说明我们的数据库已经可以正常工作啦~
实战篇:在页面上对数据库的用户信息进行增删改查操作。
为了代码的简洁,我们将前面提到的6个固定步骤封装成一个java类。(别在jsp中过多用java,会难以维护)
ConnDB.java: 将与数据库相关的操作封装到这里,免得每次都需要重复写上述的6个固定步骤。
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.sun.corba.se.spi.orbutil.fsm.State; public class ConnDB { public Connection connection; public Statement stmt ; public ResultSet rs ; public String url="jdbc:mysql://localhost/diary"; public String user="root"; private String psw="0410"; public ConnDB(){ connection=getConnection(); try { stmt=connection.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } public Connection getConnection(){ try { Class.forName("com.mysql.jdbc.Driver"); connection=DriverManager.getConnection(url,user,psw); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return connection; } public void close(){ try{ if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if (connection!=null) { connection.close(); } }catch (SQLException e) { e.printStackTrace(); } } public ResultSet executeQuery(String sql){ try { rs=stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } }
User.java: 存储用户信息的类
package entity; public class User { private int id; private String username; private String pwd; private String email; private String question; private String answer; private String city; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
然后再写我们需要在页面上显示的样子的jsp代码,类似这样:
userlist.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*,entity.User"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1>用户列表</h1><a href="adduser.jsp">添加用户</a> <% List<User> users =(List<User>) request.getAttribute("users"); %> <table border="1"> <tr> <th>编号</th> <th>用户名</th> <th>密码</th> <th>电子邮件</th> <th>操作</th> </tr> <% for(User user:users){ %> <tr><td><%=user.getId()%></td> <td><%=user.getUsername() %></td> <td><%=user.getPwd() %></td> <td><%=user.getEmail() %></td> <td><a href="UserServlet?action=del&id=<%=user.getId()%>"onclick="javascript:return confirm('确认删除吗?');"> 删除</a></td></tr> <% } %> </table> </body> </html>
我们在userlist.jsp中规定了,当点“删除”的时候,会转到UserServlet.java中。当点击“添加用户”的时候,先跳转到adduser.jsp中,这个jsp页面长这样:
adduser.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>添加用户</title> </head> <body> <form action='UserServlet' method="post"> 用户名:<input name="username"><br> 密码:<input name="pwd"><br> 电子邮件:<input name="email"><br> 密保问题:<input name="question"><br> 问题答案:<input name="answer"><br> 所在城市:<select name="city"><br> <option>北京</option><br> <option>广州</option><br> </select> <input type="submit" value="提交"> </form> </body> </html>
可以在adduser.jsp中看到,当点击提交的时候同样会跳转到UserServlet.java中。
UserServlet.java 这个Servlet的java类负责将表格中的数据添加到数据库中,也负责删除数据。
在这里就有疑问了,删除数据还好说,但是我们添加的数据是将6个值(不包括id)插入数据库但是表结构有7列,7个字段啊,怎么办呢,在这里使用
“insert into tb_user(username,pwd,email,question,answer,city)values(?,?,?,?,?,?) ”
这条sql语句就行了,根据字段在括号中的位置能够按顺序对应需要插入的列。
但是还有一个问题,我们都知道,在真正写sql操作语句的时候,只能写具体值,比如:
insert into tb_user('aich','no','no','123','北京')values(?,?,?,?,?,?)
直接传入一个变量是什么鬼,这....对于sql语句而言不行啊。那怎么办?
还好java已经考虑到了这个,提供了“PreparedStatement”类来实现这个。
所以我们的UserServlet.java代码如下:
package myservlet; import java.io.IOException; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; 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.mysql.fabric.Response; import java.sql.Connection; import util.ConnDB; @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { private ConnDB connDB=new ConnDB(); private static final long serialVersionUID = 1L; public UserServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在这里进行“删除”操作 request.setCharacterEncoding("utf-8"); String action=request.getParameter("action"); if(action.equals("del")){ deleteUser(request,response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在这里进行“添加”操作 request.setCharacterEncoding("utf-8"); String username =request.getParameter("username"); String pwd =request.getParameter("pwd"); String city =request.getParameter("city"); String email =request.getParameter("email"); String answer =request.getParameter("answer"); String question =request.getParameter("question"); //将着6个值插入数据库 String sql="insert into tb_user(username,pwd,email,question,answer,city)values(?,?,?,?,?,?)"; PreparedStatement preparedStatement; try { preparedStatement = connDB.connection.prepareStatement(sql); preparedStatement.setString(1, username); preparedStatement.setString(2, pwd); preparedStatement.setString(3, email); preparedStatement.setString(4, question); preparedStatement.setString(5, answer); preparedStatement.setString(6, city); int i=preparedStatement.executeUpdate(); if(i>0){ System.out.print("input ok"); }else{ System.out.print("input error"); } response.sendRedirect("userList"); } catch (SQLException e) { e.printStackTrace(); } } private void deleteUser(HttpServletRequest request,HttpServletResponse response) throws IOException{ String id = request.getParameter("id"); String sql="delete from tb_user where id="+id; int i = 0; try { i = connDB.stmt.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } if(i>0) System.out.print("ok"); else System.out.print("not ok"); response.sendRedirect("userList"); } }
几乎就大功告成啦,对了,还差一个java代码:
UserListServlet.java:从数据库原表中得到用户信息,给userlist.jsp提供用户信息的一个servlet:
package myservlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; 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 com.sun.corba.se.spi.orbutil.fsm.Guard.Result; import entity.User; import util.ConnDB; @WebServlet("/userList") public class UserListServlet extends HttpServlet { private static final long serialVersionUID = 1L; public UserListServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ConnDB connDB= new ConnDB(); String sql = "select * from tb_user"; ResultSet rs = connDB.executeQuery(sql); List<User> list = new ArrayList<User>(); try { while(rs.next()){ //将每一行记录封装程一个User对象 User user=new User(); user.setId(rs.getInt(1)); user.setUsername(rs.getString(2)); user.setPwd(rs.getString(3)); user.setEmail(rs.getString(4)); //省略3个数据,懒得写 //将对象添加到list列表中 list.add(user); } request.setAttribute("users", list); request.getRequestDispatcher("userlist.jsp") .forward(request, response); } catch (SQLException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
运行下UserListServlet.java,就能完成相应操作啦~
其它的操作如修改,查询等大概代码都类似这样,这是sql不同而已。