JDBC(java连接数据库1)

1 JDBC入门
1.1 回顾
之前操作mysql数据库:
1)使用mysql客户端工具
2)使用客户端连接mysql服务器
3)发送sql语句到mysql服务器,执行
1.2 什么是JDBC?
使用java程序发送sql语句到数据库服务器端执行,这叫用到了JDBC技术!!!!
jdbc是Oracle-Sun公司设计的一套专门用于java程序操作数据库的接口。
1.3 使用jdbc发送sql条件
连接mysql数据库:
数据库主机
端口
数据库用户名
数据库密码
连接的数据库
1.4 JDBC的核心API
|-Driver接口: 数据库驱动程序的接口,所有具体数据库厂商需要的驱动程序需要实现此接口。
Connection connect(String url, Properties info) 用于获取数据库连接
常用连接数据库的方法。

package com.jdbc.a_driver;
import java.sql.Connection;
import java.sql.DriverManager;
public class DriverDemo {
            private static String url="jdbc:mysql://localhost:3306/day22";
            private static String  user="root";
            private static String  password="root";
    public static void main(String[] args) throws Exception {
        conn();
    }
    private static void conn() throws Exception {
        //注册驱动,注意在此时我们必须要在该工程下面建立一个Folder命名为lib,然后将mysql-connector-java-5.1.7-bin.jar
        //复制进去,然后右键BulidPath会看到一个小奶瓶,添加进去即可。
        Class.forName("com.mysql.jdbc.Driver");
        //获取JAVA连接数据库的对象
        Connection conn=DriverManager.getConnection(url, user, password);
        //打印这个连接对象
        System.out.println(conn);
        //运行结果:com.mysql.jdbc.JDBC4Connection@21b10e9e

    }
}

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

1.7 PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)
int executeUpdate() 执行更新操作的sql语句
ResultSet executeQuery() 执行查询操作的sql语句
1.8 CallableStatement接口:用于执行 SQL 存储过程的接口
(是 PreparedStatement的子接口)
ResultSet executeQuery() 执行存储过程的sql语句
1.9 ResultSet接口:结果集对象。 存储所有数据库查询的结果,用该对象进行数据遍历。
boolean next() : 把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据
2 Statement对象执行SQL操作
2.1 执行DDL操作(create/alter/drop)
代码思想图解

package com.jdbc.b.statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
    private static String url="jdbc:mysql://localhost:3306/day22";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;
        try{
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过驱动管理类获取java连接数据库对象
            conn=DriverManager.getConnection(url, user, password);
            //获取语句执行对象
            stmt = conn.createStatement();
            //定义一个sql语句
            String sql="CREATE TABLE stu("+
                    "id INT,"+
                    "NAME VARCHAR(20),"+
                    "age INT"+
                    ");";
            //使用语句执行者查询在数据库day22中创建的一个stu表
            int count = stmt.executeUpdate(sql);
            //打印一下影响行数
            System.out.println(count);

        }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();
            }

        }       
    }
}

2.2 执行DML操作 (insert/update/delete)

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 Demo2 {
    private static String url="jdbc:mysql://localhost:3306/day22";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args) throws Exception {
        //testInsert();
        //testUpdate();
        testDelete();
    }
    private static void testDelete() throws Exception {
        Connection conn=null;
        Statement stmt=null;
        try {
            //创建连接对象
            conn = JDBCUtil.getConn();
            //创建语句执行对象
            stmt = conn.createStatement();
            //准备Sql语句
            String sql="delete from stu where id=1;";
            //执行语句
            int count = stmt.executeUpdate(sql);
            //输出影响行数
            System.out.println(count);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            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 stu values(1,'刘德华',60);";
            //执行语句
            int count = stmt.executeUpdate(sql);
            //打印影响行数
            System.out.println(count);

        }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();
            }   
        }   
    }

    private static void testUpdate() throws Exception {
        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="update stu set name='吴亦凡'where id=1;";
        //执行语句
        int count = stmt.executeUpdate(sql);
        //返回影响行数
        System.out.println(count);
        }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();
                }
    }
    }
}

注意点:在这里因为多次使用注册驱动,获取连接,获取语句执行对象
释放资源这几个步骤,所以把它写为一个工具类,这里的testDelete()就使用了这个工具类。具体代码实现如下所示:

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/day22";
    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 (Exception 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();
            }
        }
    }

}

2.3 执行DQL查询操作(select)

package com.jdbc.b.statement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class Demo3 {
    public static void main(String[] args) {
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        try{
            //创建连接对象
            conn = JDBCUtil.getConn();
            //创建语句执行对象
            stmt = conn.createStatement();
            //准备sql语句
            String sql="select* from stu;";
            //执行查询语句
            rs = stmt.executeQuery(sql);
            //遍历结果集
            while(rs.next()){   System.out.println(rs.getInt(1)+rs.getString(2));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
            JDBCUtil.close(conn, stmt, rs);
        }   
    }
}

2.4 PreparedStatement对象执行SQL操作(select)
PreparedStatement缓存图解
resultset图解

package com.jdbc.c.preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.jdbc.util.JDBCUtil;
public class Demo {
    public static void main(String[] args) {
        //testInsert();
        testUpdate();
        //testDelete();
        //testSelect();
    }
    private static void testSelect() {
        Connection conn=null;
        PreparedStatement stmt=null;
        ResultSet rs=null;
        try{
            //创建连接对象
            conn=JDBCUtil.getConn();
            //准备Sql语句
            String sql="select * from stu where id=?;";
            //创建预编译的语句对象
            stmt = conn.prepareStatement(sql);
            //给?赋值
            stmt.setInt(1, 3);
            //查询
            rs=stmt.executeQuery();
            //遍历结果集
            while(rs.next()){
                System.out.println(rs.getInt("id")+"--"+rs.getString("name"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, rs);
        }   
    }

    private static void testDelete() {
        Connection conn=null;
        PreparedStatement stmt=null;
        try{
            //创建连接对象
            conn=JDBCUtil.getConn();
            //准备Sql语句
            String sql="delete from stu where id=?;";
            //创建预编译的语句对象
            stmt = conn.prepareStatement(sql);
            //给?赋值
            stmt.setInt(1, 8);
            //执行
            int count = stmt.executeUpdate();
            System.out.println(count);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, null);
        }   
    }
    private static void testUpdate() {
        Connection conn=null;
        PreparedStatement stmt=null;
        try{
            //创建连接对象
            conn=JDBCUtil.getConn();
            //准备Sql语句
            String sql="update stu set name='薛之谦' where id=?;";
            //创建预编译的语句对象
            stmt = conn.prepareStatement(sql);
            //给?赋值
            stmt.setInt(1, 1);
            //执行
            int count = stmt.executeUpdate();
            System.out.println(count);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, null);
        }


    }

    private static void testInsert() {
        Connection conn=null;
        PreparedStatement stmt=null;
        try{
            //创建连接对象
            conn=JDBCUtil.getConn();
            //准备Sql语句
            String sql="insert into stu values (?,?,?);";
            //创建预编译的语句对象
            stmt = conn.prepareStatement(sql);
            //给?赋值
            stmt.setInt(1, 8);
            stmt.setString(2, "陈赫");
            stmt.setInt(3, 34);
            //执行
            int count = stmt.executeUpdate();
            System.out.println(count);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, null);
        }
    }
}

2.5 Statement和PreparedStatement的区别
一、语法结构不同
1)Statment执行静态sql语句,且sql可以拼接。
2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面在进行参数赋值
二、原理不同
1)Statement不能进行sql缓存
2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!!
三、安全性不同
1)Statement存在sql注入的风险(使用登录注册讲解sql注入)
2)而PreparedStatement可以有效防止用户注入。
2.6 用户注入问题

package com.jdbc.c.preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class login {
        //SELECT * FROM USER WHERE Name='james' OR 1=1 -- ' AND PASSWORD='123456';
        //sql注入行为
        private static String user = "james' OR 1=1 -- ";
        private static String password = "123456";
        public static void main(String[] args) {
            testStatement();
            //testPreparedStatement();
        }
        private static void testPreparedStatement() {
            //可以防止用户注入
            Connection conn  =null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
            try{
                conn  =JDBCUtil.getConn();
                String sql = "SELECT * FROM USER WHERE Name=? AND PASSWORD=?;";
                stmt = conn.prepareStatement(sql);
                //给问号设置参数
                stmt.setString(1, user);
                stmt.setString(2, password);
                //发送参数并执行sql
                rs = stmt.executeQuery();
                if (rs.next()) {
                    System.out.println("登陆成功");
                }else {
                    System.out.println("登录失败");
                }

            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                JDBCUtil.close(conn, stmt, rs);
            }
        }
        //运行结果:登陆失败

        private static void testStatement() {
            //不可以防止用户注入
            Connection conn  =null;
            Statement stmt = null;
            ResultSet rs = null;
            try{
                conn = JDBCUtil.getConn();
                stmt = conn.createStatement();
                String sql  ="SELECT * FROM USER WHERE Name='"+user+"' AND PASSWORD='"+password+"';";
                rs = stmt.executeQuery(sql);
                if (rs.next()) {
                    System.out.println("登陆成功");
                }else {
                    System.out.println("登录失败");
                }

            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JDBCUtil.close(conn, stmt, rs);
            }
        }

    }//运行结果:登陆成功

2.7 CallableStatement对象执行存储过程

package com.jdbc.callablestatement;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import com.jdbc.util.JDBCUtil;
public class Demo {
    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();
            //准备Sql语句
            String sql="CALL pro_QueryNameById(?,?);";
            stmt = conn.prepareCall(sql);
            //给问号赋值
            stmt.setInt(1, 2);
            //如果存储过程带有输出参数的时候,首先需要注册,输出参数的类型
            stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
            //执行sql语句
            stmt.executeQuery();
            //获取输出参数的结果
            System.out.println(stmt.getString(2));          
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtil.close(conn, stmt, rs);
        }   
    }
    private static void testIn() {
        Connection conn  =null;
        CallableStatement stmt = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtil.getConn();
            String sql = "CALL pro_QueryById(?);";
            stmt = conn.prepareCall(sql);
            //给问号设置值
            stmt.setInt(1, 2);
            //发送参数并执行sql,只能调用excuteQuery()
            rs = stmt.executeQuery();
            if (rs.next()) {
                System.out.println(rs.getInt(1)+"--"+rs.getString(2));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //释放资源
            JDBCUtil.close(conn, stmt, rs);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值