最常用方案是jdbc + mysql,需将连接参数抽到配置文件、用preparedstatement防sql注入、建表预留扩展性、字段类型与java类型对齐、dao封装资源、事务由service层控制。

用JDBC连接MySQL存学生信息,别直接写死密码
Java里做学生信息管理,核心是把数据存进数据库而不是内存集合。最常用方案是JDBC + MySQL,但新手常把数据库用户名、密码写死在Connection字符串里,这既不安全也不方便切换环境。
- 把连接参数(
url、username、password)抽到application.properties或config.properties文件中,用Properties类加载 - 连接字符串格式必须是
jdbc:mysql://localhost:3306/student_db?useSSL=false&serverTimezone=UTC,漏掉serverTimezone在新版MySQL 8+会报java.sql.SQLException: The server time zone value 'XXX' is unrecognized - 别用
DriverManager.getConnection()裸调用,至少包一层try-with-resources确保Connection、PreparedStatement、ResultSet自动关闭
学生表建模要预留扩展性,别只建name/age/id三个字段
一开始只想着增删改查“姓名、年龄、学号”,结果后期加班级、入学时间、手机号、照片路径时发现表结构僵硬,SQL语句到处散落。
-
id设为BIGINT AUTO_INCREMENT主键,别用INT——学生数超2147万就翻车 - 加
created_time和updated_time两个DATETIME字段,用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP让数据库自动维护 - 手机号字段用
VARCHAR(20)而非INT:国际号码带+号,开头0不能被整数吞掉 - 避免在Java实体类里用
int映射可能为NULL的字段,改用Integer,否则查出NULL会触发NullPointerException
CRUD操作必须用PreparedStatement,别拼接SQL字符串
手拼"INSERT INTO student VALUES ('" + name + "', " + age + ")"看着快,但遇到名字含单引号(比如O'Connor)、SQL注入、类型转换错误时全崩。
在线订餐系统源码,提供给设计人员参考一个小型的在线订餐管理系统源码,采用三层模式开发,代码注释详细前台可以进行用户注册、菜单管理及订餐后台管理员可以进行菜单管理、新闻管理、菜肴管理、用户管理操作数据库采用的是Sql2005(由于数据库在App_Data下,如果装了Sql2005数据库会自动配置)
- 所有带变量的SQL都走
PreparedStatement:String sql = "INSERT INTO student (name, age) VALUES (?, ?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, name); ps.setInt(2, age); - 查询多条记录时,别在循环里反复
prepareStatement,复用同一个PreparedStatement对象,只改参数 - 批量插入用
addBatch()+executeBatch(),比单条提交快10倍以上;但注意MySQL默认rewriteBatchedStatements=false,需在JDBC URL里显式加上&rewriteBatchedStatements=true
DAO层别暴露Connection和ResultSet,接口返回List就行
很多初学者在DAO方法里直接返回ResultSet,或者把Connection传进Service层,导致资源泄漏、事务失控、测试困难。
立即学习“Java免费学习笔记(深入)”;
- DAO方法签名统一为
public List<student> findAll()</student>、public Student findById(Long id),内部封装JDBC细节 - 事务控制放在Service层,用
Connection.setAutoCommit(false)+commit()/rollback(),不要在DAO里调用 - 如果后续想换MyBatis或JPA,只要DAO接口不变,Service层几乎不用动——这是分层真正要解决的问题
真正卡住人的不是语法,而是哪该关连接、哪该开事务、字段类型和Java类型的对齐点在哪。这些地方一错,日志里全是SQLException堆栈,但根本看不出是SQL写错了还是连接早被关了。









