JDBC4 - 实现CRUD

JDBC实现CRUD

其中对SELECT语句进一步优化

package com.atguigu.api.preparedStatement;

import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.sun.xml.internal.fastinfoset.alphabet.BuiltInRestrictedAlphabets.table;

public class PSCRUDPart {

    public static void main(String[] args) {


    }

    //测试方法需要导入junit的测试包
    @Test
    public void testInsert() throws ClassNotFoundException, SQLException {

        /**
         * t_user插入一条数据
         *      account
         *      password
         *      nickname
         */

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
        //3.编写SQL语句结构,动态值使用 ? 代替
        String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
        //4.创建preparedStatement,并且传入SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1, "zzz");
        preparedStatement.setObject(2, "123456");
        preparedStatement.setObject(3, "hehe");
        //6.发送SQL语句
        int rows = preparedStatement.executeUpdate();
        //7.输出结果
        if(rows > 0) {
            System.out.println("数据插入成功");
        }else {
            System.out.println("数据插入失败");
        }
        //8.释放资源
        connection.close();
        preparedStatement.close();

    }

    /**
     * 目标:查询所有用户数据,并且封装到一个 List<Map> List集合中
     * 结果集:
     *      行 id account password nickname
     *      行 id account password nickname
     *      行 id account password nickname
     *      行 id account password nickname
     * 数据库 -> resultSet -> java -> 一行 - map(key = 列名, value = 列的内容) -> List<Map> list
     * 实现思路:
     *      遍历行数据,一行对应一个map,获取一行的列名和对应的列的属性,装配即可
     *      将map装到一个集合
     *难点:
     *      如何获取列的名称?
     */


    @Test
    public void testSelect() throws SQLException, ClassNotFoundException {

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
        //3.编写SQL语句结构,动态值使用 ? 代替
        String sql = "select * from t_user";
        //4.创建preparedStatement,并且传入SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值 -- 没有占位符
        //6.发送SQL语句
        ResultSet resultSet = preparedStatement.executeQuery();


        //7.输出结果
        List<Map> list = new ArrayList<Map>();

        //自动遍历列
        //获取列的信息对象
        //TODO metaData对象 装的当前结果集中列的信息对象(可以获取列的数量、列的名称)
        ResultSetMetaData metaData = resultSet.getMetaData();
        //知道列数后,就可以通过下标水平遍历列
        int columnCount = metaData.getColumnCount();

        while (resultSet.next()) {
            Map map = new HashMap();
            //一行数据 对应一个 map

            //纯手动取值
//            map.put("id", resultSet.getObject("id"));
//            map.put("account", resultSet.getObject("account"));
//            map.put("password", resultSet.getObject("password"));
//            map.put("nickname", resultSet.getObject("nickname"));

            //自动遍历列,注意 列的下标从1开始
            for (int i = 1; i <= columnCount; i++) {
                //获取当前列指定下标的值
                Object value = resultSet.getObject(i);
                //根据下标获取列名
                String columnLabel = metaData.getColumnLabel(i);
                //将 列名 - 列值 传入一个map
                map.put(columnLabel,value);
            }

            //一行数据的所有列全部存到了map中
            //将map存储到集合中即可
            list.add(map);
        }

        System.out.println("list = " + list);

        //8.释放资源
        connection.close();
        preparedStatement.close();

    }



    @Test
    public void testUpdate() throws ClassNotFoundException, SQLException {
        /**
         * 修改 id = 3 的用户 nickname = "haha"
          */

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
        //3.编写SQL语句结构,动态值使用 ? 代替
        String sql = "update t_user set nickname =? where id =?";
        //4.创建preparedStatement,并且传入SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1, "haha");
        preparedStatement.setObject(2, 3);
        //6.发送SQL语句
        int rows = preparedStatement.executeUpdate();
        //7.输出结果
        if(rows > 0) {
            System.out.println("数据修改成功");
        }else {
            System.out.println("数据修改失败");
        }
        //8.释放资源
        connection.close();
        preparedStatement.close();
    }

    @Test
    public void testDelete() throws ClassNotFoundException, SQLException {

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
         Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
        //3.编写SQL语句结构,动态值使用 ? 代替
        String sql = "delete from t_user where id = ?";
        //4.创建preparedStatement,并且传入SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1, 3);
        //6.发送SQL语句
        int rows = preparedStatement.executeUpdate();
        //7.输出结果
        if(rows > 0) {
            System.out.println("数据删除成功");
        }else {
            System.out.println("数据删除失败");
        }
        //8.释放资源
        connection.close();
        preparedStatement.close();
    }
}
posted @   LaViez  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示