Java回顾(十一) 集合练习与JDBC

1、集合练习

1.1 前提引入 Collections工具类

在这里插入图片描述

1.2 ArrayList存储学生对象并排序

需求:Arraylist存储学生对象,使用Collections对ArrayList进行排序要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

1、定义学生类
2、定义ArrayList
3、把学生类放入ArrayList中
4、用Collection.sort()进行排序
5、年龄不相同:num=年龄1-年龄2
6、年龄相同:三目运算符 num==0?s1.getName.CompareTo(s2.getName):num
7、增强for遍历输出

public class Demo01 {
    public static void main(String[] args) {
        ArrayList<Student> arrayList = new ArrayList<>();

        Student s1 = new Student("hws1", 11);
        Student s2 = new Student("hws2", 12);
        Student s3 = new Student("hws3", 13);

        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);

        Collections.sort(arrayList, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num1 = s1.getAge() - s2.getAge();
                int num2 = num1 == 0 ? s1.getName().compareTo(s2.getName()) : num1;
                return num2;
            }
        });

        for (Student s : arrayList) {
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}
1.3 斗地主

需求:通过程序实现斗地主过程中的洗牌,发牌和看牌思路:

思路:
①创建一个牌盒,也就是定义一个集合对象,用Arraylist集合实现
②往牌盒里面装牌
③洗牌,也就是把牌打撒,用Collections的shuffle0方法实现
④发牌,也就是遍历集合,给三个玩家发牌0看牌
⑤也就是三个玩家分别遍历自己的牌

public class Demo2 {
    public static void main(String[] args) {
        //1、创建一个牌盒
        ArrayList<String> arrayList = new ArrayList<>();

        //2、往牌盒里面放牌,用for循环定义的字段
        //2.1、定义花色
        String[] color = {"♣", "♦", "♥", "♠"};
        //2.2、定义点数
        String[] number = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};

        for (String c : color) {
            for (String n : number) {
                arrayList.add(c + n);
            }
        }

        arrayList.add("大王");
        arrayList.add("小王");

        //3、进行洗牌,使用Collections工具类的shuffle方法
        Collections.shuffle(arrayList);

        //4、发牌,给每个玩家发牌,还有3张底牌
        ArrayList<String> hwsArray = new ArrayList<>();
        ArrayList<String> hhhArray = new ArrayList<>();
        ArrayList<String> xxxArray = new ArrayList<>();
        ArrayList<String> dpArray = new ArrayList<>();

        for (int i = 0; i < arrayList.size(); i++) {
            if (i >= arrayList.size() - 3) {
                dpArray.add(arrayList.get(i));
            } else {
                //取模3正好对应3个人,如果有5个人就取模5
                if (i % 3 == 0) {
                    hwsArray.add(arrayList.get(i));
                } else if (i % 3 == 1) {
                    hhhArray.add(arrayList.get(i));
                } else {
                    xxxArray.add(arrayList.get(i));
                }
            }
        }

        //5、看牌:三个玩家分别遍历自己的牌
        seePoker("hws",hwsArray);
        seePoker("hhh",hhhArray);
        seePoker("xxx",xxxArray);
        seePoker("底牌",dpArray);

    }

    /**
     * 6、遍历自己的牌,可以调用这个函数
     */
    public static void seePoker(String name, ArrayList<String> arrayList) {
        System.out.print(name + "的牌是:");
        arrayList.sort(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.charAt(1) - s2.charAt(1);
            }
        });
        for (String a : arrayList) {
            System.out.print(a +" ");
        }
        System.out.println();
    }
}

在这里插入图片描述

1.4 斗地主升级

在这里插入图片描述
在这里插入图片描述

public class Demo03 {
    public static void main(String[] args) {
        //1、用HashMap存储牌的索引和牌值
        HashMap<Integer, String> hashMap = new HashMap<>();
        ArrayList<Integer> arrayList = new ArrayList<>();

        //2、定义牌值
        //2.1、定义花色
        String[] colors = {"♣", "♦", "♥", "♠"};
        //2.2、定义点数
        String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        //2.3放入HashMap中
        int index = 0;
        for (String number : numbers) {
            for (String color : colors) {
                hashMap.put(index, (color + number));
                arrayList.add(index);
                index++;
            }
        }

        arrayList.add(52);
        arrayList.add(53);
        hashMap.put(52, "小王");
        hashMap.put(53, "大王");

        //3、洗牌
        Collections.shuffle(arrayList);

        //4、通过对ArrayList进行发牌,也就是分配索引i
        TreeSet<Integer> hwsSet = new TreeSet<>();
        TreeSet<Integer> hhhSet = new TreeSet<>();
        TreeSet<Integer> xxxSet = new TreeSet<>();
        TreeSet<Integer> dpSet = new TreeSet<>();

        for (int i = 0; i < arrayList.size(); i++) {
            Integer x = arrayList.get(i);
            if (i >= arrayList.size() - 3) {
                dpSet.add(x);
            } else if (i % 3 == 0) {
                hwsSet.add(x);
            } else if (i % 3 == 1) {
                hhhSet.add(x);
            } else {
                xxxSet.add(x);
            }
        }

        //5、看牌
        lookPoker("hws", hwsSet, hashMap);
        lookPoker("hhh", hhhSet, hashMap);
        lookPoker("xxx", xxxSet, hashMap);
        lookPoker("底牌", dpSet, hashMap);

    }

    /**
     * 定义方法看牌,获取值,通过TreeSet去找对应的值
     */
    public static void lookPoker(String name, TreeSet<Integer> treeSet, HashMap<Integer, String> hashMap) {
        System.out.print(name + "的牌是:");
        for (Integer ts : treeSet) {
            System.out.print(hashMap.get(ts) + " ");
        }
        System.out.println();
    }
}

在这里插入图片描述

2、JDBC

2.1 JDBC的概念
  • 概念:Java DataBase Connectivity Java 数据库连接,Java语言操作数据库
  • JDBC的本质是sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
    在这里插入图片描述
2.2 JDBC快速入门
  • (1)、步骤
    1.导入驱动java
    2.注册驱动
    3·获取数据库连接对象connection
    4.定义sql
    5·获取执行sql语句的对象statement
    6.执行sql,接受返回结果
    7.处理结果
    8.释放资源
public class JDBCDemo01 {
    public static void main(String[] args) throws Exception {
        //1、导入驱动jar包
        //2、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3、获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/csdn","root","123456");
        //4、定义sql语句
        String sql = "UPDATE emp SET salary = 8000 where id = 1001";
        //5、获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //6、执行sql
        int count = stmt.executeUpdate(sql);
        //7、处理结果
        System.out.println(count);
        //8、释放资源
        stmt.close();
        conn.close();
    }
2.3 JDBC各个类详解

(1).DriverManager:驱动管理对象

  • 功能:
    1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
    static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
    写代码使用: Class.forName(“com.mysql.jdbc.Driver”);
    通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
    static {
    try {
    java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
    throw new RuntimeException(“Can’t register driver!”);
    }
    }

    注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

2 . 获取数据库连接:
方法:static Connection getConnection(String url, String user, String password)
* 参数:
* url:指定连接的路径
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
* 例子:jdbc:mysql://localhost:3306/db3
* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
* user:用户名
* password:密码
2.2、Connection:数据库连接对象
1. 功能:
1. 获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()

3.Statement:执行sql的对象

  1. 执行sql
    1. boolean execute(String sql) :可以执行任意的sql 了解
    2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
      返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
    3. ResultSet executeQuery(String sql) :执行DQL(select)语句

4.ResultSet:结果集对象
5.Preparedstatement:执行sql的对象

2.4 ResultSet集合

在这里插入图片描述

2.4.1 JDBCUtils工具类
package day04.hws.util;

/**
 * ClassName:JDBCUtils
 * Package:day04.hws.util
 * Description:
 *
 * @ date:2020/5/4 15:45
 * @ author:hws
 */

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     */
    static{
        //读取资源文件,获取值。

        try {
            //1. 创建Properties集合类。
            Properties pro = new Properties();

            //获取src路径下的文件的方式--->ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res  = classLoader.getResource("jdbc.properties");
            String path = res.getPath();

            //2. 加载文件
            pro.load(new FileReader(path));

            //3. 获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn){
        if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn){
        if( rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}


2.4.2演示工具类
public class JDBCDemo02 {
    public static void main(String[] args) {
        //1、键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("输入用户名:");
        String username = sc.next();
        System.out.println("输入密码:");
        String password = sc.next();

        //2、调用
        boolean flag = new JDBCDemo02().login(username, password);

        //3、判断登录是否成功
        System.out.println(flag ? "登录成功" : "登录失败");
    }

    public boolean login(String username, String password) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet resultSet = null;

        if (username == null || password == null) {
            return false;
        }

        //1、获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2、定义SQL
            String sql = "select * from user where username = '" + username + "' and password = '" + password + "' ";
            //3、获取执行的对象
            stmt = conn.createStatement();
            //4、把SQL传入
            resultSet = stmt.executeQuery(sql);
            //5、判断
            return resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(resultSet,stmt,conn);
        }
        return false;
    }

}
参考的一个博主的,关于报错

报错:No suitable driver found for jdbc:mysql://localhost:3306/ 问题
我在网上查的有四种原因:

一:连接URL格式出现了问题(Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/XX”,“root”,“XXXX”)

二:驱动字符串出错(com.mysql.jdbc.Driver)

三:Classpath中没有加入合适的mysql_jdbc驱动(驱动要和你的数据库版本一致)
CLASSPATH=.;;E:\tools\apache-jmeter-2.9\lib\mysql-connector-
java-5.1.33-bin.jar;

四:驱动jar包放的位置不对

我遇到的问题是第四类,eclipse里,运行项目,访问数据库始终报此错!
最后把驱动包mysql-connector-java-5.0.5-bin.jar放到jdk/jre/lib/ext里面,得以解决问题!
————————————————
版权声明:本文为CSDN博主「一只蹦跶的小蹦跶」的原创文章,
2.6 PerparedStatement

在这里插入图片描述
用PerparedStatement解决SQL注入的问题

public class JDBCDemo02 {
    public static void main(String[] args) {
        //1、键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("输入用户名:");
        String username = sc.next();
        System.out.println("输入密码:");
        String password = sc.next();

        //2、调用
        boolean flag = new JDBCDemo02().login(username, password);

        //3、判断登录是否成功
        System.out.println(flag ? "登录成功" : "登录失败");
    }

    public boolean login(String username, String password) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet resultSet = null;

        if (username == null || password == null) {
            return false;
        }

        //1、获取连接
        try {
            conn = JDBCUtils.getConnection();
            //2、定义SQL
            String sql = "select * from user where username = ? and password = ?";
            //3、获取执行的对象
            pstmt = conn.prepareStatement(sql);
            //3.1、给问号赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4、把SQL传入
            resultSet = pstmt.executeQuery();
            //5、判断
            return resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(resultSet,pstmt,conn);
        }

        return false;
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隐形的稻草人HWS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值