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. 总结

自此整个自测环境已经结束,以上代码都可以运行,小伙伴们快来试试吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值