使用配置文件连接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)和模拟登录验证。
功能与文件对应关系
-
用户数据模型
- 功能:封装用户数据
- 实现文件:
User.java
- 主要属性:id、username、password
- 提供了构造方法、getter/setter方法和toString方法
-
数据访问层
- 功能:定义用户数据的CRUD操作接口
- 实现文件:
UserDao.java
- 主要方法:
- addUser(User user) : 添加用户
- updateUser(User user) : 修改用户
- delUser(Integer uid) : 删除用户
- getUserById(Integer uid) : 根据ID查询用户
- getUserByUsernameAndPassword(User user) : 根据用户名和密码查询用户
- listUsersAll() : 查询所有用户
- 具体实现:由 dao.impl 包中的
UserDaoImpl
实现
-
业务服务层
- 功能:定义用户业务逻辑接口
- 实现文件:
UserService.java
- 主要方法:
- login(User user) : 用户登录验证
- listUserAll() : 查询所有用户
- 具体实现:由 service.impl 包中的实现类完成
-
测试功能
- 功能:测试用户管理的核心功能
- 实现文件:
TestUtil.java
- 测试方法:
- add() : 测试添加用户功能
- list() : 测试查询所有用户功能
项目架构
项目采用经典的 三层架构 设计:
- 表示层在
Main.java
- 业务逻辑层( service 包)
- 数据访问层( 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 版本低用这个