使用JDBC+Servlet+Tomcat读取数据库中的内容,实现简单的登录功能
今天主要对之前学过的一些Java知识做了简单的复习,复习的内容主要是JDBC编程和Servlet,然后进行了简单的练习,使用JDBC+Servlet对数据库内容进行读取,实现简单的登陆功能。
一、JDBC编程
JDBC是Java Database Connectivity的简称,意思是Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,通过JDBC编程可以对数据库中数据进行查询和更新操作。
在编码过程中,对数据库中内容进行查询更新操作过程一般分为七步:
1、加载驱动
2、创建连接
3、编写sql语句
4、创建statement对象
5、执行sql获得结果集
6、处理结果集
7、关闭资源
第一步加载驱动,要选择与数据库对应的驱动,本次练习我是用的是MySQL驱动,就加载MySQL的驱动,使用以下语句进行加载
Class.forName("com.mysql.jdbc.Driver");
第二步建立连接,获得Connection对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/internship", "root", "123456");
第三步编写SQL语句,这边是用查询语句为例
String sql = "select * from users";
第四步获得Statement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
第五步执行SQL,获得结果集
ResultSet resultSet = preparedStatement.executeQuery();
第六步对获得的结果集进行处理,获得User对象的List列表
List<User> list_user = new ArrayList();
while (resultSet.next()) {
User user = new User();
int id = resultSet.getInt(1);
String username = resultSet.getString(2);
String password = resultSet.getString(3);
user.setId(id);
user.setName(username);
user.setPassword(password);
list_user.add(user);
}
第七步关闭资源,包括Connection对象,ResultSet对象,Statement对象
resultSet.close();
connection.close();
statement.close();
这样整个JDBC编程的七个步骤就完成了,注意过程中会抛出异常ClassNotFoundException,SQLException等,要做相应异常处理,使用try catch在代码块中处理,或者throws抛给调用者处理。
二、实体类
编程过程中,从数据库查询的数据通常不会直接打印出来,而是使用实体类来处理。实体类通常需要包含属性、构造方法、toString方法、get和set方法,复杂的实体类还会有其他方法,在此不赘述。今日练习中,创建了实体类User,写入属性,使用Idea的快捷键Alt + insert就可以快速生成前文中提到的构造方法、toString方法、get和set方法等。
具体如下:
package com.whut.bean;
public class User {
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
在编码中,通常会用实体类作为桥梁,连接数据处理和业务逻辑两个层面,从数据库中获得信息后,利用实体类做数据存储,将获得的信息储存在实体类对象中。
三、练习代码
在练习过程中,我将User类放到bean包中,数据处理类UserDao放到dao包中,连接数据库和关闭资源的类DaoUtil放到util包中,另将UserServlet放到了servlet包中,如下:
UserDao.java:
package com.whut.dao;
import com.whut.bean.User;
import com.whut.util.DaoUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
public List<User> findall() throws SQLException, ClassNotFoundException {
List<User> list_user = new ArrayList();
// 1、加载驱动
// 2、创建连接
Connection connection = DaoUtil.getConnection();
// 3、sql语句
String sql = "select * from users";
// 4、statement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 5、执行sql获得结果集
ResultSet resultSet = preparedStatement.executeQuery();
// 6、处理结果集
while (resultSet.next()) {
User user = new User();
int id = resultSet.getInt(1);
String username = resultSet.getString(2);
String password = resultSet.getString(3);
user.setId(id);
user.setName(username);
user.setPassword(password);
list_user.add(user);
}
// 7、关闭资源
DaoUtil.close(resultSet,connection,preparedStatement);
return list_user;
}
public void DeleteBYId(int id) throws SQLException, ClassNotFoundException {
Connection connection = DaoUtil.getConnection();
String sql = "delete from users where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.executeUpdate();
DaoUtil.close(null,connection,statement);
}
public static boolean hasUser(String username, String password) throws SQLException, ClassNotFoundException {
boolean flag = false;
Connection connection = DaoUtil.getConnection();
String sql = "select * from users where username = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,username);
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()){
if(resultSet.getString(3).equalsIgnoreCase(password)){
flag = true;
}
}
return flag;
}
}
DaoUtil.java
package com.whut.util;
import java.sql.*;
public class DaoUtil {
public static Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:1433/internship", "root", "0121710870622");
//System.out.println("Connection success");
return connection;
}
public static void close(ResultSet resultSet, Connection connection, Statement statement) throws SQLException {
if(resultSet != null)
resultSet.close();
if(connection != null)
connection.close();
if(statement != null)
statement.close();
}
}
UserServlet.java
package com.whut.servlet;
import com.whut.bean.User;
import com.whut.dao.UserDao;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//resp.getWriter().write("hello servlet");
String username = req.getParameter("username");
String password = req.getParameter("password");
try{
if(UserDao.hasUser(username, password)){
resp.getWriter().write("Login successful!");
}else{
resp.getWriter().write("Don't have you username or password is wrong, please check!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在index.jsp加入标签,添加输入框和按钮
<p id="login">
<form method="get" action="login">
<p>用户: <input type="text" placeholder="username" name="username"/></p>
<p>密码: <input type="password" placeholder="password" name="password"/></p>
<button type="submit">登录</button>
</form>
</p>
在web.xml中加入对servlet的声明
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.whut.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
登录界面:
成功界面:
没有该用户或者密码错误界面: