(一)IDEA使用JDBC连接数据库及几个对象的详解

概念

  • 概念:Java DataBase Connectivity 数据库连接,Java语言操作数据库
  • 本质:定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这些接口,提供数据库驱动的jar包,我们可以用这套接口(JDBC)编程,真正执行的代码是jar包中的实现类。

快速入门

步骤

  1. 导入驱动jar包(下载地址
  2. 注册驱动
  3. 获取数据库连接对象(Connection)
  4. 定义sql
  5. 获取执行sql语句的对象Statement
  6. 执行sql
  7. 处理结果
  8. 释放资源

驱动导入

(1)在项目下新建一个文件夹libs,复制mysql-connector-java-5.1.49-bin.jar到项目的libs目录下
(2)右键文件夹–>Add as Library*/
在这里插入图片描述
在这里插入图片描述

实现

在 数据库world中原有的一个表:在这里插入图片描述

插入一条数据:

package cn.itcast.jdbc;

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

public class jdbcDemo1 {
    public static void main(String[] args) throws Exception {
      /*  1、导入jar包:mysql-connector-java-5.1.49-bin.jar
                
        //2、注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //3、获取数据库的连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world","root","xiao123");

        //4、定义sql语句
        String sql = "insert into student values (03,'Tony')";

        //5、获取执行sql的对象statement
        Statement stmt = conn.createStatement();

        //6、执行sql
        int count = stmt.executeUpdate(sql);

        //7、处理结果
        System.out.println(count);

        //8、释放资源
        stmt.close();
        conn.close();
    }
}

代码运行成功:
在这里插入图片描述
在这里插入图片描述

往表中添加一条数据

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

/*
    往表student中添加一条记录
 */
public class jdbcDemo2 {
    public static void main(String[] args) {
        Statement stmt = null;
        Connection conn = null;
        //1、注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
        //2、定义sql
            String sql="insert student values(4,'Cater')";
        //3、获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");
        //4、获取执行sql的对象 Statement
            stmt = conn.createStatement();
        //5、执行sql
            int count = stmt.executeUpdate(sql);       //返回影响的行数
        //6、处理结果
            System.out.println(count);
            if (count > 0){
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失败!");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            //stmt.close;  stmt在try的作用域中,在finally中看不到stmt,需要提升stmt的作用域
            //执行到步骤三时,可能会报错,这样后面的代码不会执行,直接进入到catch中,此时stmt为null,stmt.close会造成空指针异常
            //为了避免空指针异常
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                   e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
         }
    }
}

修改表

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

/*
    修改student表
*/
public class jdbcDemo3 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        //1、注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");
        //3、定义sql
            String sql = "update student set id = 4 where name =Tony ";
        //4、获取执行sql对象
            stmt = conn.createStatement();
        //5、执行sqlr
            int count = stmt.executeUpdate(sql);
        //6、处理结果
            System.out.println(count);
            if (count > 0 ){
                System.out.println("修改成功!");
            }else{
                System.out.println("修改失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //7、释放资源
        finally {
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                  e.printStackTrace();
                }
            }
        }
    }

}

详解出现的几个对象:

  1. DriverManager:驱动管理对象
  2. Connection:数据库连接对象
  3. Statement:执行sql的对象
  4. ResultSet:结果集对象
  5. PrepareStatement:执行sql的对象(功能比Statement更加强大)

DriverManager

功能

  • 注册驱动
static void registerDriver(Driver driver) :注册与给定的驱动程序DriverManager
class.forName("com.mysql.jdbc.Driver")    写代码时使用

通过查看源码,发现在com.mysql.jdbc.Driver类中存在静态代码块
在这里插入图片描述
所以,实际注册驱动的是DriverManager , class.forName(“com.mysql.jdbc.Driver”)这样写不过是简写。
由图可知在service中已经注册好Driver
由图可知在service中已经注册好Driver
在MySQL5之后的驱动jar包可自动注册驱动,所以MySQL5之后的可以省略注册驱动的步骤

  • 获取数据库连接
    1. 方法:static Connection getConnection(String url,String user,String password),方法名是getConnection,返回一个Connection对象
    2. 参数:url—指定路径,语法:jdbc://mysql://ip地址(或域名):端口号/数据库名称。如果连接的是本机的MySQL服务器,并且MySQL服务器端口为默认端口号3306,url可以简写为:jdbc:mysql:///数据库名称,user和password就没什么可说的了。

Connection:数据库连接对象

功能

  1. 获取执行的sql对象
    上文中
    Statement stmt = conn.createStatement();
    int count = stmt.executeUpdate(sql);
    createStatement可返回Statement,Statement可执行相应的sql语句executeUpdate(sql),除此之外,还存在方法:
  • Statement createment()
  • Prepare Statement prepareStatement(String sql)
  1. 管理事务(第二篇文章):
  • 开启事务:void setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务
  • 提交事务:Commit()
  • 回滚事务:rollback()

Statement:执行sql的对象

  1. 功能:
    1. 执行sql
      1. boolean execute(String sql):可以执行任意的sql(了解即可,并不常用)
      2. int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL语句(create、alter、drop),返回值是影响的行数,返回值>0则执行成功,反之失败
      3. Resultset executeQuery(String sql) : 执行DQL(select)语句
package cn.itcast.jdbc;

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

/*
    DDL
*/
public class jdbcDemo5 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        //1、注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");
            //3、定义sql
            String sql = "create table employee (id int,name varchar(20))";
            //4、获取执行sql对象
            stmt = conn.createStatement();
            //5、执行sqlr
            int count = stmt.executeUpdate(sql);
            //6、处理结果
            System.out.println(count);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //7、释放资源
        finally {
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

ResultSet:结果集对象,封装查询结果

  • boolean next():游标向下移动一行,判断当前行是否有数据,如果有数据,返回false,没有数据则返回true.
  • getXxx(参数):获取数据,Xxx为所获取数据的数据类型;
    参数:
    1、int:代表列的编号,从1开始 如:getString(1) 代表从第一列开始
    2、String:代表列的名称,如:getString(“name”)
package cn.itcast.jdbc;

import java.sql.*;

/*
    ResultSet中两个方法的使用
*/
public class jdbcDemo6 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1、注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");
            //3、定义sql
            String sql = "select * from student";
            //4、获取执行sql对象
            stmt = conn.createStatement();
            //5、执行sqlr
           rs = stmt.executeQuery(sql);
            //6、处理结果
            //6.1  让光标向下移动一行
            rs.next();
            //6.2   获取数据
            int id = rs.getInt(1);
            String name = rs.getString("name");

            System.out.println(id);
            System.out.println(name);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //7、释放资源
        finally {
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

package cn.itcast.jdbc;

import java.sql.*;

/*
    遍历结果集
*/
public class jdbcDemo7 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1、注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");
            //3、定义sql
            String sql = "select * from student";
            //4、获取执行sql对象
            stmt = conn.createStatement();
            //5、执行sqlr
            rs = stmt.executeQuery(sql);
            //6、处理结果
             /* //6.1  让光标向下移动一行
            if (rs.next()){     //判断是否有数据
                int id = rs.getInt(1);
                String name = rs.getString("name");

                System.out.println(id);
                System.out.println(name);
            }
            //6.2   获取数据*/
            while(rs.next()){
                //循环判断结果集是否有下一行
                //获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");

                System.out.println(id);
                System.out.println(name);
            }




        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //7、释放资源
        finally {
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

JDBC工具类(util)

目的:简化书写
分析:

  1. 注册驱动
  2. 抽取一个方法获取连接对象
  3. 抽取一个方法,释放资源
    在这里插入图片描述
url=jdbc:mysql:///world
user=root
password=xiao123
driver=com.mysql.jdbc.Driver
package cn.itcast.jdbc;

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

/*
    JDBC工具类Utils
 */
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();
            //2、加载文件
            pro.load(new FileReader("src/JDBCUtils.properties"));
            //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();
        }
    }
    /*
    获取连接,返回连接对象
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /*
        释放资源
     */
    public static void close(ResultSet rs,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();
            }
        }
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 //2、获取连接对象
           /*Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///world","root","xiao123");*/
            jdbcUtils.getConnection();
finally {
            /*if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }*/
            jdbcUtils.close(rs,stmt,conn);
        }

PreparementStatement:执行SQL的对象

  1. SQL注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全性问题

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

  1. 解决:使用PrepareStatement对象
  2. 预编译的SQL:参数使用?作为占位符
  3. 使用步骤
    1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
    2. 注册驱动
    3. 获取数据库连接对象(Connection)
    4. 定义sql
    注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
    5. 获取执行sql语句的对象PrepareStatement,调用Connection.prepareStatement(String sql)
    6. 给?赋值:
    方法:setXxx(参数1(?的位置),参数2(?的值))
    7. 执行sql,接受返回结果,不需要传递sql语句
    8. 处理结果
    9. 释放资源
  4. 后期大多使用PrepareStatement来完成增删改查所有操作,可防止SQL注入,而且效率更高
package cn.itcast.jdbc;

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

/*
    练习:
        1、通过键盘录入用户名和密码
        2、判断用户是否登录成功
 */
public class jdbcDemo8 {

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

        //2、调用方法,ctrl + alt + v可快速生成对象
        boolean flag = new jdbcDemo8().login2(username, password);
        //3、判断结果,输出不同语句
        if (flag){
            System.out.println("登录成功");
        }else{
            System.out.println("用户名或密码错误!");
        }
    }



    /*
        登录方法
     */
    public boolean login(String username, String password){
        if (username == null && password == null){
            return false;
        }

        //连接数据库是否登录成功
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1、获取连接
        try {
            conn = jdbcUtils.getConnection();
        //2、定义SQL
            String sql = "select * from user where username = '"+username+"' and password = '”+password+“'";
        //3、获取执行sql的对象
           stmt = conn.createStatement();
        //4、执行查询
           rs = stmt.executeQuery(sql);
        //5、判断
           /* if (rs.next()){     //如果有下一行则返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();    //如果有下一行则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.close(rs,stmt,conn);
        }
        return false;
    }


  /*  登录方法2 */
    public boolean login2(String username, String password){
        if (username == null && password == null){
            return false;
        }

        //连接数据库是否登录成功
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //1、获取连接
        try {
            conn = jdbcUtils.getConnection();
            //2、定义SQL
            String sql = "select * from user where username = ? and password = ?";
            //3、获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            //给?赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4、执行查询,不需要传参
            rs = pstmt.executeQuery();
            //5、判断
           /* if (rs.next()){     //如果有下一行则返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();    //如果有下一行则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            jdbcUtils.close(rs,pstmt,conn);
        }
        return false;
    }
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在IntelliJ IDEA中通过JDBC连接数据库,可以按照以下步骤进行操作: 1. 打开IntelliJ IDEA,创建一个新的Java项目。 2. 在项目中添加数据库驱动依赖。可以使用Maven管理依赖,在项目的pom.xml文件中添加相应的依赖项。例如,如果需要连接MySQL数据库,可以添加以下依赖: ```xml <dependencies> <!-- MySQL Connector/J --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> </dependencies> ``` 3. 在代码中编写数据库连接代码。首先,导入JDBC相关的类: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; ``` 然后,在代码中创建数据库连接,示例如下: ```java public class Main { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; // 创建连接对象 try (Connection conn = DriverManager.getConnection(url, username, password)) { // 连接成功,可以进行数据库操作 // ... } catch (SQLException e) { e.printStackTrace(); } } } ``` 请确保将`url`、`username`和`password`替换为实际的数据库连接信息。 4. 运行代码,如果一切配置正确,应该能够成功连接数据库。 以上是在IntelliJ IDEA中通过JDBC连接数据库的基本步骤。你可以根据具体的数据库类型和需求进行相应的配置和操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值