开发环境的准备
- 新建lib目录
- 把驱动文件放进去
- 设置lib目录为库目录
准备工具包
- DbHelper,数据库操作工具包
- 配置文件,让数据库的连接更加动态
编写DbHelper中的内容
加载驱动
获取连接对象
测试代码
测试结果
释放资源
三种资源需要释放:
- 连接对象
- 执行者
- 结果集
释放资源
// 释放资源
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){
// 1 防止空指针异常
// 2 按顺序来关
// 关查询结果集
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 关闭执行者
if(statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 关闭连接对象
if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
测试
public class Test01测连接对象 {
public static void main(String[] args) {
Connection connection = DbHelper.getConnection();
System.out.println(connection);
// 测一测关闭资源的方法
// 当前只有一个资源,把它关闭
DbHelper.closeAll(connection, null, null);
System.out.println("game over");
}
}
效果
分析当前的需求
对于数据表的操作
我们希望有一个工具类
邦我们专门的操作这个表
dao文件
mysql数据与java的关联
java,一门面向对向的编程语言
mysql,一行是一个数据实体
java中的对象与mysql中的数据实体是可以对应上的
mysql的一行,就是java的一个对象
以刘备的行为例
具有三个属性,id,uname,upwd
我们可以定义一个类来对接mysql的行
定义一个实体类
定义一个实体包
在实体包中存放多个实体类
每一个类对接数据表中的实体行
定义用户实体类
统一命名
实体类的名称 以:
类名称+Entity
用户实体类,版本一
package Entity;
public class UserEntity {
// 定义属性(根据数据表来定义)
// 目前数据中有三列,所以我们定义三个属性
private int id;
private String uname;
private String upwd;
// 构造器(方便进行实例化)
public UserEntity() {
}
// 添加getter和setter
// 热键:alt+ins 选:Getter and Setter
// 全选所有的属性,确定。 最后会自动生成获取器与设置器。
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
定义Dao包
在包中新建用户Dao的类
在类中编写需要的数据操作方法
用户Dao的具体写法
增,添加对象到数据表
添加java对象,到数据表中,变成数据实体
逻辑
代码
// 直接操作用户数据表(编写常用的操作在类中)
public class UserMysqlDao {
// 增
public int insert(UserEntity user) {
// 获取连接对象
Connection connection = DbHelper.getConnection();
// 构建sql语句
// 构建?占位符时,记得把'一起带走,这种是错误的占位方法:'?'
String sql = "INSERT INTO userinfo(uname,upwd) VALUES(?,?);";
// 获得安全执行者(sql)
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 给占位?添加数据
String uname = user.getUname();
String upwd = user.getUpwd();
try {
preparedStatement.setString(1, uname);
preparedStatement.setString(2, upwd);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// todo 查看sql语句 临时测试,后面要删
System.out.println(preparedStatement);
// 让安全执行者运行,得到结果
int i = 0;
try {
i = preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 释放资源
DbHelper.closeAll(connection, preparedStatement, null);
// 返回数据
return i;
}
测试类
package Test;
import Dao.UserMysqlDao;
import Entity.UserEntity;
public class Test02添加用户操作 {
public static void main(String[] args) {
// 实例化一个对象,用户对象
UserEntity user = new UserEntity("dc", "456");
// 把用户对象的数据存放到数据库
// 操作数据表的类 实例化它
UserMysqlDao userMysqlDao = new UserMysqlDao();
// 让这个dao类,帮我插入数据
// 光标移到insert这个红字的地方
int i = userMysqlDao.insert(user);
// 判断i的结果
if (i > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
}
}
效果
查 根据id来查
编写了测试类
package Test;
import Dao.UserMysqlDao;
import Entity.UserEntity;
public class Test03查询用户根据id {
public static void main(String[] args) {
// 实例化用户dao类
UserMysqlDao userMysqlDao = new UserMysqlDao();
// 调用查询id的方法,传入id
UserEntity user = userMysqlDao.selectById(5);
// 打印
System.out.println(user);
System.out.println(user.getUname());
}
}
查 根据id的方法
// 查
public UserEntity selectById(int id) {
// 获取连接对象
Connection connection = DbHelper.getConnection();
// 构建sql语句
String sql = "SELECT * FROM userinfo WHERE id = ?;";
// 安全执行者
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 往?填数据
try {
preparedStatement.setInt(1, id);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 执行者运行sql语句,得到返回值
ResultSet resultSet = null;
try {
resultSet = preparedStatement.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 处理返回值
UserEntity user = null;
try {
if (resultSet.next()) {
// 获得数据信息了
int uid = resultSet.getInt("id");
String uname = resultSet.getString("uname");
String upwd = resultSet.getString("upwd");
// 实例化一个对象
user = new UserEntity(uid, uname, upwd);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 关闭资源
DbHelper.closeAll(connection, preparedStatement, resultSet);
// 返回内容
return user;
}
改造了用户实体类
// 设置对象的打印显示值
// alt+ins 选择toString()
@Override
public String toString() {
return "UserEntity{" +
"id=" + id +
", uname='" + uname + '\'' +
", upwd='" + upwd + '\'' +
'}';
}
最终效果
删除功能
提供一个对象
这个对象是数据表中已存在的行
把它作为参数,让dao对象来删除
测试类
package Test;
import Dao.UserMysqlDao;
import Entity.UserEntity;
public class Test04删除用户 {
public static void main(String[] args) {
UserMysqlDao userMysqlDao = new UserMysqlDao();
// 获取用户
UserEntity userEntity = userMysqlDao.selectById(12);
int i = userMysqlDao.delete(userEntity);
if (i > 0) {
System.out.println("ok,success");
} else {
System.out.println("not ok,fail");
}
}
}
删除方法
// 删
public int delete(UserEntity user) {
// 获取连接对象
Connection connection = DbHelper.getConnection();
// 构建sql语句
String sql = "DELETE FROM userinfo WHERE id = ?;";
// 安全执行者
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 往?填数据
try {
preparedStatement.setInt(1, user.getId());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 执行sql语句
int i = 0;
try {
i = preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 关闭资源
DbHelper.closeAll(connection, preparedStatement, null);
// 返回内容
return i;
}
效果
关于服务
服务是有逻辑
根据不同的业务情况,会有不同的处理
为了完成目标,服务会借用其它工具
用户管理系统
具有的服务(业务)
- 开户
- 修改
- 查询密码
- 注销
服务包与服务类
测试类
package Test;
import Service.UserService;
import java.util.Scanner;
public class Test05服务的引入 {
public static void main(String[] args) {
// 定义变量
UserService userService = new UserService();
Scanner ipt = new Scanner(System.in);
// 询问用户
System.out.println("请输入需要注册的用户名(不可与其它人重复):");
String uname = ipt.nextLine();
System.out.println("请输入需要注册的密码:");
String upwd = ipt.next();
// 启动服务
// 因为服务所需要的数据采集到位,所以可以启动了
userService.KaiHu(uname, upwd);
}
}
注册业务
// 开户
public void KaiHu(String uname, String upwd) {
// 变量的定义
UserMysqlDao userMysqlDao = new UserMysqlDao();
// 假设开户不允许重名
// 关卡1:非法数据的校验
// 如果用户名 是 “”(非法数据)
// 也需要中止
if (uname.trim().equals("")) {
System.out.println("输入的内容为空,无法注册!!!");
return;
}
// 关卡2:重名验证
// 判断用户名是否存在
UserEntity user = userMysqlDao.selectByName(uname);
// 如果用户存在(中止服务)
if (user != null) {
System.out.println("用户已存在,无法使用这个用户名" + uname);
return;
}
// 需要冯过上面的两个关卡,才可以执行主业务
// 业务的核心代码
UserEntity u = new UserEntity(uname, upwd);
int i = userMysqlDao.insert(u);
// 处理结果
if (i > 0) {
System.out.println("注册成功");
} else {
System.out.println("注册失败");
}
}
测试效果
小结
每一个数据表都会有多个类与它对应
- 用户服务类
- 用户dao类
- 用户实体类
- 测试类
难点:
区分每一类它的职能
知道什么事情找什么类