JDBC 言简意赅

1.什么是JDBC?

java数据库连接,是java语言链接关系型数据库的一种技术;

只要在java语言中需要访问数据库必须使用JDBC

2.JDBC有哪些核心接口和类;

类:

        DriverManager:驱动管理,管理各个数据库厂家提供的数据库驱动程序,根据url  usermame,password 

                                        完成 数据库 连 接

            SQLException:数据库异常

接口:

  •    Connection :表示JAVA程序与数据库库的链接,又称会话(SEssion);
  •     Statement:表示执行的对象,仅仅能执行静态语句(传输)

    String sql="insert into emp(empno,ename) values(7799,'zhangsan')";

  •     PreparedStatement:负责执行预编译的sql语句 ?占位符

String name="zhangsan";

String sql="insert into emp(empno,ename) values(7799,?)";

  • CallableStatement:专门在java中为执行过程和函数提供接口;

            String sql="{call pro_name(?,?)}";

ResultSet:封装 数据库查询得到的结果集

                select 执行后的内容

                其中包含两部分内容

一部分是 查询的列标题,不管有没有数据列标题都存在;

            ResultSetMetaData 存放的是查询获取的数据;

另一部分 是查询获取的数据(记录),可能有 也可能没有;


3.JDBC的驱动分类;

a)jdbc-odbc:在顶层 把jdbc api 转换为odbc api 操作

                        需要在本机 中创建一个连接数据库的源才可以

                                可以用来连接那些没有驱动程序的数据库,access\excel.txt;

   b)本地api :需要在本集中安装对应的数据库的驱动程序才可以

                            列如:QQ  

  c)网络连接:通过网络连接第三方服务 完成数据库的操作

                    web qq

                    使用第三方 工具 发送手机短信

d):本地协议 api:使用Java 语言 编写,直接操作数据库协议

                                必须数据库厂家提供协议驱动才可以

                                添加数据库连接驱动包

4.操作JDBC的步骤

    a)复制驱动包到项目中并添加到构建路径 11G ojdbc6.jar

b) 加载驱动类

        Class.forName(“oracle.jdbc.drever.OracleDriver”);

c)编写连接数据的使用的参数

String url="jdbc:oracle:thin:@localhost:1521:数据库的sid";//连接数据库的位置

String user=“”;//登录数据库的用户名

String pwd=“";//登录数据库的密码

Connection conn =DriverManager.getConnection(url,user,pwd);


//常见问题

1、java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver 

解决方案:1)核心驱动类 全限定名称 有错: 
2)是否导入ojdbc6.jar

2、java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection 
解决方案:检查URL中的ip地址或端口号

3、java.sql.SQLRecoverableException: IO 错误: Invalid number format for port number 
解决方案:检查URL中的端口号

4、java.sql.SQLException: Listener refused the connection with the following error: 
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 
解决方案:检查URL中的SID(数据库的唯一标识)

5、java.sql.SQLException: No suitable driver found for jdbc:eoracle:thin:@localhost:1521:oraclejdbc 
解决方案:检查URL中的协议部分

6、java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝 
解决方案:检查用户名和密码

7、java.sql.SQLSyntaxErrorException: ORA-00904: “AUUOUNTTNO”: 标识符无效 表或视图不存在 缺少符号 值太多… 
并且使用异常堆栈信息,定位到错误代码行为 executeUpdate executeQuery时,解决方案:检查SQL语句。 
解决方案:检查


d)编写sql语句:执行修改操作(Insert,update,delete)

            String sql=“insert into dept(deptno,dname,loc) values(99,'测试',‘青岛’) ”;

e)创建一个执行sql语句的对象

        Statement stmt=conn.createStatement();

f)执行sql语句,获取结果;

        int row=stmt.executeUpdate(sql);

h)处理结果

        根据影响的行数判断成功还是失败

j)关闭数据库

注意:JDBC 自动提交事物

public class Main {
    /*1.加载驱动类,使用哪个类的在底层连接数据库
    * 2.设置连接数据库的参数
    * 3.编写sql语句
    * 4.创建执行sql语句对象
    * 5.执行sql语句,DML返回影响的行数
    * 6.处理结果
    * 7.关闭资源;
    * */
public static void main(String[] args)throws ClassNotFoundException,SQLException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //使用 jdbc 协议连接oracle类型的数据库,
        // 在localhost 的主机中的1521位置 中找orcl的数据库
            String url="jdbc:oracle:thin:@localhost:1521:orcl";//数据库位置
            String user="scott";//不能是 dba ,该用户一定是操作表的拥有者;
            String pwd="tiger";
        Connection sonn=DriverManager.getConnection(url,user,pwd);
        sonn.setAutoCommit(false);//不会自动提交;
        if(sonn!=null){
            System.out.println("连接成功");
        }
        String sql="insert into dept(deptno,dname,loc)"+
                " values(90,'测试','青岛')";
        Statement stmt=sonn.createStatement();
        int row=stmt.executeUpdate(sql);
        if(row>0){
            System.out.println("操作成功");
        }else {
            System.out.println("操作失败");
        }
        if(stmt!=null){
            stmt.close();
        }
        if(sonn!=null){
            sonn.close();
        }

    }
}
------------------------------------
预编译方法;
PreparedStatement stmt=null;
try {
     conn=DriverManager.getConnection(url,user,pwd);
    String sql="insert into dept(deptno,dname,loc)"+
          //  "values("+no+",'"+name+"','"+loc+"')";
    "values(?,?,?)";
    stmt=conn.prepareStatement(sql);
    //在执行sql语句之前,必须把?占位符 赋值
    stmt.setObject(1,no);
    stmt.setObject(2,name);
    stmt.setObject(3,loc);

int row=stmt.executeUpdate();//必须是空参,因为构建PreparedStement时已经指明了sql语句

-------------------------------------------

删除


6。资源文件

        以键值对格式进行存放的文件

        可以根据Key获取对应的value部分的数据

        以properties 为后缀的

--------------------------------------------



1.数据的加密与解密

        加密:是对一个字节数据进行各种操作,获取一个新的字符串

  2.JDBc完成查询操作

        通过select查到的结果 我们称为结果集 ResultSet;

                    查询的结果,在java中称为 ResultSet;

                                          数据库中称为游标Cursor,就是处理查询结果的工具

                       查询结果包含两部分内容

                                                列标题,可以显示列名或者列的别名

                                                    表中的数据

                        不管查询的条件是否成立,结果中都包含列标题

        b)在JAVA中如何处理结果集

-=-=-=-

package demo_03;



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


public class Main_03 {
    public static void main(String[] args) {
        //永真循环:我们为了实现某个功能,人为设置条件永远成立
        while (true) {
            System.out.println("1.添加数据");
            System.out.println("2.删除数据");
            System.out.println("3.修改数据");
            System.out.println("4.查询数据");
            Scanner in = new Scanner(System.in);
            System.out.print("请选择功能:");
            int i = in.nextInt();
            switch (i) {
                case 1:
                    add();
                    break;
                case 2:
                    delete();
                    break;
                case 3:
                    update();
                    break;
                case 4:
                    findAllEmp();
                    System.out.println("============");
                    findBySal();
                    break;
                default:
                    System.out.println("请输入1-4之间的数据!");
                    break;
            }
        }
    }
    static {
        //在类加载的时候执行,只执行一次
        try {
            Class.forName(ResUtil.getDriver());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    static String url=ResUtil.getUrl();
    static String user=ResUtil.getUser();
    static String pwd=ResUtil.getPassword();
    static Connection conn=null;
    static PreparedStatement stmt=null;
    static  ResultSet rst=null;


    public static void findAllEmp(){
        String sql="select * from emp";
        List<Map<String,Object>> list= executeQuery(sql,null);
        System.out.println(list);
    }
    public static void findBySal(){
        String sql="select ename,job,sal from emp where sal>?";
        Object[] objs={2000};
        List<Map<String,Object>> list=executeQuery(sql,objs);
        System.out.println(list);
    }
    //每一行数据对应一个Map集合,Map中的key 就是 查询的列名,Map中的value 就是该列对应的数据
    //使用 List 存放 每一行构建的map对象
    public static List<Map<String,Object>> executeQuery(String sql, Object[] objs){
        List<Map<String,Object>> list=new ArrayList<>();
        try {
            conn=DriverManager.getConnection(url,user,pwd);
            stmt=conn.prepareStatement(sql);
            if(objs!=null){
                for (int i = 0; i < objs.length; i++) {
                    stmt.setObject(i+1,objs[i]);
                }
            }
            rst=stmt.executeQuery();
            //如果能够获取 sql语句中查询的列名
            ResultSetMetaData meta=rst.getMetaData();
            //获取sql语句中查询的列数
            int c=meta.getColumnCount();
            //获取每一列的列名(在结果集中显示的名称)
            String[] names=new String[c];
            for (int i = 0; i < c; i++) {
                names[i]=meta.getColumnLabel(i+1).toLowerCase();
            }
            //构建一个Map对象,用于存放每一行中的数据
            Map<String,Object> item;
            //获取每一行
            while(rst.next()){
                item=new HashMap<>();
                //获取每一行中每一列
                for (int i = 0; i < c; i++) {
                    Object obj=rst.getObject(i+1);
                    item.put(names[i],obj);
                }
                //把该行数据添加到list集合中
                list.add(item);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {


        }
        return list;
    }
    public static int executeUpdate(String sql,Object[] objs){
        int row=0;
        try {
            conn=DriverManager.getConnection(url,user,pwd);
            stmt=conn.prepareStatement(sql);
            if(objs!=null){
//                说明数组中 包含数据了
//                sql语句中 使用 ? 占位符
                for (int i = 0; i < objs.length; i++) {
                    stmt.setObject(i+1,objs[i]);
                }
            }
            //在if的外面执行
            row=stmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(stmt!=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    stmt=null;
                }
            }


            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return row;
    }
    public static void update() {
        Scanner in = new Scanner(System.in);
        System.out.print("编号:");
        int no = in.nextInt();
        System.out.print("名称:");
        String name = in.next();
        System.out.print("地址:");
        String loc = in.next();
        String sql = "update dept set dname='aaa',loc='bb'" +
                " where deptno=12";
        Object[] objs={name,loc,no};
        //把需要执行的sql语句和该语句 ? 中对应的值 传递个 executeUpdate方法
        int r=executeUpdate(sql,null);
    }


    public static void delete() {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入要删除数据的编号:");
        int no = in.nextInt();
        String sql = "delete from dept where deptno=?";
        Object[] objs={no};
        int r=executeUpdate(sql,objs);
    }


    public static void add() {
        Scanner in = new Scanner(System.in);
        System.out.print("编号:");
        int no = in.nextInt();
        System.out.print("名称:");
        String name = in.next();
        System.out.print("地址:");
        String loc = in.next();
        String sql = "insert into dept(deptno,dname,loc)" +
                " values(?,?,?)";//占位符
        Object[] objs={no,name,loc};
        int r=executeUpdate(sql,objs);//executeUpdate(sql,no,name,loc);
    }
}
























……连载中……

猜你喜欢

转载自blog.csdn.net/wujj5_ttc/article/details/80446917
今日推荐