JDBC学习笔记第四篇

package com.shayiheng.api.preparedstatement;

import com.sun.glass.ui.Clipboard;
import org.junit.Test;

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

/**
 * 4
 * @Author Tom
 * Description: 使用preparedstatement进行t_user表的curd动作
 * 1.注册驱动
 * 方案一
 *      DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
 * 方案二
 *      class.forName("com.mysql.cj.jdbc.Driver")
 * 2.获取连接
 *       Connection connection=DriverManager.getConnection();
 *          3(String url,String user,String password)
 *          2(Srting url,Properties info(user password))
 *          1(String url?user=账号&password=密码)
 *
 * 3.编写SQL语句
 * //静态
 *       Statement statement=connection.createStatement();
 * //预编译
 *       PreparedStatement preparedstatement= connection.preparedStatement(sql语句)
 * 4.占位符赋值
 *       preparedstatement.setObject(?的位置 从左到右 从1开始,值)
 * 5.发送SQL语句,并获取结果
 *      int rows=excuteUpdate();//非DQL
 *      Resultset=excuteQuery();//DQL
 *
 * 6.查询结果解析
 *      移动光标指向行数据 next(); if(next()) while(next())
 *      获取列的数据即可 get类型(int 列的下角标 从1开始 | int 列的label(别名或者列名))
 *      获取列的信息 getMetadate();ResultsetMetaData对象 包含的就是列的信息
 *                 getColumnCount(); getCloumnLebal(index)
 * 7.关闭资源
 * close();
 */

public class PSCURDPart {

    //导入juint的测试包
    @Test
    public void testInsert() throws ClassNotFoundException, SQLException {
        /**
         * t_user插入一条数据!
         * account test
         * password test
         * nickname 二狗子
         */
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
        //3.编写SQL语句结果,动态的部分使用?代替
        String sql = "INSERT INTO t_user(account, PASSWORD,nickname)VALUES(?,?,?);";
        //4.创建预编译preparedStatement,并且传入SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1,"test3");
        preparedStatement.setObject(2,"test");
        preparedStatement.setObject(3,"二狗子");
        //6.发送SQL语句
        //DML类型
        int rows=preparedStatement.executeUpdate();
        //7.输出结果
        if (rows>0) System.out.println("插入成功");
        else System.out.println("插入失败");
        //8.关闭资源
        preparedStatement.close();
        connection.close();

    }
    @Test
    public void testUpdate() throws SQLException, ClassNotFoundException {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
        //3.编写SQL语句结果,动态的部分使用?代替
        String sql = "UPDATE t_user SET account=?,PASSWORD=?,nickname=?WHERE id=?;";
        //4.创建预编译preparedStatement,并且传入SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1,"test2");
        preparedStatement.setObject(2,"test1");
        preparedStatement.setObject(3,"二狗子1");
        preparedStatement.setObject(4,4);
        //6.发送SQL语句
        //DML类型
        int rows=preparedStatement.executeUpdate();
        //7.输出结果
        if (rows>0) System.out.println("修改成功");
        else System.out.println("修改失败");
        //8.关闭资源
        preparedStatement.close();
        connection.close();
    }


    @Test
    public void testDelete() throws SQLException, ClassNotFoundException {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
        //3.编写SQL语句结果,动态的部分使用?代替
        String sql = "DELETE FROM t_user WHERE id=?;";
        //4.创建预编译preparedStatement,并且传入SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1,4);
        //6.发送SQL语句
        //DML类型
        int rows=preparedStatement.executeUpdate();
        //7.输出结果
        if (rows>0) System.out.println("删除成功");
        //8.关闭资源
        preparedStatement.close();
        connection.close();
    }

    /**
     *目标:查询所有用户数据,并且封装到一个Listlist集合!
     *
     * 解释:
     *     行 id account password nickname
     *     行 id account password nickname
     *     行 id account password nickname
     *
     * 数据库 -> resultSet -> java -> 一行 -map(key=列名,value=列的内容)->Listlist
     *
     * 实现思路:
     *      遍历行数据,一行对应一个map! 获取一行的列名和对应的列的属性,装配即可!
     *      将map装到一个集合
     *
     *  难点:
     *      如何获取列的名称
     */
    @Test
    public void testSelect() throws SQLException, ClassNotFoundException {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
        //3.编写SQL语句结果,动态的部分使用?代替
        String sql = "SELECT * FROM t_user;";
        //4.创建预编译preparedStatement,并且传入SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        //preparedStatement.setObject(1,3);
        //6.发送SQL语句
        //DQL类型
        ResultSet resultSet = preparedStatement.executeQuery();
        //7.输出结果
        /**
         * TODO:回顾
         *    resultSet: 有行和有列!获取数据的时候,一行一行数据!
         *               内部又一个游标,默认指向数据的第一行之前!
         *               我们可以利用next()方法移动游标!指向数据行!
         *               获取行中的列的数据
         */
        List <Map> list=new ArrayList<>();

        //获取列的信息对象
        //TODO:metaData 装的是当前结果集列的信息对象!(可以获取列的名称根据下表,也可以获取列的数量)
        ResultSetMetaData metaData = resultSet.getMetaData();

        //水平遍历列(获取一共有多少列)
        int columnCount = metaData.getColumnCount();

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

//            map.put("id",resultSet.getInt(1));
//            map.put("account", resultSet.getString(2));
//            map.put("password", resultSet.getString(3));
//            map.put("nickname", resultSet.getString(4));

            //自动遍历列,注意要从1开始,并且小于等于总列数!
            for (int i =1; i <=columnCount; i++) {
                //获取指定列下角标的值! 列的值
                Object value = resultSet.getObject(i);
                //获取指定列下角标的列的名称!ResultSetMetaData

                //select * [列名] |xxx_xxx_xx_123 as name
                //getColumnLabel:会获取别名,如果没有写别名才是列的名称 不要使用getColumnName : 只会获取列的名称
                // 列的名称
                String columnLabel = metaData.getColumnLabel(i);

                map.put(columnLabel,value);
            }
            list.add(map);
    }
        System.out.println("list ="+list);
        //8.关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

你可能感兴趣的:(JDBC,学习,笔记)