(JDBC使用及封装)实习第二天——之JDBC增删改查

   今天实习主要学习了通过SQLyog - 64 bit客户端连接管理数据库,在java项目中通过jdbc操纵数据库,并写出规范风格的代码。学习内容如下:

准备阶段

   1.安装并打开SQLyog数据库可视化管理工具:

 

2.创建user数据库,字符集选择utf8mb4(兼容utf8),排序选择utf8mb4_general_ci:

其中关于排序规则的选择需要明确的是,mysql是根据所给的规则对数据库中的字符串进行相互比较来确定顺序,并排序的。意味其也可确定字符串是否相等或不等。网上查阅资料如下:

  • 后缀ci (case insensitive)意味不区分大小写(大小写不敏感),后缀cs (case sensitive)区分大小写(大小写敏感)

  • utf8_bin 规定每个字符串用二进制编码存储,区分大小写,可以直接存储二进制的内容

  • ci情况下:select name,age from userinfo; 等价于SELECT NAME,AgE FROM userinfo; 大小写字符判断是一样的

  • 而在cs情况下:假设字段名严格为name, age,表名:UserInfo。那么就必须:select name,age from UserInfo; 大小写字符判断有区分

  • bin意思是二进制,所以小写u和大写U会被区别
    例如你运行:
    SELECT name FROM UserInfo WHERE name = 'Lina'
    那么在utf8_bin中你就找不到 name = 'lina' 的那一行, 在utf8_general_ci 下可以.

1). utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。

2). utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果

3). utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容

 3. 建userinfo表

    其中将id设为主键,并勾选自增选项,这样在插入数据时数据库可以自动增加id值,避免重复。

 4.插入一行数据并保存

 

一、数据库连接

public class Test {
    public static void main(String[] args) {
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.创建连接
            DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_user?useSSL=true&characterEncoding=utf-8&user=root&password=password");
            System.out.println("创建连接成功");
            //3.写sql语句
            //4.得到statement对象执行sql
            //5.得到结果集
            //6.处理结果集
            //7.关闭资源
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果: 创建连接成功

二、数据库操作基本框架

public class Test {
    private static void prtRS(ResultSet rs) throws SQLException {
        while (rs.next()) {
            System.out.print(rs.getInt(1) + "\t ");
            System.out.print(rs.getString(2) + '\t');
            System.out.print(rs.getString(3) + "\r\n");
        }
    }

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.创建连接
            connection =
                    DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_user?useSSL=true&characterEncoding=utf-8&user=root&password=password");
            System.out.println("创建连接成功");
            //3.写sql语句
            String sql = "select * from userinfo";
            //4.得到statement对象执行sql
            statement = connection.prepareStatement(sql);
            //5.得到结果集
            rs = statement.executeQuery();
            //6.处理结果集
            prtRS(rs);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

三、封装数据库连接和关闭资源操作

public class DBUtil {
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test_user?useSSL=true&characterEncoding=utf-8&user=root&password=password");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void close(Connection con, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Connection conn, Statement stmt) {
        DBUtil.close(conn, stmt, null);
    }

}

使用封装好的DBUtil类建立和关闭数据库连接:

    public boolean add(UserInfo userInfo) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = DBUtil.getConnection();
            //sql
            String sql = "insert into userinfo(username,password) values(?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, userInfo.getUsername());
            stmt.setString(2, userInfo.getPassword());
            //返回插入结果
            return stmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt);
        }
        return false;
    }

四、实现增删改查

五、建立实体类与数据库表对应

数据库表:

 实体类:

package com.zhongruan.bean;

public class UserInfo {

    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public UserInfo() {
    }

    public UserInfo(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public UserInfo setId(int id) {
        this.id = id;
        return this;
    }

    public String getUsername() {
        return username;
    }

    public UserInfo setUsername(String username) {
        this.username = username;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public UserInfo setPassword(String password) {
        this.password = password;
        return this;
    }

    @Override
    public String toString() {
        return String.format("UserInfo{id:%d, username:'%s', password:'%s'}", id, username, password);
    }

}

PS: 1.其中getter和setter方法在IDEA中用alt+insert键选择generate自动生成。 

          2.直接print实体对象只会显示其内存引用地址,只有重写Object的toString()方法可以使得输出能显示其属性及其值。 

六、抽象出DAO层

1.在项目中新建一个名为dao的包,路径为:com.zhongruan.dao

2.在dao包中添加UserInfoDao类,该类中所有操作均为针对数据库表userinfo的操作:

public class UserInfoDao {
    public boolean add(UserInfo userInfo) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = DBUtil.getConnection();
            //sql
            String sql = "insert into userinfo(username,password) values(?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, userInfo.getUsername());
            stmt.setString(2, userInfo.getPassword());
            //返回插入结果
            return stmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt);
        }
        return false;
    }

    public List<UserInfo> findAll() {
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        List<UserInfo> list = new ArrayList<>();
        try {
            //1.加载驱动
            //2.创建连接
            conn = DBUtil.getConnection();
            //3.写sql语句
            String sql = "select * from userinfo";
            //4.得到statement对象执行sql
            statement = conn.prepareStatement(sql);
            //5.得到结果集
            rs = statement.executeQuery();
            //6.处理结果集
            while (rs.next()) {
                UserInfo userInfo = new UserInfo();
                userInfo.setId(rs.getInt(1));
                userInfo.setUsername(rs.getString(2));
                userInfo.setPassword(rs.getString(3));
                list.add(userInfo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭资源
            DBUtil.close(conn, statement, rs);
        }
        return list;
    }

}

七、完整代码

1.项目结构:

 

2. 在测试类Test中调用封装好的DBUtil类、UserInfo、UserInfoDao类,查询数据库,插入一条信息,然后再查询更新后的数据库,并将其打印出来:

封装的dao层UserInfoDao类:

public class UserInfoDao {
    public boolean add(UserInfo userInfo) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = DBUtil.getConnection();
            //sql
            String sql = "insert into userinfo(username,password) values(?,?)";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, userInfo.getUsername());
            stmt.setString(2, userInfo.getPassword());
            //返回插入结果
            return stmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt);
        }
        return false;
    }

    public boolean deleteById(Integer id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "delete from userinfo where id=?";
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, id);
            return stmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt);
        }
        return false;
    }

    public boolean updateById(UserInfo userInfo) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "update userinfo set username=?,password=? where id=?";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, userInfo.getUsername());
            stmt.setString(2, userInfo.getPassword());
            stmt.setInt(3, userInfo.getId());
            return stmt.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt);
        }
        return false;
    }

    public UserInfo selectOneById(Integer id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "select * from userinfo where id=? limit 1";
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                UserInfo userInfo = new UserInfo();
                userInfo.setId(rs.getInt("id"));
                userInfo.setUsername(rs.getString("username"));
                userInfo.setPassword(rs.getString("password"));
                return userInfo;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt, rs);
        }
        return null;
    }

    public List<UserInfo> findAll() {
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        List<UserInfo> list = new ArrayList<>();
        try {
            //1.加载驱动
            //2.创建连接
            conn = DBUtil.getConnection();
            //3.写sql语句
            String sql = "select * from userinfo";
            //4.得到statement对象执行sql
            statement = conn.prepareStatement(sql);
            //5.得到结果集
            rs = statement.executeQuery();
            //6.处理结果集
            while (rs.next()) {
                UserInfo userInfo = new UserInfo();
                userInfo.setId(rs.getInt(1));
                userInfo.setUsername(rs.getString(2));
                userInfo.setPassword(rs.getString(3));
                list.add(userInfo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭资源
            DBUtil.close(conn, statement, rs);
        }
        return list;
    }

}

测试类代码:

public class Test {
    public static void main(String[] args) {
        try {
            UserInfoDao userInfoDao = new UserInfoDao();
            //list
            List<UserInfo> users = userInfoDao.findAll();
            System.out.println(users);
            //Insert
            UserInfo userInfo = new UserInfo("hualili", "asdf");
            userInfoDao.add(userInfo);
            //list
            users = userInfoDao.findAll();
            System.out.println(users);
            //delete
            userInfoDao.deleteById(1);
            //list
            System.out.println(userInfoDao.findAll());
            //update
            userInfoDao.updateById(new UserInfo("中软", "国际").setId(3));
            //list
            System.out.println(userInfoDao.findAll());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

结果截图:

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值