登录 or

JDBC(面向接口)

JDBC(面向接口)
用java代码完成curd

扩:ODBC(连接对应数据源的应用程序)

JDBC(java data base connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以对多种关系型数据库提供统一访问。
它是由一组用Java语言编写的类和接口组成

JDBC包括一套JDBC的API和一套程序员和数据库厂商必须去遵守的规范
java.sql包:提供访问数据库基本的功能
javax.sql包:提供扩展功能

数据库中间件

JDBC可以做些什么?
1.连接到数据库
2.在Java app中执行SQL命令
3.处理结果


如果需要建立与数据库的连接,java中提供了一套标准,数据库厂商来进行实现,包括实现子类,实现子类的jar文件在哪里?
一般情况下存放在安装目录下
本地到oracle的jar包步骤
1.找到oracle安装目录——jdbc-lib-ojdbc6.jar
2.复制jar包导入idea
idea-file-project structure-global libraries添加导入即可

package com.guaguauu;

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

public class JDBCTEST {
    public static void main(String args) throws Exception {
        //1.加载驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.建立连接
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
        //3.测试连接是否成功
        System.out.println(connection);
        //4.定义sql语句
        String sql = "select * from emp";
        //5.准备静态处理块(存放sql语句的地方),将sql语句放置其中
        Statement statement = connection.createStatement();
        //6.执行sql语句,返回结果集合
        ResultSet resultSet = statement.executeQuery(sql);
        //7.循环处理
        while(resultSet.next()) {//判断结果集是否有下一个
            int anInt = resultSet.getInt(1);//列索引,注意索引从1开始
            System.out.println(anInt);
            String ename = resultSet.getString("ename");//列标签
            System.out.println(ename);
            System.out.println("--------------");

        }

        //8.关闭连接
        statement.close();
        connection.close();
    }
}


1.封装重复代码util:
util包——DBUtiljava
代码
package com.guaguauu.util;

import java.sql.*;

public class DBUtil {
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
    private static final String USERNAME = "scott";
    private static final String PASSWORD = "tiger";

    //静态代码块,将不需要改动的代码完整放入
    static{
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取数据库连接,返回连接操作
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(URL,USERNAME,PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    //关闭操作
    //关闭结果集,关闭静态处理块,关闭数据库连接
    public static void closeConnection(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement!= null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}


上述操作与DB相关
2.DAO(data access object):数据访问对象
dao包——定义EmpDao.java接口(增删改查方法接口)
代码


3.扩展:E-R图,entity Relationship diagram 实体联系图
entit包——Emp.java

4.dao包——impl包(EmpDao等接口的子类实现)——EmpDaoImpl.java


5.sql注入:系统很危险
如何防止:
(初级)加?校验
String sql = "select * from emp where empno = ?";
静态代码块改为预处理块

注意:Date,在statement是按sql里的类型设置,setDate,需要先把string转换成date类型,此时的date还是java.util中的date,要讲util中的date转为sql中的date,需要先转化为时间time
new java.sql.Date(new SimpleDateFormat("yyyy-MM-DD").parse(emp.getHiredate()).getTime()))
 
package com.guaguauu.dao.impl;

import com.guaguauu.dao.EmpDao;
import com.guaguauu.entity.Emp;
import com.guaguauu.util.DBUtil;

import java.sql.*;
import java.text.SimpleDateFormat;

/*
* 为了防止sql注入,在sql语句中的值添加?
* */

public class EmpDaoImpl2 implements EmpDao {
@Override
public void insert(Emp emp) {
Connection connection = null;
PreparedStatement statement = null;//将静态处理块改为预处理块
try {
connection = DBUtil.getConnection();
// statement = connection.createStatement();
//设置事务是否自动提交,true表示自动提交,false表示不是自动提交
// connection.setAutoCommit(true);
//拼接sql字符串
//emp.getEmpno()+emp.getEname()+emp.getJob()+ emp.getMrg()+emp.getHiredate()+emp.getSal()+emp.getComm()+emp.getDeptno()
String sql = "insert into emp values(?,?,?,?,?,?,?,?)";
statement = connection.prepareStatement(sql);//此处改为预处理块
//向问号中添加值

statement.setInt(1,emp.getEmpno());
statement.setString(2,emp.getEname());
statement.setString(3,emp.getJob());
statement.setInt(4,emp.getMrg());
statement.setDate(5,new java.sql.Date(new SimpleDateFormat("yyyy-MM-DD").parse(emp.getHiredate()).getTime()));
statement.setDouble(6,emp.getSal());
statement.setDouble(7,emp.getComm());
statement.setInt(8,emp.getDeptno());

System.out.println(sql);
//返回值表示受影响的行数
int i = statement.executeUpdate();
System.out.println("受影响的行数是:"+i);
} catch (Exception e) {
e.printStackTrace();
} finally{
DBUtil.closeConnection(connection,statement);
}
}

@Override
public void delete(Emp emp) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
//拼接sql字符串
//emp.getEmpno()+emp.getEname()+emp.getJob()+ emp.getMrg()+emp.getHiredate()+emp.getSal()+emp.getComm()+emp.getDeptno()
String sql = "delete from emp where empno = ?";

statement = connection.prepareStatement(sql);
statement.setInt(1,emp.getEmpno());
System.out.println(sql);
//返回值表示受影响的行数
int i = statement.executeUpdate();
System.out.println("受影响的行数是:"+i);
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closeConnection(connection,statement);
}

}

@Override
public void update(Emp emp) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
//拼接sql字符串
//emp.getEmpno()+emp.getEname()+emp.getJob()+ emp.getMrg()+emp.getHiredate()+emp.getSal()+emp.getComm()+emp.getDeptno()
String sql = "update emp set job = ? where empno = ?";
statement = connection.prepareStatement(sql);
statement.setString(1,emp.getJob());
statement.setInt(2,emp.getEmpno());
System.out.println(sql);
//返回值表示受影响的行数
int i = statement.executeUpdate();
System.out.println("受影响的行数是:" + i);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection(connection, statement);
}


}

@Override
public Emp getEmpByEmpno(Integer empno) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
Emp emp = null;
try {
connection = DBUtil.getConnection();
//拼接sql字符串
//emp.getEmpno()+emp.getEname()+emp.getJob()+ emp.getMrg()+emp.getHiredate()+emp.getSal()+emp.getComm()+emp.getDeptno()
String sql = "select * from emp where empno = ?";
statement = connection.prepareStatement(sql);
statement.setInt(1,empno);
System.out.println(sql);
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
resultSet = statement.executeQuery();
while (resultSet.next()){
emp = new Emp(resultSet.getInt("empno"),resultSet.getString("ename"),resultSet.getString("job"),resultSet.getInt("mgr"),
sdf.format(resultSet.getDate("hiredate")),resultSet.getDouble("sal"),resultSet.getDouble("comm"),resultSet.getInt("deptno"));
};
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection(connection,statement,resultSet);
}
return emp;
}

@Override
public Emp getEmpByEname(String name) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
Emp emp = null;
try {
connection = DBUtil.getConnection();
//拼接sql字符串
String sql = "select * from emp where ename = ?";
statement = connection.prepareStatement(sql);
statement.setString(1,name);
System.out.println(sql);
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
resultSet = statement.executeQuery();
while (resultSet.next()){
emp = new Emp(resultSet.getInt("empno"),resultSet.getString("ename"),resultSet.getString("job"),resultSet.getInt("mgr"),
sdf.format(resultSet.getDate("hiredate")),resultSet.getDouble("sal"),resultSet.getDouble("comm"),resultSet.getInt("deptno"));
};
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection(connection,statement,resultSet);
}
return emp;
}

public static void main(String args) {
EmpDao empDao = new EmpDaoImpl2();
Emp emp = new Emp(3333, "sisi", "SALESss", 1111, "2019-11-09", 1500.0, 500.0, 10);

// empDao.insert(emp);
//删除数据
// empDao.delete(emp);
// empDao.update(emp);
Emp empByEmpno = empDao.getEmpByEmpno(3333);
//
System.out.println(empByEmpno);

//sql注入
// Emp emp2 = empDao.getEmpByEname("'SMITH' or 1 = 1");//得不到值因为参数不对
// Emp emp2 = empDao.getEmpByEname("SMITH");//此时只能用规范的 name才能查到值

// System.out.println(emp2);//可以得到其他用户的相关信息




}
}




           批处理
批处理速度快,只打开了一次连接。
1.在impl包下新建BatchDaoImpl.java
package com.guaguauu.dao.impl;

import com.guaguauu.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BatchDaoImpl {
    public static void main(String args) {
        //调用方法
        insertBatch();

    }

    public static void insertBatch(){
        Connection connection = null;
        connection = DBUtil.getConnection();
        String sql = "insert into emp(empno,ename) values (?,?)";
        PreparedStatement preparedStatement = null;
        try {
            //准备预处理块
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < 10; i++) {
                preparedStatement.setInt(1,i+1000);
                preparedStatement.setString(2,"root"+i);
                //向批量处理中添加sql语句
                preparedStatement.addBatch();
            }
            //执行批量处理
            int ints = preparedStatement.executeBatch();
            for (int anInt : ints) {
                System.out.println(anInt);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeConnection(connection,preparedStatement);
        }


    }
}

//比较两种提交的时间差别
package com.mashibing.dao.impl;

import com.mashibing.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BatchDaoImpl {
    public static void main(String args) {
        long start = System.currentTimeMillis();
        insertBatch();
        System.out.println(System.currentTimeMillis()-start);
        System.out.println("------------");
        long start2 = System.currentTimeMillis();
        for(int i = 1001;i<2000;i++){
            insertBatch2(i,"msb"+i);
        }
        System.out.println(System.currentTimeMillis()-start2);
    }

    public static void insertBatch(){
        Connection connection = DBUtil.getConnection();
        PreparedStatement pstmt = null;
        String sql = "insert into emp(empno,ename) values (?,?)";
        //准备预处理快对象
        try {
            pstmt = connection.prepareStatement(sql);
            for(int i = 0;i<1000;i++){
                pstmt.setInt(1,i);
                pstmt.setString(2,"msb"+i);
                //向批处理中添加sqk语句
                pstmt.addBatch();
            }
            int ints = pstmt.executeBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeConnection(connection,pstmt);
        }
    }

    public static void insertBatch2(int i,String name){
        Connection connection = DBUtil.getConnection();
        PreparedStatement pstmt = null;
        String sql = "insert into emp(empno,ename) values (?,?)";
        //准备预处理快对象
        try {
            pstmt = connection.prepareStatement(sql);
            pstmt.setInt(1,i);
            pstmt.setString(2,name);
                //向批处理中添加sql语句
            int j = pstmt.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeConnection(connection,pstmt);
        }
    }
}
 
已邀请:

要回复问题请先登录注册