上一篇我們已經瞭解了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. 總結
自此整個自測環境已經結束,以上代碼都可以運行,小夥伴們快來試試吧!