连接数据库实现注册、登陆功能(Web/Service/Dao三层架构)


前言:使用版本

1.mysql使用版本:8.0.20
2.druid使用版本:1.1.22

一、创建jdbc.properties

将jdbc.properties放置于src目录下

username=root
password=root
url=jdbc:mysql://localhost:3306/book?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10

二、编写连接池测试代码

代码如下:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class JdbcUtils {

    private static DruidDataSource dataSource;

    static{
        try {
            Properties properties = new Properties();
            // 读取 jdbc.properties 属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            // 从流中加载数据
            properties.load(inputStream);
            // 创建 数据库连接池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

    }
}

结果如下:

824, 2020 12:19:38 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@41fbdac4

三、编写连接池工具类JdbcUtils

代码如下:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class JdbcUtils {

    private static DruidDataSource dataSource;

    static{
        try {
            Properties properties = new Properties();
            // 读取 jdbc.properties 属性配置文件
            InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            // 从流中加载数据
            properties.load(inputStream);
            // 创建 数据库连接池
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
            System.out.println(dataSource.getConnection());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    /**
	 * 获取数据库连接池中的连接
	 * @return 如果返回null,说明获取连接失败
	 */
	public static Connection getConnection(){
	
	    Connection conn = null;
	
	    try {
	        conn = dataSource.getConnection();
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	    return conn;
	}

    /**
     * 关闭连接,放回数据库连接池
     * @param conn
     */
    public static void close(Connection conn){
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}


四、编写测试类testJdbcUtils

代码如下:

import com.atguigu.utils.JdbcUtils;
import org.junit.Test;

import java.sql.Connection;

public class JdbcUtilsTest {

    @Test
    public void testJdbcUtils(){
        for(int i = 0; i < 100; i++) {
            Connection connection = JdbcUtils.getConnection();
            System.out.println(connection);
            //不释放则最多只能打印jdbc.properties配置文件里maxActive=10个
            JdbcUtils.close(connection);
        }
    }
}

结果如下:
100个

com.mysql.cj.jdbc.ConnectionImpl@587e5365

五、编写BaseDao

代码如下:

import com.atguigu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDao {

    //使用DbUtils操作数据库
    private QueryRunner queryRunner = new QueryRunner();

    /**
     * update()方法用于执行Insert/Update/Delete语句
     * @return 如果返回-1,说明执行失败,返回其他数字表示影响的行数
     */
    public int update(String sql, Object...args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.update(connection,sql,args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(connection);
        }

        return -1;
    }

    /**
     * 查询返回一个JavaBean的sql语句
     * @param type 返回的对象类型
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @param <T> 返回的类型的泛型
     * @return
     */
    public <T> T queryForOne(Class<T> type, String sql,Object...args){
        Connection con = JdbcUtils.getConnection();
        try {
            return queryRunner.query(con, sql, new BeanHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(con);
        }
        return null;
    }

    /**
     * 
     * 查询返回多个JavaBean的sql语句
     * @param type 返回的对象类型
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @param <T> 返回的类型的泛型
     * @return
     */
    public <T> List<T> queryForList(Class<T> type, String sql, Object...args){
        Connection con = JdbcUtils.getConnection();
        try {
            return queryRunner.query(con, sql, new BeanListHandler<T>(type),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(con);
        }
        return null;
    }

    /**
     * 执行返回一行一列的sql语句
     * @param sql 执行的sql语句
     * @param args sql对应的参数值
     * @return
     */
    public Object queryForSingleValue(String sql, Object...args){
        Connection con = JdbcUtils.getConnection();
        try {
            queryRunner.query(con, sql, new ScalarHandler(),args);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(con);
        }
        return null;
    }
}

六、编写UserDao

代码如下:

import com.atguigu.pojo.User;

public interface UserDao {
    /**
     * 根据用户名查询用户信息,判断用户名是否有效
     * @param username 用户名
     * @return 如果返回null,说明没有这个用户
     */
    public User queryUserByname(String username);

    /**
     * 根据用户名和密码查询用户
     * @param username
     * @param password
     * @return 如果返回null,说明没有这个用户
     */
    public User queryUserBynameAndPassword(String username, String password);

    /**
     * 保存用户信息
     * @param user
     * @return
     */
    public int saveUser(User user);
    
}

七、编写UserDao实现类

代码如下:

import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;

public class UserDaoImpl extends BaseDao implements UserDao {
    @Override
    public User queryUserByname(String username) {
        String sql = "select 'id','username','password','email' from t_user where username = ?";
        return queryForOne(User.class,sql,username);
    }

    @Override
    public User queryUserBynameAndPassword(String username, String password) {
        String sql = "select 'id','username','password','email' from t_user where username = ? and password = ?";
        return queryForOne(User.class,sql,username,password);
    }

    @Override
    public int saveUser(User user) {
        String sql = "insert into t_user('username','password','email') values (?,?,?)";
        return update(sql,user.getUsername(),user.getPassword(),user.getEmail());
    }
}

八、测试UserDao

UserDao文件中,按住Ctrl+Shift+T,创建测试类UserDaoTest
代码如下:

import com.atguigu.dao.UserDao;
import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
import org.junit.Test;

import static org.junit.Assert.*;

public class UserDaoTest {
    UserDao userDao = new UserDaoImpl();
    @Test
    public void queryUserByname() {
        if(userDao.queryUserByname("admin") == null){
            System.out.println("用户名可用!");
        }else{
            System.out.println("用户名已存在!");
        };
    }

    @Test
    public void queryUserBynameAndPassword() {
        if(userDao.queryUserBynameAndPassword("admin","admin") == null){
            System.out.println("登录失败");
        }else{
            System.out.println("登录成功");
        }
    }

    @Test
    public void saveUser() {
        System.out.println(userDao.saveUser(new User(null,"abc","admin","123@qq.com")));
    }
}

九、编写UserService

代码如下:

import com.atguigu.pojo.User;

public interface UserService {
    /**
     * 注册用户
     * @param user
     */
    public void  registUser(User user);

    /**
     * 用户登录
     * @param user
     * @return
     */
    public User login(User user);

    /**
     * 用户名是否可用
     * @param username
     * @return 返回true表示用户名存在,返回false表示用户名可用
     */
    public boolean existsUsername(String username);
}

十、编写UserServiceImpl

import com.atguigu.dao.UserDao;
import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();

    @Override
    public void registUser(User user) {
        userDao.saveUser(user);
    }

    @Override
    public User login(User user) {
        return userDao.queryUserBynameAndPassword(user.getUsername(),user.getPassword());
    }

    @Override
    public boolean existsUsername(String username) {
        if (userDao.queryUserByname(username) == null){
            return false;
        }
        return true;
    }
}

十一、测试UserServiceImpl

import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;
import org.junit.Test;

import static org.junit.Assert.*;

public class UserServiceTest {

    UserService userService = new UserServiceImpl();
    @Test
    public void registUser() {
        userService.registUser(new User(null,"bbj168","666","bbj168@qq.com"));
    }

    @Test
    public void login() {
        System.out.println(userService.login(new User(null,"admin","admin",null)));
    }

    @Test
    public void existsUsername() {
        if (userService.existsUsername("admin")){
            System.out.println("用户名已存在");
        }else {
            System.out.println("用户名可用");
        }
    }
}

十二、实现用户注册功能

import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RegistServlet extends HttpServlet {
    private UserService userService = new UserServiceImpl();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String code = req.getParameter("code");
//        2.检查验证码是否正确
        if ("abcde".equalsIgnoreCase(code)){
//            3.检查用户名是否可用
            if(userService.existsUsername(username)){
//                不可用
                System.out.println("用户名已存在");
//                跳回注册页面
                req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
            }else{
//                注册成功,保存到数据库
                userService.registUser(new User(null,username,password,email));
//                跳转注册成功页面
                req.getRequestDispatcher("/pages/user/regist_success.html").forward(req,resp);
            }
        }else{
//            跳回注册页面
            System.out.println("验证码错误");
            req.getRequestDispatcher("/pages/user/regist.html").forward(req,resp);
        }
    }
}

十三、实现用户登录功能

import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    private UserService userService = new UserServiceImpl();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
//        2.调用userServic.login()登录处理业务
        User loginUser = userService.login(new User(null, username, password, null));
        if (loginUser == null){
//            登录失败,跳回login页面
            req.getRequestDispatcher("/pages/user/login.html").forward(req,resp);
        }else{
//            登陆成功,跳转到login_success页面
            req.getRequestDispatcher("/pages/user/login_success.html").forward(req,resp);
        }

    }
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值