这篇文章简单讲一下java如何连接数据库,实现登录.
首先我们来看一下有关数据库的部分
这是数据库编码使用utf-8,存放了账号、密码
我们来看一下idea中properties,有关数据库的连接驱动和路径
这里我建立了一个存放properties的包,下面是相关内容
driverClass = com.mysql.jdbc.Driver//这里是mysql5.7版本的连接驱动,mysql8版本的驱动自行更改
url = jdbc:mysql://localhost:3306/javaweb?useUnicode=true&characterEncoding=utf8&useSSL=false
//这里javaweb是数据库名称,自行更改
username = root
//数据库用户名
password = 123456
//数据库用户的密码
下面我们来看一下项目目录:
jstl和standard架包不需要导入,其他架包、依赖的根据自己进行导入
我们先看一下pojo层存放实体类:
package pojo;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
dao层接口类:
package dao;
import java.util.List;
public interface UserDao<T> {
public List<T> queryAll(String username);
}
impl实现类:
package dao.impl;
import dao.UserDao;
import pojo.User;
import util.JDBCUtil;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public List<User> queryAll(String username) {
String sql = "SELECT * FROM tb_user where username=?";
List<User> userList = JDBCUtil.executeQuery(sql,User.class,username);
return userList;
}
}
service层:
package service;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import pojo.User;
import java.util.List;
public class LoginService {
public boolean Login(String username, String password) {
UserDao userDao = new UserDaoImpl();
List<User> userList = userDao.queryAll(username);
if (userList.size() > 0) {
if (password.equals(userList.get(0).getPassword())) {
return true;
}
}
return false;
}
}
servlet层:
package servlet;
import service.LoginService;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "LoginServlet" ,value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
LoginService loginService = new LoginService();
@Override
protected void doPost(HttpServletRequest request , HttpServletResponse response) throws ServletException, IOException{
// 获取客户端请求 判断是登录请求还是注册请求
this.Login(request,response);
}
private void Login(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
if(loginService.Login(username,password)){
session.setAttribute("username",username);
response.sendRedirect("/jsp/index.jsp");
}else {
session.setAttribute("msg","账号密码错误");
request.getRequestDispatcher("/jsp/Login.jsp").forward(request,response);
}
}
}
util工具类:
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class JDBCUtil {
static Properties props = new Properties();
static {
//加载db.properties文件;
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("properties\\db.properties");
try {
//加载到Properties集合中
props.load(in);
//连接数据库的驱动
Class.forName(props.getProperty("driverClass"));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取一个连接对象
* @return
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"),props.getProperty("password"));
}
/**
* 关闭资源
*/
public static void close(ResultSet rs ,PreparedStatement pstmt,Connection conn){
try {
if(rs!=null){
rs.close();
}
if(pstmt!=null){
pstmt.close();
}
if(conn!=null){
conn.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
/**
* 执行增删改的方法
* @return
*/
//executeUpdate,用于产生单个结果集的语句,返回值是一个整数,指示受影响的行数(即更新计数)
//Object...parms(变长数组)调用此方法可以不传入参数,Object[]params调用此方法必须传入参数
public static int executeUpdate(String sql,Object... parms){
//先连接,然后执行数据库语句,最后关闭资源
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn =JDBCUtil.getConnection();
pstmt = conn.prepareStatement(sql);
//给数组集赋值
if(parms!=null || parms.length>0){
for(int i=0;i<parms.length;i++){
//遍历,给每个数组(即数据库的行中的每一列)赋值
pstmt.setObject(i+1,parms[i]);
}
}
return pstmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return 0;
}
/*
Classclass,哪个实现类的方法调用List executeQuery,就将实现类的方法的参数传入List executeQuery做parms
这样就能调用这个封装查询方法
*/
public static <T> List<T> executeQuery(String sql , Class<T> tClass,Object... parms){
Connection conn=null;
PreparedStatement pstmt=null;
try {
conn=JDBCUtil.getConnection();
pstmt=conn.prepareStatement(sql);
if (parms !=null && parms.length>0){
for (int i = 0; i < parms.length; i++) {
pstmt.setObject(i+1,parms[i]);
}
}
return JDBCUtil.parseResultSet(pstmt.executeQuery(),tClass);
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(null, pstmt, conn);
}
return null;
}
/**
* 解析ResultSet
* 返回值?
* 参数?
* ResultSet的一条记录的索引位置是从1开始的,而不是从0开始。
*
*/
public static <T> List<T> parseResultSet(ResultSet rs, Class<T> clazz) throws SQLException, IllegalAccessException, InstantiationException {
List<T> list = new ArrayList<>();
if(rs == null){
return null;
}
while(rs.next()){
//获取属性
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
//约定: 属性名与列名一样: 使用别名
field.set(t,rs.getObject(field.getName()));//t相当于对象的引用
//找set方法赋值
}
list.add(t);
}
return list;
}
}
jsp页面:
<%--
Created by IntelliJ IDEA.
User: Frivolous-Scholar
Date: 2022/10/18
Time: 18:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/LoginServlet" method="post">
<label>
用户名:<input type="text" name="username">
</label>
<br>
<label>
密码:<input type="password" name="password">
</label>
<input type="submit" value="登录">
</form>
<div>${sessionScope.msg}</div>
</body>
</html>
最后启动tomcat输入账号密码便可.如果出错,请看自己的项目路径是否存在问题