• Java----使用JDBC开发注册和登录功能


    目录

    1、开发需求

    2、环境配置

    2.1、配置jar包

    2.2、配置jdbc.properties文件

    2.3、创建MVC三层包

    2.4、存放JDBCUtil类

    2.5、mysql创建

    3、代码开发

    3.1、web层开发

    3.2、service层开发

    3.3、dao层开发

    3.4、登录功能测试

    3.5、注册功能测试


     

    1、开发需求

    1、完成登录功能。
    2、完成注册功能。
    3、完成注册的同时不能注册相同的用户名。

    2、环境配置

    2.1、配置jar包

    首先我们需要创建一个web项目工程,然后在web包下的WEB-INF下创建一个lib包,里面放入mysql连接jar包,这里提供了mysql5版本和mysql8版本的jar包,对应的就是mysql的版本,如果是mysql5系列版本的就用5.16的jar包,如果是mysql8系列的版本就用8.0.16版本jar包。

    链接:https://pan.baidu.com/s/1loxaN41BXlfdePT_8DDBDw 
    提取码:388i

    如下图配置 

    注意:放入后一定要记得导入,右击jar包点击ADD Library进行导入。

    2.2、配置jdbc.properties文件

    新建jdbc.properties文件到src目录中,添加以下内容

    1. jdbc.className=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/test5
    3. jdbc.username=root
    4. jdbc.password=xxx

    2.3、创建MVC三层包

    因为开发需要使用MVC三层架构,需要创建相对应的包,如图所示

    三层为dao层、service层、web层,bean层用来存放实体类即JavaBean,util是工具类存放的包。

    2.4、存放JDBCUtil类

     把下面代码放到util包的JDBCUtil类中

    1. public class JDBCUtil {
    2. public JDBCUtil() {
    3. }
    4. private static String className;
    5. private static String url;
    6. private static String username;
    7. private static String password;
    8. private static Connection conn = null;
    9. static {
    10. Properties pro = null;
    11. InputStream is = null;
    12. try {
    13. is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
    14. pro = new Properties();
    15. pro.load(is);
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. } finally {
    19. try {
    20. is.close();
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. className = pro.getProperty("jdbc.className");
    26. url = pro.getProperty("jdbc.url");
    27. username = pro.getProperty("jdbc.username");
    28. password = pro.getProperty("jdbc.password");
    29. //加载驱动
    30. try {
    31. Class.forName(className);
    32. } catch (ClassNotFoundException e) {
    33. e.printStackTrace();
    34. }
    35. //获取连接
    36. try {
    37. conn = DriverManager.getConnection(url, username, password);
    38. } catch (SQLException e) {
    39. e.printStackTrace();
    40. }
    41. }
    42. public static Connection getConnection() {
    43. return conn;
    44. }
    45. public static void close(ResultSet rs, Statement stmt, Connection conn) {
    46. try {
    47. if (rs != null) {
    48. rs.close();
    49. rs = null;
    50. }
    51. } catch (SQLException e) {
    52. e.printStackTrace();
    53. }
    54. try {
    55. if (stmt != null) {
    56. stmt.close();
    57. stmt = null;
    58. }
    59. } catch (SQLException e) {
    60. e.printStackTrace();
    61. }
    62. try {
    63. if (conn != null) {
    64. conn.close();
    65. conn = null;
    66. }
    67. } catch (SQLException e) {
    68. e.printStackTrace();
    69. }
    70. }
    71. public static void close(Statement stmt, Connection conn) {
    72. try {
    73. if (stmt != null) {
    74. stmt.close();
    75. stmt = null;
    76. }
    77. } catch (SQLException e) {
    78. e.printStackTrace();
    79. }
    80. try {
    81. if (conn != null) {
    82. conn.close();
    83. conn = null;
    84. }
    85. } catch (SQLException e) {
    86. e.printStackTrace();
    87. }
    88. }
    89. }

    2.5、mysql创建

     创建表t_user

    1. CREATE TABLE `t_user` (
    2. `username` varchar(20) NOT NULL,
    3. `password` varchar(20) NOT NULL,
    4. PRIMARY KEY (`username`)
    5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    数据请自行添加

    3、代码开发

    3.1、web层开发

    为了模拟前端发送数据,我这里用scanner对进行获取数据,实际开发中web层是用servlet技术来获取前端数据的。

    1. public class UserWeb {
    2. public static void main(String[] args) {
    3. //创建service对象
    4. UserService userService=new UserServiceImpl();
    5. System.out.println("请选择选项");
    6. System.out.println("1-----登录");
    7. System.out.println("2-----注册");
    8. Scanner sc =new Scanner(System.in);
    9. int i = sc.nextInt();
    10. switch (i){
    11. case 1:
    12. System.out.println("请输入账号");
    13. Scanner sc1=new Scanner(System.in);
    14. String username = sc1.nextLine();
    15. System.out.println("请输入密码");
    16. Scanner sc2=new Scanner(System.in);
    17. String password = sc2.nextLine();
    18. //创建user对象 把用户输入的账号密码封装对象
    19. User user=new User();
    20. user.setUsername(username);
    21. user.setPassword(password);
    22. boolean flag1 = userService.login(user);
    23. if(flag1==true){
    24. System.out.println("登录成功");
    25. }else {
    26. System.out.println("登录失败");
    27. }
    28. break;
    29. case 2:
    30. System.out.println("请输入注册账号");
    31. Scanner register1=new Scanner(System.in);
    32. String s1 = register1.nextLine();
    33. System.out.println("请输入注册密码");
    34. Scanner register2=new Scanner(System.in);
    35. String s2 = register2.nextLine();
    36. User user1=new User();
    37. user1.setUsername(s1);
    38. user1.setPassword(s2);
    39. boolean register = userService.register(user1);
    40. if(register){
    41. System.out.println("注册成功");
    42. }else{
    43. System.out.println("注册失败,用户已存在");
    44. }
    45. break;
    46. default:
    47. System.out.println("你输入的有误");
    48. }
    49. }
    50. }

    3.2、service层开发

    service层和dao层一样,也是一个接口和一个实现类

    UserService接口

    1. public interface UserService {
    2. //登录功能
    3. public boolean login(User user);
    4. //注册功能
    5. public boolean register(User user);
    6. }

    UserServiceImpl实现类 

    1. public class UserServiceImpl implements UserService {
    2. //登录功能
    3. @Override
    4. public boolean login(User user) {
    5. //创建userDao对象
    6. UserDao userDao=new UserDaoImpl();
    7. //调用login方法把参数user传递过去,得到一个返回值为user_data
    8. User user_data = userDao.login(user);
    9. //判断user_data是否为空
    10. if(user_data!=null){
    11. //不为空 证明查询出了用户 登录成功
    12. return true;
    13. }
    14. //否则登录失败
    15. return false;
    16. }
    17. //注册功能
    18. @Override
    19. public boolean register(User user) {
    20. UserDao userDao=new UserDaoImpl();
    21. //调用userDao中的queryByName方法里面传递一个用户名 得到返回值user1
    22. User user1 = userDao.queryByName(user.getUsername());
    23. //判断user1是否为空
    24. if(user1!=null){
    25. //不为空 证明用户存在 不能注册
    26. return false;
    27. }else{
    28. //为空 则可以注册 调用注册方法
    29. Boolean register = userDao.register(user);
    30. //判断返回值是否注册成功
    31. if(register){
    32. //成功则返回true
    33. return true;
    34. }else{
    35. //否则返回false
    36. return false;
    37. }
    38. }
    39. }
    40. }

    3.3、dao层开发

    创建UserDao接口

    1. public interface UserDao {
    2. //登录方法
    3. public User login(User user);
    4. //注册方法
    5. public Boolean register(User user);
    6. //查询用户方法
    7. public User queryByName(String username);
    8. }

    在dao层创建一个impl包,用来存放接口的实现类

    实现类代码

    1. public class UserDaoImpl implements UserDao {
    2. //登录功能
    3. @Override
    4. public User login(User user) {
    5. //调用工具类获取连接对象
    6. Connection conn = JDBCUtil.getConnection();
    7. //初始化对象
    8. PreparedStatement pstmt = null;
    9. ResultSet rs = null;
    10. try {
    11. // Statement stmt = conn.createStatement();
    12. // String sql="select * from t_user where username='"+user.getUsername()+"' and password='"+user.getPassword()+"'";
    13. // ResultSet rs = stmt.executeQuery(sql);
    14. //解决sql注入问题
    15. String sql = "select * from t_user where username= ? and password = ?";
    16. //把sql语句传递给pstmt对象
    17. pstmt = conn.prepareStatement(sql);
    18. //给占位符赋值
    19. pstmt.setString(1, user.getUsername());
    20. pstmt.setString(2, user.getPassword());
    21. //调用查询方法
    22. rs = pstmt.executeQuery();
    23. //对结果进行遍历
    24. while (rs.next()) {
    25. String username = rs.getString("username");
    26. String password = rs.getString("password");
    27. User user1 = new User();
    28. user1.setUsername(username);
    29. user1.setPassword(password);
    30. //返回结果
    31. return user1;
    32. }
    33. } catch (SQLException e) {
    34. e.printStackTrace();
    35. } finally {
    36. //释放资源
    37. JDBCUtil.close(rs, pstmt, conn);
    38. }
    39. return null;
    40. }
    41. //注册功能
    42. @Override
    43. public Boolean register(User user) {
    44. Connection conn = JDBCUtil.getConnection();
    45. // Statement stmt = null;
    46. PreparedStatement pstmt= null;
    47. // stmt = conn.createStatement();
    48. // String sql = "select * from t_user where username='" + user.getUsername() + "'";
    49. // rs = stmt.executeQuery(sql);
    50. try {
    51. // String sql = "insert into t_user value('" + user.getUsername() + "','" + user.getPassword() + "')";
    52. String sql2 = "insert into t_user value(?,?)";
    53. pstmt = conn.prepareStatement(sql2);
    54. pstmt.setString(1, user.getUsername());
    55. pstmt.setString(2, user.getPassword());
    56. int i;
    57. i = pstmt.executeUpdate();
    58. if (i == 1) {
    59. return true;
    60. } else {
    61. return false;
    62. }
    63. } catch (SQLException e) {
    64. e.printStackTrace();
    65. } finally {
    66. JDBCUtil.close(pstmt, conn);
    67. }
    68. //以上try里面出现错误直接返回false
    69. return false;
    70. }
    71. @Override
    72. public User queryByName(String username) {
    73. Connection conn = JDBCUtil.getConnection();
    74. ResultSet rs;
    75. PreparedStatement pstmt;
    76. String sql1 = "select * from t_user where username=?";
    77. try {
    78. pstmt = conn.prepareStatement(sql1);
    79. pstmt.setString(1, username);
    80. rs = pstmt.executeQuery();
    81. while(rs.next()){
    82. String username1 = rs.getString("username");
    83. String password = rs.getString("password");
    84. User user=new User();
    85. user.setUsername(username1);
    86. user.setPassword(password);
    87. return user;
    88. }
    89. } catch (SQLException e) {
    90. e.printStackTrace();
    91. }
    92. return null;
    93. }
    94. }

    3.4、登录功能测试

    运行UserWeb

     

    3.5、注册功能测试

     

     

  • 相关阅读:
    【大数据技术】记一次spark连接MySQL读数据是失败的排查,显示“No suitable driver”,但实际是driver已经配置好了
    培训考试系统如何满足个性化学习需求?
    【软件测试】接口——基本测试流程
    JAVA计算机毕业设计蔬菜水果销售系统源码+系统+mysql数据库+lw文档
    自定义映射resultMap
    w10系统 如何使用 C++、cmake、opencv、
    LeetCode每日一题——2678. Number of Senior Citizens
    echarts4_必知必会
    全面详细介绍Linux 虚拟文件系统(VFS)原理
    社交媒体数据恢复:Meetalk
  • 原文地址:https://blog.csdn.net/select_myname/article/details/126721984