Java高级程序设计第八章的练习
通过一个案例去了解使用JDBC连接到MySQL,并且对数据库中的User表进行增删改查
目录
1、创建一个案例使用的数据库和表
-- 创建数据库
create database emp;
-- 使用数据库
use emp;
-- 创建表
CREATE TABLE `user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`user` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`pwd` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`nickname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- 插入数据
INSERT INTO `user` VALUES (1, '123', '1111', 'wangxiaohu', 18);
INSERT INTO `user` VALUES (2, '111', '123123', 'chenxiao', 20);
INSERT INTO `user` VALUES (3, '222', '123456', 'chenwang', 22);
INSERT INTO `user` VALUES (4, '333', '123123', 'zhangsan', 23);
INSERT INTO `user` VALUES (5, '444', '123456', 'wangzhai', 19);
INSERT INTO `user` VALUES (6, '555', '111', 'lisi', 16);
2、创建用于MySQL的数据库工具类DBUtil
工具类DBUtil用于连接MySQL
import java.sql.*;
///DBUtil叫做数据库工具类(用于连接MySQL)
public class DBUtil {
//1、连接配置项
public static final String DriverName = "com.mysql.cj.jdbc.Driver"; //固定路径(lib目录下的jar包)
public static final String URL = "jdbc:mysql://localhost:3306/emp?characterEncoding=utf-8"; //连接数据库emp
public static final String USER = "root"; //用户名
public static final String PWD = "123456"; //密码
//2、加载数据库驱动
static {
try {
Class.forName(DriverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//3、连接方法
public static Connection getConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PWD);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
//4、关闭
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (conn != null) {
conn.close();
}
if (ps != null) {
ps.close();
}
if (rs != null) {
rs.close(); //关闭连接
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//5、使用
public static void main(String[] args) {
System.out.println(DBUtil.getConn());
//运行如果输出的是一行字符串,就表示连接数据库成功
//连接数据库失败则报红
}
}
3、通过JDBC删除User表中的数据
类的命名为:对要操作的表 + DAO进行命名
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//数据库的表面+DAO命名该类(固定格式)
public class UserDAO_del {
//1、实现对用户的删除
public static boolean del(int id){//通过主键id进行删除某一条数据
//1、连接数据库
Connection conn = DBUtil.getConn();
//2、编写SQL语句
String sql = "delete from user where id=?";
try {
//3、预编译SQL
PreparedStatement ps = conn.prepareStatement(sql);
//4、设置SQL参数
ps.setObject(1,id);
//5、执行SQL
boolean result = ps.executeUpdate() > 0; //它返回的是个影响行数
//6、关闭数据库
DBUtil.close(conn,ps,null);
//7、返回结果
return result;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//这里做一个预防万一没有执行try时,返回false
return false;
}
//调用上面的del删除方法
public static void main(String[] args) {
//执行删除的方法del
System.out.println(UserDAO_del.del(4)?"删除成功":"删除失败");
}
}
(对表的操作应该统一集中在一个类(UserDAO)中,但是因为案例拆分多个类来实现)
4、通过JDBC对User表进行增加数据
在对User表进行增的操作时,需要先创建一个User的模型类(对User中的字段进行一个get和set的处理)
//模型类(一张表对应一个模型类,类的名字就是表名) =》 数据的载体
public class User {
//字段名
private int id;
private String user;
private String pwd;
private String nickname;
private int age;
//生成get和set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
再创建一个类来对User表实现增加add的操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UserDAO_add {
//1、新增用户数据(新增、删除、修改逻辑是一样的)
public static boolean add(User u){
//1、连接数据库
Connection conn = DBUtil.getConn();
//2、编写SQL语句
String sql = "insert into user values(?,?,?,?,?)"; //需要传递的参数用?代替,理解为:参数占位符
try {
//3、预编译SQL
PreparedStatement ps = conn.prepareStatement(sql);
//4、设置SQL参数
ps.setObject(1,null); //用户id
ps.setObject(2,u.getUser());
ps.setObject(3,u.getPwd());
ps.setObject(4,u.getNickname());
ps.setObject(5,u.getAge());
//5、执行SQL
boolean result = ps.executeUpdate() > 0; //它返回的是个影响行数
//6、关闭数据库
DBUtil.close(conn,ps,null);
//7、返回结果
return result;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//这里做一个预防万一没有执行try时,返回false
return false;
}
public static void main(String[] args) {
// 调用增加方法add
User u = new User();
u.setAge(20);
u.setUser("User");
u.setPwd("Password");
u.setNickname("草上飞");
System.out.println(UserDAO_add.add(u) ?"添加成功":"添加失败");
}
}
5、通过JDBC对User表的数据进行修改
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UserDAO_up {
//1、对用户的数据进行修改
public static boolean update(User u){
//1、连接数据库
Connection conn = DBUtil.getConn();
//2、编写SQL语句
String sql = "update user set user=?,pwd=?,nickname=?,age=? where id=?";
try {
//3、预编译SQL
PreparedStatement ps = conn.prepareStatement(sql);
//4、设置SQL参数
ps.setObject(1,u.getUser());
ps.setObject(2,u.getPwd());
ps.setObject(3,u.getNickname());
ps.setObject(4,u.getAge());
ps.setObject(5,u.getId()); //用户id
//5、执行SQL
boolean result = ps.executeUpdate() > 0; //它返回的是个影响行数
//6、关闭数据库
DBUtil.close(conn,ps,null);
//7、返回结果
return result;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//这里做一个预防万一没有执行try时,返回false
return false;
}
public static void main(String[] args) {
// 调用增加方法add
User u = new User();
u.setId(8); //修改的是ID=8的用户
u.setAge(21);
u.setUser("用户名");
u.setPwd("密码");
u.setNickname("地上滚");
System.out.println(UserDAO_up.update(u) ?"修改成功":"修改失败");
}
}
6、通过JDBC查询User表的全部数据
对表的查询与对表的增删改是不一样的,需要单独的编写
import java.sql.*;
import java.util.ArrayList;
public class UserDAO_seAll {
//查询跟增删改是不一样的,需要单独的额外书写
//查询User表中的全部数据
public static ArrayList<User> select(){
//1、写SQL的查询语句
String sql = "select * from user";
//2、连接数据库
Connection conn = DBUtil.getConn();
//3、预编译
try {
PreparedStatement ps = conn.prepareStatement(sql);
//4、执行查询
ResultSet rs = ps.executeQuery(); //这里得到的是结果集
//5、组装数据返回
ArrayList<User> list = new ArrayList<>();
while (rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setUser(rs.getString("user"));
u.setPwd(rs.getString("pwd"));
u.setNickname(rs.getString("nickname"));
u.setAge(rs.getInt("age"));
//添加到集合中
list.add(u);
}
//6、返回结果
return list;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void main(String[] args) {
ArrayList<User> list = UserDAO_seAll.select();
System.out.println("id \t 用户名 \t 密码 \t 名称 \t 年龄");
for (User u : list) {
System.out.println(u.getId()+"\t"+u.getUser()+"\t"+u.getPwd()+"\t"+u.getNickname()+"\t"+u.getAge());
}
}
}
7、通过JDBC查询User表的单个数据
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDAO_Find {
//查询跟增删改是不一样的,需要单独的额外书写
//查询User表中的一条数据
public static User find(int id){
//1、写SQL的查询语句
String sql = "select * from user where id = ?";
//2、连接数据库
Connection conn = DBUtil.getConn();
//3、预编译
try {
PreparedStatement ps = conn.prepareStatement(sql);
//设置参数
ps.setObject(1,id);
//4、执行查询
ResultSet rs = ps.executeQuery(); //这里得到的是结果集
//5、组装数据返回
User u = new User();
while (rs.next()){
u.setId(rs.getInt("id"));
u.setUser(rs.getString("user"));
u.setPwd(rs.getString("pwd"));
u.setNickname(rs.getString("nickname"));
u.setAge(rs.getInt("age"));
}
//6、返回结果
return u;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void main(String[] args) {
//获取列表回来
User u = UserDAO_Find.find(5);
System.out.println("id \t 用户名 \t 密码 \t 名称 \t 年龄");
System.out.println(u.getId()+"\t"+u.getUser()+"\t"+u.getPwd()+"\t"+u.getNickname()+"\t"+u.getAge());
}
}