jsp(10):数据库操作

首先一定要下载好驱动文件。然后记得一定要先加载到项目中!驱动文件下载连接:已经有写好的数据库文件以及前端页面了

例如我的是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不同而已。

猜你喜欢

转载自blog.csdn.net/aic1999/article/details/80347615