MySQL—JDBC

Posted 超霸霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL—JDBC相关的知识,希望对你有一定的参考价值。

JDBC

一、简介

  • 概念:Java DataBase Connectivity,Java数据库连接,Java语言操作

  • 本质:是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

  • 步骤:

    1. 导入驱动jar包 mysql -connector -java-5.1.37-bin.jar
      • 复制mysql -connector -java-5.1.37-bin.jar到项目的libs目录下
      • 右键->Add As Library
    2. 注册驱动
    3. 获取数据库连接对象Connection
    4. 定义sql
    5. 获取执行sql语句的对象Statement
    6. 执行sql,接收返回结果
    7. 处理结果
    8. 释放资源
  • 快速入门

    package cn.chao.web;
    
    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包
            //2.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //3.获取数据库连接对象
            Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","password");
            //4.定义sql语句
            String sql="update emp set job_id = 1 where id = 100";
            //5.获取执行sql的对象Statement
            Statement stmt =connection.createStatement();
            //6.执行sql
            int count=stmt.executeUpdate(sql);
            //7.处理结果
            System.out.println(count);
            //8.释放资源
            stmt.close();
            connection.close();
        }
    }
    

二、各个对象的详解

  1. DriverManager:驱动管理对象

    1. 注册驱动,告诉程序应该使用哪一个数据库驱动jar
      • static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager
      • 写代码使用:Class.forName("com.sql.jdbc.Driver");
      • mysql5之后的驱动jar包可以省略注册驱动的步骤
    2. 获取数据库连接
      • 方法:static Connection getConnection(String url,String user,String password)
      • 参数:
        1. url:指定连接的路径
          • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
          • 如果连接的是本机mysql服务器并且默认端口是3306,则url可以简写为jdbc:mysql:///数据库名称
        2. user:用户名
        3. password:密码
  2. Connection:数据库连接对象

    • 获取执行sql的对象
      1. Statement createStatement()
      2. PreparedStatement prepareStatement(String sql)
    • 管理事务
      1. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
      2. 提交事务:commit()
      3. 回滚事务:rollback()
  3. Statement:执行sql的对象

    • boolean execute(String sql):可以执行任意的sql
    • int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句,返回值是影响的行数
    • ResultSet executeQuery(String sql):执行DQL(select)语句
  4. ResultSet:结果集对象

    • next():游标向下移动一行
    • getXxx(参数):获取数据
      1. Xxx:代表数据类型 如:int getInt()String getString()
      2. 参数
        • int:代表列的编号,从1开始 ,如:getString(1)
        • String:代表列名称,如:getDouble("name")
      3. 注意:
        • 游标向下移动一行
        • 判断是否有数据
        • 获取数据
  5. PreparedStatement:执行sql的对象

    • SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接会造成安全性问题
      1. 随便输入用户名,输入密码:a' or 'a' = 'a
      2. sql:select * from user where username='assdf' and password= 'a' or 'a' ='a'
    • 解决sql注入问题:使用PreparedStatement对象来解决
    • 预编译的SQL:参数使用?作为占位符
    • 步骤
      1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
      2. 注册驱动
      3. 获取数据库连接对象Connection
      4. 定义sql,注意:sql的参数使用?作为占位符
      5. 获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
      6. 给?赋值
        • 方法:setXxx(参数1,参数2)
        • 参数1:?的编号,从1开始
        • 参数2:?的值
      7. 执行sql,接收返回结果,不需要传递sql语句
      8. 处理结果
      9. 释放资源
    • 后期都会使用PreparedStatement来完成增删改查的所有操作
      1. 可以防止SQL注入
      2. 效率更高

三、案例

1.insert练习

package cn.chao.web;

import sun.tracing.dtrace.DTraceProviderFactory;

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

//insert练习
public class jdbcDemo2 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection connection=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql="insert into dept values(50,'硬件部','长沙')";
            //3.获取Connection对象
            connection= DriverManager.getConnection("jdbc:mysql:///db1","root","root");
            //4.获取执行sql的对象statement
            stmt=connection.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 e){
            e.printStackTrace();
        }finally {
            //7.释放资源
            //避免空指针异常
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try{
                    connection.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

2.update练习

package cn.chao.web;

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

//update练习
public class jdbcDemo3 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection connection=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql="update dept set loc = '耒阳' where id = 50";
            //3.获取Connection对象
            connection= DriverManager.getConnection("jdbc:mysql:///db1","root","root");
            //4.获取执行sql的对象statement
            stmt=connection.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 e){
            e.printStackTrace();
        }finally {
            //7.释放资源
            //避免空指针异常
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try{
                    connection.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

3.delete练习

package cn.chao.web;

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

//delete练习
public class jdbcDemo4 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection connection=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql="delete from dept where id = 50";
            //3.获取Connection对象
            connection= DriverManager.getConnection("jdbc:mysql:///db1","root","root");
            //4.获取执行sql的对象statement
            stmt=connection.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 e){
            e.printStackTrace();
        }finally {
            //7.释放资源
            //避免空指针异常
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try{
                    connection.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

4.获取单行数据练习

package cn.chao.web;

import java.sql.*;

//获取单行数据练习
public class jdbcDemo5 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection connection=null;
        ResultSet rs=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql="select * from dept";
            //3.获取Connection对象
            connection= DriverManager.getConnection("jdbc:mysql:///db1","root","root");
            //4.获取执行sql的对象statement
            stmt=connection.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            //6.1 让游标向下移动一行
            rs.next();
            //6.2 获取数据
            int id=rs.getInt(1);
            String dname=rs.getString("dname");
            String loc=rs.getString("loc");
            System.out.println(id+"---"+dname+"---"+loc);
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            //7.释放资源
            //避免空指针异常
            if(rs!=null){
                try{
                    rs.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try{
                    connection.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

5.获取多行数据练习

package cn.chao.web;

import java.sql.*;

//获取多行数据练习
public class jdbcDemo6 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection connection=null;
        ResultSet rs=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql="select * from dept";
            //3.获取Connection对象
            connection= DriverManager.getConnection("jdbc:mysql:///db1","root","root");
            //4.获取执行sql的对象statement
            stmt=connection.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.处理结果
            while(rs.next()){
                //循环判断游标是否是最后一行
                int id=rs.getInt(1);
                String dname=rs.getString("dname");
                String loc=rs.getString("loc");
                System.out.println(id+"---"+dname+"---"+loc);
            }
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            //7.释放资源
            //避免空指针异常
            if(rs!=null){
                try{
                    rs.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try{
                    connection.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

6.查询所有emp对象(用JavaBean封装数据)

  • emp.class:
package domain;

import java.util.Date;

/*
 * 封装emp表数据的JavaBean
 */
public class Emp {
    private int id;
    private String ename;
    private int job_id;
    private int mgr;
    private Date joindate;
    private double salary;
    private double bonus;
    private int dept_id;

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", ename='" + ename + '\\'' +
                ", job_id=" + job_id +
                ", mgr=" + mgr +
                ", joindate=" + joindate +
                mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

如何在片段中填充列表视图?

面试常用的代码片段

jdbc连接数据库的代码问题jdbc连接mysql数据库

mysql连接jdbc查询代码

Mysql JDBC代码实例