JDBC与MySQL练习

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC与MySQL练习

以下操作环境基于MySQL8.0.27,JUint4单元测试

解决IDEA中无法在JUint单元测试运行时,从键盘读取字符的方法:找到【Help】–> 【Edit Custom VM Options】

再添加如下语句,重启IDEA就生效:

-Deditable.java.test.console=true


600eeb41246f4da1841af2780d5bc9eb.png

1、创建数据库test01_bookstore

2、创建如下表格

(1)图书表books

345dbeb7554643379f34b0461eda7b41.png

(2)用户表users

3b30118b20434324bc1e8b96b2667125.png

(3)订单表orders

d49340dbf0594356bb6d4b1548667372.png

4)订单明细表order_items

a587272c34c84d48b6db74f523df2f0d.png

3、使用sql语句在命令行或SQLyog中添加一些模拟数据

表books:

1b5465f6698a471a86581e374e84fec9.png

表users:

7469bfd207d04ade88c025aa9019a41c.png

表orders:

13a534ff73e244a984cd3967b89a5788.png

表order_items:

e944888fc26c47088f590a88c556b8be.png

#创建数据库
CREATE DATABASE `test01_bookstore` CHARACTER SET utf8;
USE `test01_bookstore`;
#创建表
CREATE TABLE `books` (
  `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NOT NULL,
  `author` VARCHAR(100) NOT NULL,
  `price` DOUBLE(11,2) NOT NULL,
  `sales` INT(11) NOT NULL,
  `stock` INT(11) NOT NULL,
  `img_path` VARCHAR(100) NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
/*Data for the table `books` */
INSERT  INTO `books`(`id`,`title`,`author`,`price`,`sales`,`stock`,`img_path`) VALUES 
(1,'解忧杂货店','东野圭吾',27.20,102,98,'upload/books/解忧杂货店.jpg'),
(2,'边城','沈从文',23.00,102,98,'upload/books/边城.jpg'),
(3,'中国哲学史','冯友兰',44.50,101,99,'upload/books/中国哲学史.jpg'),
(4,'忽然七日',' 劳伦',19.33,101,99,'upload/books/忽然七日.jpg'),
(5,'苏东坡传','林语堂',19.30,100,100,'upload/books/苏东坡传.jpg'),
(6,'百年孤独','马尔克斯',29.50,100,100,'upload/books/百年孤独.jpg'),
(7,'扶桑','严歌苓',19.80,100,100,'upload/books/扶桑.jpg'),
(8,'给孩子的诗','北岛',22.20,100,100,'upload/books/给孩子的诗.jpg'),
(9,'为奴十二年','所罗门',16.50,100,100,'upload/books/为奴十二年.jpg'),
(10,'平凡的世界','路遥',55.00,100,100,'upload/books/平凡的世界.jpg'),
(11,'悟空传','今何在',14.00,100,100,'upload/books/悟空传.jpg'),
(12,'硬派健身','斌卡',31.20,100,100,'upload/books/硬派健身.jpg'),
(13,'从晚清到民国','唐德刚',39.90,100,100,'upload/books/从晚清到民国.jpg'),
(14,'三体','刘慈欣',56.50,100,100,'upload/books/三体.jpg'),
(15,'看见','柴静',19.50,100,100,'upload/books/看见.jpg'),
(16,'活着','余华',11.00,100,100,'upload/books/活着.jpg'),
(17,'小王子','安托万',19.20,100,100,'upload/books/小王子.jpg'),
(18,'我们仨','杨绛',11.30,100,100,'upload/books/我们仨.jpg'),
(19,'生命不息,折腾不止','罗永浩',25.20,100,100,'upload/books/生命不息.jpg'),
(20,'皮囊','蔡崇达',23.90,100,100,'upload/books/皮囊.jpg'),
(21,'恰到好处的幸福','毕淑敏',16.40,100,100,'upload/books/恰到好处的幸福.jpg'),
(22,'大数据预测','埃里克',37.20,100,100,'upload/books/大数据预测.jpg'),
(23,'人月神话','布鲁克斯',55.90,100,100,'upload/books/人月神话.jpg'),
(24,'C语言入门经典','霍尔顿',45.00,100,100,'upload/books/C语言入门经典.jpg'),
(25,'数学之美','吴军',29.90,100,100,'upload/books/数学之美.jpg'),
(26,'Java编程思想','埃史尔',70.50,100,100,'upload/books/Java编程思想.jpg'),
(27,'设计模式之禅','秦小波',20.20,100,100,'upload/books/设计模式之禅.jpg'),
(28,'图解机器学习','杉山将',33.80,100,100,'upload/books/图解机器学习.jpg'),
(29,'艾伦图灵传','安德鲁',47.20,100,100,'upload/books/艾伦图灵传.jpg'),
(30,'教父','马里奥普佐',29.00,100,100,'upload/books/教父.jpg');
CREATE TABLE `users` (
  `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(100) UNIQUE KEY NOT NULL,
  `password` VARCHAR(100) NOT NULL,
  `email` VARCHAR(100) DEFAULT NULL
) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `users` */
INSERT  INTO `users`(`id`,`username`,`password`,`email`) VALUES
 (1,'admin1',SHA('123456'),'admin1@gmail.com'),
 (2,'admin2',SHA('123456'),'admin2@gmail.com'),
 (3,'admin3',SHA('123456'),'admin3@gmail.com'),
 (4,'chai',SHA('123456'),'chai@gmail.com');
CREATE TABLE `orders` (
  `id` VARCHAR(100) PRIMARY KEY NOT NULL,
  `order_time` DATETIME NOT NULL,
  `total_count` INT(11) NOT NULL,
  `total_amount` DOUBLE(11,2) NOT NULL,
  `state` INT(11) NOT NULL,
  `user_id` INT(11) NOT NULL,
  CONSTRAINT `orders_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
/*Data for the table `orders` */
INSERT  INTO `orders`(`id`,`order_time`,`total_count`,`total_amount`,`state`,`user_id`) VALUES 
('15275760194821','2018-05-29 14:40:19',4,114.03,2,1),
('15294258455691','2018-06-20 00:30:45',2,50.20,0,1);
CREATE TABLE `order_items` (
  `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `count` INT(11) NOT NULL,
  `amount` DOUBLE(11,2) NOT NULL,
  `title` VARCHAR(100) NOT NULL,
  `author` VARCHAR(100) NOT NULL,
  `price` DOUBLE(11,2) NOT NULL,
  `img_path` VARCHAR(100) NOT NULL,
  `order_id` VARCHAR(100) NOT NULL,
  CONSTRAINT `order_items_orders_id_fk` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*Data for the table `order_items` */
INSERT  INTO `order_items`
(`id`,`count`,`amount`,`title`,`author`,`price`,`img_path`,`order_id`) VALUES 
(1,1,27.20,'解忧杂货店','东野圭吾',27.20,'static/img/default.jpg','15275760194821'),
(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15275760194821'),
(3,1,44.50,'中国哲学史','冯友兰',44.50,'static/img/default.jpg','15275760194821'),
(4,1,19.33,'忽然七日',' 劳伦',19.33,'static/img/default.jpg','15275760194821'),
(5,1,27.20,'解忧杂货店','东野圭吾',27.20,'static/img/default.jpg','15294258455691'),
(6,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15294258455691');

4、使用JDBC实现往用户表中添加1个用户,注意密码存储使用mysql的SHA()函数进行加密

1f9bd2f7cecf469185e446c496283bf7.png

b56aac67f1af4b188718ce18e045ed61.png


jdbc1.properties文件位于src目录下

user=root
password=root
url=jdbc:mysql://localhost:3306/test01_bookstore
driverClass=com.mysql.jdbc.Driver


    //TODO 使用JDBC实现往用户表中添加1个用户,注意密码存储使用mysql的SHA()函数进行加密
    @Test
    public void test1() throws Exception {
        Scanner s = new Scanner(System.in);
        System.out.println("username:");
        String username = s.next();
        System.out.println("password:");
        String pwd = s.next();
        System.out.println("email:");
        String email = s.next();
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql = "insert into users(id,username,password,email) values(null,?,SHA(?),?)";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, username);
        ps.setString(2, pwd);
        ps.setString(3, email);
        int i = ps.executeUpdate();
        System.out.println(i > 0 ? "添加成功" : "添加失败");
        System.out.println("录入成功!");
        ps.close();
        conn.close();
    }

5、使用JDBC实现往图书表中添加1本图书

    //通用的增删改操作
    public static void update(String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps= null;
        try {
            // 1.读取配置文件中的4个基本信息
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
            Properties pros = new Properties();
            pros.load(is);
            String user = pros.getProperty("user");
            String password = pros.getProperty("password");
            String url = pros.getProperty("url");
            String driverClass = pros.getProperty("driverClass");
            // 2.加载驱动
            Class.forName(driverClass);
            // 3.获取连接
            conn = DriverManager.getConnection(url, user, password);
            //4.预编译sql语句,返回PreparedStatement的实例
ps= conn.prepareStatement(sql);
            //5.填充占位符
for (int i =0; i < args.length; i++) {
ps.setObject(i +1, args[i]);
            }
            //6.执行操作
ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.资源的关闭
            try {
if (ps != null)
ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //TODO 使用JDBC实现往图书表中添加1本图书
    @Test
    public void test2() {
        Scanner s = new Scanner(System.in);
        System.out.println("title:");
        String title = s.next();
        System.out.println("author:");
        String author = s.next();
        System.out.println("price:");
        String price = s.next();
        System.out.println("sales:");
        String sales = s.next();
        System.out.println("stock:");
        String stock = s.next();
        System.out.println("img_path:");
        String img_path = s.next();
        String sql ="insert into books(title,author,price,sales,stock,img_path)"+"values(?,?,?,?,?,?)";
        update(sql, title, author, price, sales, stock, img_path);
        System.out.println("录入成功!");
    }

6、从键盘输入用户名和密码,模拟登录,使用JDBC实现验证用户名和密码是否正确,如果正确,显示登录成功,否则显示用户名或密码错误



ab2dc5c015154ee0b716181cc396960d.png


4e4036f2f7d94be5a731288207fc148c.png

    // TODO 从键盘输入用户名和密码,模拟登录,使用JDBC实现验证用户名和密码是否正确,如果正确,显示登录成功,否则显示用户名或密码错误
    @Test
    public void test3() throws Exception {
        System.out.println("请登录");
        System.out.println("请输入用户名:");
        Scanner scanner = new Scanner(System.in);
        String username = scanner.next();
        System.out.println("请输入密码:");
        String pwd = scanner.next();
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="select * from users where username=? and password=SHA(?)";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, pwd);
        ResultSet resultSet =ps.executeQuery();
if (resultSet.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败,用户名或密码错误");
        }
        resultSet.close();
ps.close();
        conn.close();
        scanner.close();
    }

7、使用JDBC实现查询所有图书信息

    // TODO 7、使用JDBC实现查询所有图书信息
    @Test
    public void test4() throws Exception {
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="select `id`,`title`,`author`,`price`,`sales`,`stock`,`img_path` from books";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
        //5、执行sql
        ResultSet rs =ps.executeQuery();
while (rs.next()) {
for (int i =1; i <=7; i++) {
                System.out.println(rs.getObject(i) +"\t");
            }
            System.out.println();
        }
        //6、关闭
        rs.close();
ps.close();
        conn.close();
    }

8、使用JDBC实现查询销量最大的图书信息

    // TODO 使用JDBC实现查询销量最大的图书信息
    @Test
    public void test5() throws Exception {
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="select * from books where sales = (select max(sales) from books)";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
        //5、执行sql
        ResultSet rs =ps.executeQuery();
while (rs.next()) {
for (int i =1; i <=7; i++) {
                System.out.println(rs.getObject(i) +"\t");
            }
            System.out.println();
        }
        //6、关闭
        rs.close();
ps.close();
        conn.close();
    }

9、使用JDBC实现修改库存量小于10本的图书的库存量为100

    //TODO 使用JDBC实现修改库存量小于10本的图书的库存量为100
    @Test
    public void test6() throws Exception {
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="UPDATE books SET stock=100 WHERE stock<10";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
        //5、执行sql
        int i =ps.executeUpdate();
        System.out.println(i > 0 ? "修改成功" : "修改失败");
        //6、关闭
ps.close();
        conn.close();
    }

10、从键盘输入用户名,实现查询该用户的订单和订单明细

    //TODO 从键盘输入用户名,实现查询该用户的订单和订单明细
    @Test
    public void test7() throws Exception {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = input.next();
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="SELECT * FROM order_items INNER JOIN orders ON order_items.order_id = orders.id WHERE user_id = (SELECT id FROM users WHERE username = ?)";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
        //5、执行sql
        ResultSet rs =ps.executeQuery();
while (rs.next()) {
for (int i =1; i <=14; i++) {
                System.out.println(rs.getObject(i) +"\t");
            }
            System.out.println();
        }
        //6、关闭
        rs.close();
ps.close();
        conn.close();
        input.close();
    }

11、使用JDBC实现删除订单“15275760194821”的相关信息,注意涉及到两张表

    //TODO 使用JDBC实现删除订单“15275760194821”的相关信息,注意涉及到两张表
    @Test
    public void test8() throws Exception {
        // 1.读取配置文件中的4个基本信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc1.properties");
        Properties pros = new Properties();
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        String url = pros.getProperty("url");
        String driverClass = pros.getProperty("driverClass");
        // 2.加载驱动
        Class.forName(driverClass);
        // 3.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql ="DELETE FROM orders WHERE id=15275760194821";
        //4.预编译sql语句,返回PreparedStatement的实例
        PreparedStatement ps= conn.prepareStatement(sql);
        //5、执行sql
        int i =ps.executeUpdate();
        System.out.println(i > 0 ? "删除成功" : "删除失败");
        //6、关闭
ps.close();
        conn.close();
    }

END

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
Java 关系型数据库 数据库连接
实时计算 Flink版操作报错之在使用JDBC连接MySQL数据库时遇到报错,识别不到jdbc了,怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
26天前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据
|
4天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
11 1
|
4天前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
10 0
|
17天前
|
SQL Java 关系型数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
14 0
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-案例练习-DQL基本介绍&语法&执行顺序(代码演示)
【MySQL】DQL-案例练习-DQL基本介绍&语法&执行顺序(代码演示)
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-条件查询语句全解(附带代码演示&案例练习)
【MySQL】DQL-条件查询语句全解(附带代码演示&案例练习)
|
26天前
|
SQL Java 关系型数据库
JDBC批量插入mysql数据
JDBC批量插入mysql数据
|
26天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
26天前
|
JSON 前端开发 Java
管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)
管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)