JDBC連接Mysql數據庫過程之代碼實戰【一條命途多舛的SQL】

上一篇我們已經瞭解了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. 總結

自此整個自測環境已經結束,以上代碼都可以運行,小夥伴們快來試試吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章