上一篇我们已经了解了JDBC连接Mysql的数据库操作的过程,那这一篇我们就来一下实战。
话不多说,就是干,拿起你的手,撸一下
我们先定义一些变量,这样便于后期的维护和管理,此处需要修改自己的数据库的地址和账户密码
private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
/**
* 数据库连接地址
* 如果出现中文乱码,请添加 【?useUnicode=true&characterEncoding=utf-8】
*/
private static final String MYSQL_URL = "jdbc:mysql://192.168.31.33:3306/test?useUnicode=true&characterEncoding=utf-8";
private static final String MYSQL_USERNAME = "root";
private static final String MYSQL_PASSWORD = "123456";
1. 获取Mysql的连接
/**
* 获取JDBC的连接
* result:
* author: lwl
* date: 2020/6/24 14:19
*/
public Connection getConnection() {
Connection con = null;
try{
// 加载驱动
Class.forName(DRIVER_CLASS_NAME);
// 获取连接
con = DriverManager.getConnection(MYSQL_URL, MYSQL_USERNAME, MYSQL_PASSWORD);
} catch (ClassNotFoundException e) {
log.error("加载JDBC驱动异常",e);
} catch (SQLException e) {
log.error("获取JDBC连接异常",e);
}
return con;
}
2. 关闭资源方法
为什么关闭方法会在第二步呢? 因为获取方法和关闭方法是一个通用的方法,所以抽取出来做了一个基类,其他的操作类只要继承他则自动拥有这2个方法,省去很多繁琐的步骤和简化代码。
/**
* 关闭资源
* result:
* author: lwl
* date: 2020/6/24 14:21
*/
public void closeResource(Connection con, PreparedStatement pstmt, ResultSet rs) {
//关闭资源,倒关
try {
if(rs != null) {
rs.close();
}
if(pstmt != null) {
pstmt.close();
}
if(con != null) {
con.close(); //必须要关
}
} catch (Exception e) {
log.error("关闭资源异常", e);
}
}
3. 操作的数据相关
3.1 定义操作的类 User.java
@Data
@Accessors(chain = true)
public class User extends BaseModel {
private String name;
private String sex;
private String password;
private String phone;
@Override
public String toString() {
return "User{" +
"id='" + getId() + '\'' +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
"} " + super.toString();
}
}
/**
* @description: 所有类的基类
* @author :lwl
* @date :2020/6/24 14:09
* @version: 1.0.0
*/
@Data
@Accessors(chain = true)
public class BaseModel implements Serializable {
/**
* 主键
*/
private Long id;
private String createUser;
private Date createTime;
private String modifyUser;
private Date modifyTime;
}
3.2 建立User对应的数据库表
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
`create_user` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`modify_time` datetime DEFAULT NULL,
`modify_user` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
3.3 定义操作数据库的UserJdbc
此类继承之前的JdbcUtil ,则自动拥有了获取连接和关闭资源的方法,同时自定义了新增、删除、修改、查询的方法
/**
* @description: 用户的操作类
* @author :lwl
* @date :2020/6/24 15:29
* @version: 1.0.0
*/
@Slf4j
public class UserJdbc extends JdbcUtil {
public int addUser (User user) {
Connection con = getConnection();
PreparedStatement psst = null;
String sql = "insert into user (name, password, sex, phone) VALUES(?,?,?,?)";
try{
//设置的预编译语句格式
psst = con.prepareStatement(sql);
psst.setString(1, user.getName());
psst.setString(2, user.getPassword());
psst.setString(3, user.getSex());
psst.setString(4, user.getPhone());
log.info("---------正在执行的sql----------");
log.info(psst.toString());
return psst.executeUpdate();
} catch (Exception e) {
log.error("新增用户信息异常",e);
}finally {
closeResource(con, psst, null);
}
return 0;
}
public int del (long id) {
Connection con = getConnection();
PreparedStatement psst = null;
String sql = "delete from user where id = ?";
try{
//设置的预编译语句格式
psst = con.prepareStatement(sql);
psst.setLong(1, id);
log.info("---------正在执行的sql----------");
log.info(psst.toString());
return psst.executeUpdate();
} catch (Exception e) {
log.error("删除用户信息异常",e);
}finally {
closeResource(con, psst, null);
}
return 0;
}
public List<User> list() {
List<User> list = new ArrayList<>();
Connection con = getConnection();
PreparedStatement psst = null;
ResultSet resultSet = null;
String sql = "select * from user";
try{
psst = con.prepareStatement(sql);
log.info("---------正在执行的sql----------");
log.info(psst.toString());
resultSet = psst.executeQuery();
// 从结果集中取数据
while (resultSet.next()){
long id = resultSet.getLong(1);
String name = resultSet.getString(2);
String sex = resultSet.getString(3);
String password = resultSet.getString(4);
String phone = resultSet.getString(5);
User user = new User();
user.setName(name).setSex(sex).setPhone(phone).setPassword(password).setId(id);
list.add(user);
}
} catch (Exception e) {
log.error("获取用户集合异常",e);
} finally {
closeResource(con, psst, resultSet);
}
return list;
}
public int update(User user){
Connection con = getConnection();
PreparedStatement psst = null;
String sql = "update user set name = ?, phone = ?, sex = ?, modify_time = now() where id = ?";
try{
psst = con.prepareStatement(sql);
psst.setString(1, user.getName());
psst.setString(2, user.getPhone());
psst.setString(3, user.getSex());
psst.setLong(4, user.getId());
log.info("---------正在执行的sql----------");
log.info(psst.toString());
return psst.executeUpdate();
} catch (Exception e) {
log.error("更新用户信息异常",e);
}finally {
closeResource(con, psst, null);
}
return 0;
}
}
4. 编写测试类
/**
* @description: 测试类
* @author :lwl
* @date :2020/6/24 14:28
* @version: 1.0.0
*/
public class UserJdbcTest {
public static void main(String[] args) {
// 测试新增
// addUserTest();
/**
* ---------正在执行的sql----------
* com.mysql.cj.jdbc.ClientPreparedStatement: insert into user (name, password, sex, phone)
* VALUES('帅气的劉先生','66666666666','男','18888888888')
* 运行结果:true
*/
// 测试删除
// delUserTest(4);
// 运行结果:true
/**
* 如果删除一个不存在的,则返回false
*
* ---------正在执行的sql----------
* com.mysql.cj.jdbc.ClientPreparedStatement: delete from user where id = 4
* 运行结果:false
*
*/
// 测试获取集合
// List<User> list = list();
/**
* 运行结果
* ---------正在执行的sql----------
* com.mysql.cj.jdbc.ClientPreparedStatement: select * from user
* 运行结果如下:
* User{id='2'name='lwl', sex='男', password='123456', phone='18888888888'}
* BaseModel(id=2, createUser=null, createTime=null, modifyUser=null, modifyTime=null)
* User{id='3'name='lwl', sex='?', password='123456', phone='18888888888'}
* BaseModel(id=3, createUser=null, createTime=null, modifyUser=null, modifyTime=null)
* User{id='5'name='帅气的劉先生', sex='男', password='66666666666', phone='18888888888'}
* BaseModel(id=5, createUser=null, createTime=null, modifyUser=null, modifyTime=null)
*/
// 更新某个对象
// update(6, "刘先生66666", "18800006666", "未知");
/**
* 运行结果:
* ---------正在执行的sql----------
* com.mysql.cj.jdbc.ClientPreparedStatement: update user set name = '刘先生',
* phone = '18800001234', sex = '未知', modify_time = now() where id = 2
* 运行结果:true
*/
}
private static void addUserTest() {
// 初始化数据类
User user = new User();
user.setName("帅气的劉先生").setPassword("66666666666")
.setPhone("18888888888").setSex("男");
UserJdbc userJdbc = new UserJdbc();
int num = userJdbc.addUser(user);
// 是否成功 如果成功则返回影响的记录数
System.out.println("运行结果:" + (num==1));
}
private static void delUserTest(long id) {
UserJdbc userJdbc = new UserJdbc();
int num = userJdbc.del(id);
// 是否成功 如果成功则返回影响的记录数
System.out.println("运行结果:" + (num==1));
}
private static List<User> list() {
UserJdbc userJdbc = new UserJdbc();
List<User> list = userJdbc.list();
// 打印输出结果
System.out.println("运行结果如下:");
list.forEach(System.out::println);
return list;
}
private static void update(long id, String name, String phone, String sex) {
UserJdbc userJdbc = new UserJdbc();
User user = new User();
user.setPhone(phone).setSex(sex).setName(name).setId(id);
int num = userJdbc.update(user);
System.out.println("运行结果:" + (num==1));
}
}
5. 总结
自此整个自测环境已经结束,以上代码都可以运行,小伙伴们快来试试吧!