JDBC-Java连接数据库

来源:互联网 发布:美国留学知乎 编辑:程序博客网 时间:2024/05/16 14:52

引言
有关数据库的概念,将数据库和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);        }    }}

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

原创粉丝点击