JDBC-Java连接数据库

引言
有关数据库的概念,将数据库和java结合起来说明。
什么是JDBC?
使用java程序发送sql语句到数据库服务器端执行,这叫用到了JDBC技术!!!!jdbc是Oracle-Sun公司设计的一套专门用于java程序操作数据库的接口
如下图所示:
这里写图片描述
使用jdbc发送sql条件
连接mysql数据库:
数据库主机
端口
数据库用户名
数据库密码
连接的数据库
* JDBC的核心API*
Driver接口: 数据库驱动程序的接口,所有具体数据库厂商需要的驱动程序需要实现此接口。
Connection connect(String url, Properties info) 用于获取数据库连接
演示三种连接数据库的方式

package com.jdbc.a_driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import com.mysql.jdbc.Driver;
public class DriverStu {
    //jdbc协议:mysql协议://主机地址:端口号/需要连接的数据库名称
    private static String url="jdbc:mysql://localhost:3306/day20";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args) throws Exception {
        //conn1();
        //conn2();
        conn3();
    }
    private static void conn3() throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //连接数据库
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
        //com.mysql.jdbc.JDBC4Connection@6d17b6ce
    }
    private static void conn2() throws Exception {
        //使用驱动管理类,连管理我们的驱动程序,并获取连接
        //注册驱动
        Driver driver = new Driver();
        DriverManager.registerDriver(driver);
        //获取链接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
        //com.mysql.jdbc.JDBC4Connection@44e5f21e   
    }
    //直连
    private static void conn1() throws Exception {
        //创建一个驱动类对象Driver
        Driver dri = new com.mysql.jdbc.Driver();
        //获取java连接数据库的连接
        //Connection connect(String url,Properties info)throws SQLException
        //创建一个properties集合
        Properties prop = new Properties();
        prop.setProperty("user", user);
        prop.setProperty("password", password);
        Connection connect = dri.connect(url, prop);
        System.out.println(connect);
        //com.mysql.jdbc.JDBC4Connection@73b9e5dc
    }
}

相关的运行结果在代码中有注释。
后面为了方便与数据库进行连接,可以将与数据库连接的代码部分提取出来形成一个工具类,每一次与数据库建立连接时,只需要调用该类中的方法即可,该工具类如下所示

package com.jdbc.Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
    private static String url="jdbc:mysql://localhost:3306/day20";
    private static String user="root";
    private static String password="root";
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    //获取链接
    public static Connection getConn(){
        //注册驱动
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
    //释放资源
    public static void close(Connection conn,Statement stmt,ResultSet rs){
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

Connection接口:与具体的数据库的连接对象。
Statement createStatement() 创建一个静态sql语句对象
PreparedStatement prepareStatement(String sql) 创建预编译的sql语句对象
CallableStatement prepareCall(String sql) 创建存储过程的sql语句对象
Statement接口:用于执行静态 SQL 语句
int executeUpdate(String sql) 执行更新操作的sql语句 (create/alter/drop) DDL语句
(insert/update/delete)DML语句
ResultSet executeQuery(String sql) 执行查询操作的sql语句(select)(DQL查询语句)
相关代码如下(静态sql语句)

package com.jdbc.b_statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.jdbc.Util.JDBCUtil;
public class Stu_02 {
    private static String url="jdbc:mysql://localhost:3306/day20";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args) {
        //testInsert();//给数据库加入一条记录
        //testUpdate();//修改数据库的记录
        testDelet();//删除一条记录
    }
    private static void testDelet() {
        Connection conn=null;
        Statement stmt=null;
        try{
            //注册驱动,获取链接
            conn = JDBCUtil.getConn();
            //获取语句执行者
            stmt = conn.createStatement();
            //准备sql语句
            String sql="DELETE FROM student WHERE id=1;";
            //执行sql语句
            int i = stmt.executeUpdate(sql);
            System.out.println(i);
            //1
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
        }   
    }
    private static void testUpdate() {
        Connection conn=null;
        Statement stmt=null;
        try{
            //获取链接
         conn = JDBCUtil.getConn();
         //获取语句执行着
          stmt = conn.createStatement();
        //准备sql
          String sql="UPDATE student SET NAME='黄晓明' WHERE id=1;";
          //执行sql语句
          int i = stmt.executeUpdate(sql);
          System.out.println(i);//1
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
            JDBCUtil.close(conn, stmt, null);
        }   
    }
    private static void testInsert() {
        Connection conn=null;
        Statement stmt=null;
        //注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接对象
            conn = DriverManager.getConnection(url, user, password);
            //创建语句执行者
             stmt = conn.createStatement();
             //准备sql
             String sql="INSERT INTO student VALUES(1,'薛之谦');";
            //执行sql语句
             int i = stmt.executeUpdate(sql);
             System.out.println(i);//1
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if (conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (stmt!=null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }   
    }
}

其中有关运行结果在代码中有注释
PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)
int executeUpdate() 执行更新操作的sql语句
ResultSet executeQuery() 执行查询操作的sql语句
ResultSet接口:结果集对象。 存储所有数据库查询的结果,用该对象进行数据遍历。
boolean next() : 把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据
相关代码如下(动态sql语句,在这里主要介绍静态语句中所不具备的select操作)

package com.jdbc.c_preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.jdbc.Util.JDBCUtil;
public class Stu_01 {
    public static void main(String[] args) {
        testSelect();
    }
private static void testSelect() {
        Connection conn=null;
        PreparedStatement stmt=null;
        ResultSet rs=null;
        try{
            //获取链接
            conn = JDBCUtil.getConn();
            //准备sql语句
            String sql="SELECT *FROM student WHERE id=?;";
            //预编译sql语句
            stmt = conn.prepareStatement(sql);
            //设置参数
            stmt.setInt(1, 1);
            //执行sql语句
             rs = stmt.executeQuery();
             while (rs.next()) {
                System.out.println(rs.getInt("id")+"--"+rs.getString("name"));//1--薛之谦
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
            JDBCUtil.close(conn, stmt, rs);
        }   
    }

结果在代码中显示
Statement和PreparedStatement的区别
一、语法结构不同
1)Statment执行静态sql语句,且sql可以拼接。
2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面再进行参数赋值
二、原理不同
1)Statement不能进行sql缓存
2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!!
三、安全性不同
1)Statement存在sql注入的风险(使用登录注册讲解sql注入)
2)而PreparedStatement可以有效防止用户注入。
CallableStatement接口:用于执行 SQL 存储过程的接口(是PreparedStatement的子接口)
ResultSet executeQuery() 执行存储过程的sql语句

package com.jdbc.d_callablestatement;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.jdbc.Util.JDBCUtil;
public class Stu {
    public static void main(String[] args) {
        testIn();
        //testOut();
    }
    private static void testOut() {
        Connection conn=null;
        CallableStatement stmt=null;
        ResultSet rs=null;
        try{
            conn = JDBCUtil.getConn();
            String sql="CALL pro_testOut(?);";
            stmt =conn.prepareCall(sql);
            stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            stmt.executeQuery();
            System.out.println(stmt.getString(1));
            //我是输出参数
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, rs);
        }
    }
    private static void testIn() {
        Connection conn=null;
        PreparedStatement stmt=null;
        ResultSet rs=null;
        try{
            conn = JDBCUtil.getConn();
            String sql="CALL pro_testIn(?);";
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, 2);
            rs = stmt.executeQuery();
            if (rs.next()) {
                System.out.println(rs.getInt("id")+"--"+rs.getString("name"));
                //2--方大同
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, rs);
        }
    }
}

相关运行结果在代码中注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值