首先一定要下载好驱动文件。然后记得一定要先加载到项目中!驱动文件下载连接:已经有写好的数据库文件以及前端页面了
例如我的是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:123ID: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不同而已。