0
点赞
收藏
分享

微信扫一扫

day36_jdbc

程序猿不脱发2 2023-05-10 阅读 65

今日内容

零、 复习昨日

一、引言


1.1 如何操作数据库

客户端操作数据库步骤
image-20230316181353316

1.2 实际开发中,会采用客户端操作数据库吗?

二、JDBC


2.1 什么是 JDBC?

2.2 JDBC 核心思想

核心思想
image-20230316181411600

2.2.1 MySQL 数据库驱动

2.3 环境搭建

mysql厂商提供的jdbc规范的实现,要想完成JDBC操作,就需要将驱动包加入到当前项目中.

2.3.1 方式1:复制粘贴

在项目名下创建文件夹lib
image-20221121105646545
命名为lib
image-20221121105703497
将mysql驱动包复制粘贴到此处
image-20221121105753513
添加驱动包为当前项目的类库
image-20221121110032950

2.3.2 方式2:idea导入类库

打开项目结构(Project Structure)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ppjLhrMS-1683686915035)(C:/Users/qiush/AppData/Roaming/Typora/typora-user-images/image-20230320105013907.png)]
选择libraries,添加jar包
image-20221121111310058
本地磁盘选择jar包
image-20221121111402075
应用生效
image-20221121111442727
下方,External查看导入类库
image-20221121111616446

三、JDBC编程

3.1 注册驱动

Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.7版本 加载驱动

3.2 连接数据库

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC   ", "root","1234");
  • URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成

3.3 获取发送 SQL 的对象

Statement statement = conn.createStatement();

3.4 执行SQL 语句

String sql ="INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',4000,10000);";

int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
  • 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’
  • DML 语句:增删改时,返回受影响行数(int 类型)。
  • DQL 语句:查询时,返回结果数据(ResultSet 结果集)。

3.5 处理结果

if(result == 1){
	System.out.println("Success");
}
  • 受影响行数:逻辑判断、方法返回。
  • 查询结果集:迭代、依次获取。

3.6 释放资源

statement.close();
conn.close();

3.7 案例

准备数据库表,进行CRUD.

create table tb_user(
 id int(11) primary key auto_increment comment '用户编号',
 username varchar(10) comment '用户名',
 password varchar(10) comment '密码',
 phone varchar(11) comment '手机号',
 createTime date comment '注册时间',
 money double(10,2) comment '账户余额',
 sex int(1) comment '性别 1男2女'
);

需求: 使用JDBC完成对tb_user表插入数据


package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示JDBC
 */
public class Demo1_insert {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 1 加载驱动
        // ps: 利用反射技术,将驱动类加载到JVM
        Class.forName("com.mysql.jdbc.Driver");

        // 2 通过驱动管理对象获得连接对象
        /**
         * 参数1 url: 数据库连接的地址
         *    协议://ip:端口/库名
         * 参数2 username: 数据库用户名
         * 参数3 password: 数据库密码
         */
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3 通过连接对象,创建执行sql语句的对象
        Statement statement = conn.createStatement();

        // 4 通过执行语句对象,执行sql,获得结果
        String sql = "insert into tb_user (id,username,password,phone,createTime,money,sex) values (2,'root','123456','1122200','2022-11-21',2000.0,2)";
        // 执行查询,是executeQuery()
        // 执行增删改,是executeUpdate(),返回受影响的行数
        int num = statement.executeUpdate(sql);

        if (num > 0) {
            System.out.println("插入成功!!" );
        }

        // 5 关流
        statement.close();
        conn.close();

    }
}

四、完成增删改

4.1 插入

参考入门案例

4.2 更新

任何的JDBC都是那5个步骤.

package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 更新
 */
public class Demo2_update {

    public static void main(String[] args) throws Exception {

        // 1 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2 通过驱动管理对象获得连接对象
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 3 通过连接对象创建执行语句对象
        Statement statement = conn.createStatement( );

        // 4 通过执行语句对象执行sql,获得结果
        String sql = "update tb_user set username = '小孟', phone = '666666' where id = 3";
        int num = statement.executeUpdate(sql);

        if (num > 0) {
            System.out.println("更新成功!" );
        }

        // 5 将对象的流关闭
        statement.close();
        conn.close();
    }
}

4.3 删除

public class Demo3_delete {

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");

        Statement statement = conn.createStatement( );

        int num = statement.executeUpdate("delete from tb_user where id = 3");

        if (num > 0) {
          System.out.println("删除成功!");
        }

        statement.close();
        conn.close();
    }
}

五、查询结果集ResultSet【重要】

package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 查询
 */
public class Demo4_select {

    public static void main(String[] args) throws Exception {

        Class.forName("com.mysql.jdbc.Driver");

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");

        Statement statement = conn.createStatement( );

        String sql = "select id,username,password from tb_user";
        // 执行查询的方法executeQuery,方法返回值是ResultSet
        ResultSet rs = statement.executeQuery(sql);
        /**
         * ResultSet 内部包含了整个查询返回的虚拟表数据
         * 内部提供了方法可以操作结果集
         * boolean next(); 判断结果集有没有下一行数据,返回false,即没有下一行数据返回
         *                 true就是有下一行数据,此时就可以进入取值
         * getObject()                获得数据,返回值是Object
         * getInt/getString/getDate() 获得数据,返回对应数据类型
         * --------------------------------------
         * getXxx(int columnIndex)  通过列下标获得对应Xxx数据类型的数据
         *                         下标从1开始,顺序是按照查询返回虚拟表顺序
         * getXxx(String columnLabel)  通过列名获得对应Xxx数据类型的数据
         *                         根据虚拟表列名,如果有别名那就是别名
         */
        while (rs.next()) {
            // 通过列下标获得数据
            // int id =  rs.getInt(2);
            // String username = rs.getString(1);

            // 通过列名获得数据 【推荐】
            int id = rs.getInt("id");
            String username = rs.getString("username");
            System.out.println(id + "-" + username);
        }

        statement.close();
        conn.close();
    }

}

image-20221121164359945

六、登录案例【重要】

package com.qf.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo5_Login {

    public static void main(String[] args) {

        // 1 输入用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:" );
        String username = scanner.nextLine( );

        System.out.println("请输入密码:" );
        String password = scanner.nextLine( );

        // 2 根据用户名和密码查人
       boolean isOk =  findUserByLogin(username,password);

        // 3 结果
        if (isOk) {
            System.out.println("登录成功!" );
        } else {
            System.out.println("用户名或密码错误!" );
        }
    }

    // 使用捕获代码完成
    private static boolean findUserByLogin(String username, String password) {
        Connection conn = null;
        Statement statement = null;
        boolean isOk = false;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useSSL=false", "root", "123456");

            statement = conn.createStatement( );

            // 根据用户名和密码查询,注意字符串拼接.特别注意单引号
            ResultSet rs = statement.executeQuery("select * from tb_user where username = '"+username+"' and password = '"+password+"'");

            // 只要有值,就说明数据库有这个信息,登录成功
            if (rs.next()) {
               // System.out.println("登录成功!" );
                int id = rs.getInt("id");
                String uname= rs.getString("username");
                // ...

                System.out.println(id+"-"+username);
                isOk = true;
            } else {
               // System.out.println("用户名或密码错误!!" );
            }
        }catch (Exception e) {
            System.out.println("SQL操作出错!" );
            e.printStackTrace();// 打印异常
        } finally {
            try{
                statement.close();
                conn.close();
            }catch (Exception e) {
                System.out.println("关流异常" );
                e.printStackTrace();// 打印异常
            }
        }
        return isOk;
    }
}

七、ORM【重要】

7.1 什么是ORM

7.2 实体类

package com.qf.model; // 包
public class User {   // 实体类,是表名
	// 属性是字段名
    private int id;
    private String username;
    private String password;
    private String phone;
    private Date createTime;
    private double money;
    private int sex;
    
    // setter getter...
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoGLG5sN-1683686914087)(…/…/…/…/Java2217/阶段2/day43/笔记/day43_jdbc.assets/image-20221122160619448.png)]

7.3 ORM改造登录案例

package com.qf.jdbc;

import com.qf.model.User;

import java.sql.*;
import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 使用orm改造login登录案例
 */
public class Demo6_login_orm {
    public static void main(String[] args) {
        input();
    }
    // 1 键盘输入
    public static void input() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine( );

        System.out.println("请输入密码:");
        String password = scanner.nextLine( );

        // 调用方法执行查询
        User user = findUserByUsernameAndPassword(username, password);

        if (user != null) {
            System.out.println("用户登录成功" );
            System.out.println("用户信息: " + user );
        } else {
            System.out.println("用户名或密码错误!" );
        }
    }

    // 2 执行登录
    public static User findUserByUsernameAndPassword(String username, String password) {
        Connection conn = null;
        Statement s = null;
        ResultSet rs = null;
        // 声明user,赋值为null,下方如果登录成功,创建user对象
        // 即将来,可以通过user是否为空判断是否登录成功
        User user = null;
        try {
            // 1 驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2 连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");
            // 3 语句
            s = conn.createStatement( );

            // 4 查询
            String sql = "select * from tb_user where username = '"+username+"' and password = '"+password+"'";

            // 执行
            rs = s.executeQuery(sql);

            // 判断成功,说明查询到用户
            if (rs.next()) {
                // 取出数据
                int id = rs.getInt("id");
                String username1 = rs.getString("username");
                String password1 = rs.getString("password");
                String phone = rs.getString("phone");
                Date createTime = rs.getDate("createTime");
                double money = rs.getDouble("money");
                int sex = rs.getInt("sex");

                // 封装数据
                user = new User();
                user.setId(id);
                user.setUsername(username1);
                user.setPassword(password1);
                user.setPhone(phone);
                user.setCreateTime(createTime);
                user.setMoney(money);
                user.setSex(sex);
            }

        } catch (Exception e) {
            System.out.println("出错了!" + e.getMessage( ));
        } finally {

            // 5 关流
            try {
                rs.close();
                s.close( );
                conn.close( );

            } catch (SQLException e) {
                System.out.println("关流时有异常" + e.getMessage( ));
            }
        }
        return user;
    }
}

7.4 ORM完成注册

package com.qf.jdbc;

import com.qf.model.User;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo7_insert_orm {

    public static void main(String[] args) {

        User user = new User( );
        user.setUsername("王五");
        user.setPassword("123456");
        user.setPhone("110");
        user.setCreateTime(new Date( ));
        user.setMoney(2800.0);
        user.setSex(2);

        insert(user);

    }

    // 注册
    public static void insert(User user) {
        Connection conn = null;
        Statement s = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");
            s = conn.createStatement( );

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String date = sdf.format(user.getCreateTime( ));

            String sql = "insert into tb_user (username,password,phone,createTime,money,sex) " +
                    "values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+date+"',"+user.getMoney()+","+user.getSex()+")";

            System.out.println("拼接后的sql ---> " + sql );
            int num = s.executeUpdate(sql);
            System.out.println(num > 0 ? "插入成功":"插入失败" );

        } catch (Exception e) {
            e.printStackTrace( );
        }
    }
}
举报

相关推荐

0 条评论