使用配置文件连接mysql,使用junit进行单测试

使用配置文件连接mysql,使用junit进行单测试

PlainText 复制代码
├── lib\                            # 项目依赖库
│   ├── hamcrest-core-1.3.jar       # Hamcrest测试库
│   ├── junit-4.12.jar              # JUnit测试框架
│   ├── mysql-connector-j-8.0.33.jar  # MySQL连接器(JDK 8+)
│   └── mysql-connector-java-5.1.18-bin.jar  # MySQL旧版本连接器
├── src\                            # 源代码目录
│   ├── com\
│   │   └── crud\                   # 主包
│   │       ├── Main.java           # 主程序入口
│   │       ├── TestUtil.java       # 测试工具类
│   │       ├── dao\                # 数据访问层
│   │       │   ├── BaseDao.java    # 基础DAO类
│   │       │   ├── UserDao.java    # 用户DAO接口
│   │       │   └── impl\           # DAO实现包
│   │       ├── pojo\               # 实体类包
│   │       │   └── User.java       # 用户实体类
│   │       └── service\            # 服务层
│   │           ├── UserService.java  # 用户服务接口
│   │           └── impl\           # 服务实现包
│   └── database.properties         # 数据库配置文件
└── wangke2.iml                     # IDEA项目文件

项目功能总结

用户的增删改查(CRUD)和模拟登录验证。

功能与文件对应关系

  1. 用户数据模型

    • 功能:封装用户数据
    • 实现文件: User.java
    • 主要属性:id、username、password
    • 提供了构造方法、getter/setter方法和toString方法
  2. 数据访问层

    • 功能:定义用户数据的CRUD操作接口
    • 实现文件: UserDao.java
    • 主要方法:
      • addUser(User user) : 添加用户
      • updateUser(User user) : 修改用户
      • delUser(Integer uid) : 删除用户
      • getUserById(Integer uid) : 根据ID查询用户
      • getUserByUsernameAndPassword(User user) : 根据用户名和密码查询用户
      • listUsersAll() : 查询所有用户
    • 具体实现:由 dao.impl 包中的 UserDaoImpl 实现
  3. 业务服务层

    • 功能:定义用户业务逻辑接口
    • 实现文件: UserService.java
    • 主要方法:
      • login(User user) : 用户登录验证
      • listUserAll() : 查询所有用户
    • 具体实现:由 service.impl 包中的实现类完成
  4. 测试功能

    • 功能:测试用户管理的核心功能
    • 实现文件: TestUtil.java
    • 测试方法:
      • add() : 测试添加用户功能
      • list() : 测试查询所有用户功能

项目架构

项目采用经典的 三层架构 设计:

  1. 表示层在 Main.java
  2. 业务逻辑层( service 包)
  3. 数据访问层( dao 包)
    同时使用了 接口编程 和 实体类 封装数据的设计模式,降低了各层之间的耦合度,提高了代码的可维护性和可扩展性。

数据库配置

项目通过 database.properties 文件配置数据库连接信息

配置文件

database.properties

properties 复制代码
driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username = root
password = 1234

获取配置文件信息,连接MySQL

java 复制代码
package com.crud.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//JDBCDao
public class BaseDao {
    Connection connection;
    PreparedStatement ps;
    ResultSet rs;
    private static String driverClassName;
    private static String url;
    private static String username;
    private static String password;

    static {
        init();
        try {
            Class.forName(driverClassName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void init() {
        Properties properties = new Properties();
        InputStream resourceAsStream = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        driverClassName = properties.getProperty("driverClassName");
        url = properties.getProperty("url");
        username = properties.getProperty("username");
        password = properties.getProperty("password");
    }

    public void getConnection() {
        try {
            connection = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //增删改
    public int executeUpdate(String sql, Object... objs) {
        getConnection();
        int row = -1;
        try {
            ps = connection.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                ps.setObject(i + 1, objs[i]);
            }
            row = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return row;
    }

    //查
    public ResultSet executeQuery(String sql, Object... objs) {
        getConnection();
        try {
            ps = connection.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                ps.setObject(i + 1, objs[i]);
            }
            return ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //关闭
    public void close() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

实体类

java 复制代码
public class User {
    private Integer id;
    private String username;
    private String password;
    /* 忽略get set 方法。忽略无参构造,全参构造*/
}

数据访问层

java 复制代码
import com.crud.pojo.User;

import java.util.List;

public interface UserDao {
    //添加用户
    int addUser(User user);

    //修改用户
    int updateUser(User user);

    //删除
    int delUser(Integer uid);

    //查询单个
    User getUserById(Integer uid);

    User getUserByUsernameAndPassword(User user);

    //查询全部
    List<User> listUsersAll();
}

package com.crud.dao.impl;

import com.crud.dao.BaseDao;
import com.crud.dao.UserDao;
import com.crud.pojo.User;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl extends BaseDao implements UserDao {
    @Override
    public int addUser(User user) {
        String sql = "insert into user (id,username,password) value(?,?,?)";
        return this.executeUpdate(sql, user.getId(), user.getUsername(), user.getPassword());
    }

    @Override
    public int updateUser(User user) {
        String sql = "update user set username=?,password=? where id=?";
        return this.executeUpdate(sql, user.getUsername(), user.getPassword(), user.getId());
    }

    @Override
    public int delUser(Integer id) {
        String sql = "delete from user where id=?";
        return this.executeUpdate(sql, id);
    }

    @Override
    public User getUserById(Integer id) {
        String sql = "select * from user where id=?";
        ResultSet resultSet = this.executeQuery(sql, id);
        User user = new User();
        try {
            while (resultSet.next()) {
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return user;
    }

    @Override
    public User getUserByUsernameAndPassword(User user) {
        String sql = "select * from user where username=? and password=?";
        ResultSet resultSet = this.executeQuery(sql, user.getUsername(), user.getPassword());
        user = new User();
        try {
            while (resultSet.next()) {
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return user;
    }

    @Override
    public List<User> listUsersAll() {
        String sql = "select * from user";
        ResultSet resultSet = this.executeQuery(sql);
        List<User> users = new ArrayList<>();
        try {
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                users.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        close();
        return users;
    }
}

业务服务层

java 复制代码
import com.crud.pojo.User;

import java.util.List;

public interface UserService {
    //登陆方法
    User login(User user);

    //查询所有
    List<User> listUserAll();
}

package com.crud.service.impl;

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

import java.util.List;

public class UserServiceImpl implements UserService {
    UserDao userDao = new UserDaoImpl();

    @Override
    public User login(User user) {
        return userDao.getUserByUsernameAndPassword(user);
    }

    @Override
    public List<User> listUserAll() {
        return userDao.listUsersAll();
    }
}

模拟登陆

java 复制代码
import com.crud.pojo.User;
import com.crud.service.UserService;
import com.crud.service.impl.UserServiceImpl;

import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        UserService userService = new UserServiceImpl();
        User user = new User();
        System.out.println("用户名");
        user.setUsername(input.next());
        System.out.println("密码");
        user.setPassword(input.next());
        User login = userService.login(user);
        if (login.getId() != null) {
            System.out.println("成功");
            System.out.println("所有");
            List<User> users = userService.listUserAll();
            for (User user1 : users) {
                System.out.println(user1);
            }

        } else {
            System.out.println("错误");
        }
    }
}

使用junit进行测试

java 复制代码
package com.crud;

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

import java.util.List;

public class TestUtil {
    @Test
    public void add() {
        UserDao userDao = new UserDaoImpl();
        User user = new User(10, "王飞", "123456");
        int i = userDao.addUser(user);
        System.out.println("影响" + i);
    }

    @Test
    public void list() {
        UserDao userDao = new UserDaoImpl();
        List<User> users = userDao.listUsersAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

用到的jar

hamcrest-core-1.3.jar

junit-4.12.jar

mysql-connector-j-8.0.33.jar mysql数据库版本高用这个

mysql-connector-java-5.1.18-bin.jar 版本低用这个