Entrada Oracle19C a la competencia 024-JDBC

requisitos de aprendizaje

Tener un cierto conocimiento de las operaciones de datos relacionales y conocer las declaraciones SQL

objetivos de enseñanza

Familiarizado con Java y cómo operar la base de datos Oracle

concepto

En este punto, las operaciones básicas de Oracle están básicamente terminadas. Hablemos sobre cómo operar la base de datos Oracle en un lenguaje de programación. Este artículo usa Java como ejemplo.

preparación del proyecto

1> Construye una base de datos y crea una tabla

Use la tabla de departamento/tabla emp en el usuario sott como ejemplo

departamento

número de serie campo tipo describir
1 NÚMERO DE DEPARTAMENTO NÚMERO 2) Número de departamento
2 NOMBRE VARCHAR2(14) Nombre de Departamento
3 LOC VARCHAR2(13) ubicación del departamento

emp 

número de serie campo tipo describir
1 EMPNO NÚMERO 4) número de empleado
2 NOMBRE VARCHAR2(10) indicar el nombre del empleado
3 TRABAJO VARCHAR2(9) Indicar cargo
4 MONSEÑOR NÚMERO 4) Indica el número de líder de un empleado
5 FECHA DE CONTRATACIÓN FECHA Indica fecha de contratación
6 SAL NÚMERO (7,2) Indica sueldo mensual, sueldo
7 COMUNICACIÓN NÚMERO (7,2) Indica un bono o comisión
8 NÚMERO DE DEPARTAMENTO NÚMERO 2) Indica el número de departamento.

Crear proyecto maven oracle-demo-jdbc

Aquí para construirlo usted mismo, si no, se recomienda aprender primero sobre los puntos de conocimiento relacionados con maven 

Importar Oracle, la operación jdbc depende

Cabe señalar aquí que la versión Oracle de la operación debe corresponder a la versión jdk, de lo contrario, causará problemas de compatibilidad.

importar dependencias

<dependencies>
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc10</artifactId>
        <version>19.10.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

 Se requiere atención adicional aquí: debido al protocolo de seguridad de Oracle, maven no descargará el contenedor correspondiente en el almacén, debe empacarlo usted mismo

mvn install:install-file -Dfile=本地jar包所在路径\ojdbc10-19.10.0.0.jar -DgroupId=com.oracle.database.jdbc -DartifactId=ojdbc10 -Dversion=19.10.0.0 -Dpackaging=jar

-Dfile: especifica la ruta donde se encuentra el jar local

-DgroupId: ruta del paquete

-DartifactId: nombre del paquete

-Dversion: versión del paquete

Nota: El jar debe descargarse del sitio web oficial de Oracle o del almacén de Maven. Una vez completada la descarga, la ruta del paquete, el nombre del paquete y el nombre de la versión deben ser los mismos; de lo contrario, la ejecución del comando mvn fallará.

Escribir código de operación de conexión jdbc

@Setter
@Getter
@ToString
public class Department {
    private Long deptno;
    private String dname;
    private String loc;
}
@Test
public static void testConn() throws Exception {

    String url ="jdbc:oracle:thin:@localhost:1521:ORCL";
    String uname="scott";
    String pwd="tiger";
    Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
    Connection connection = DriverManager.getConnection(url, uname, pwd);
    System.out.println(connection);
    connection.close();
}

CRUD

aumentar

Si necesita que la identificación crezca automáticamente, debe crear una secuencia de identificación por adelantado

create sequence dept_id_seq increment by 1 start with 1;
@Test
public  void testAdd() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	String sql = "insert into dept(deptno, dname, loc) values(dept_id_seq.nextval,?,?)";

	PreparedStatement ps = connection.prepareStatement(sql);
	ps.setString(1, "小卖部");
	ps.setString(2, "广州");
	ps.execute();
	ps.close();
	connection.close();
}

borrar

@Test
public  void testDelete() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	String sql = "delete from dept where deptno = ?";

	PreparedStatement ps = connection.prepareStatement(sql);
	ps.setLong(1, 1L);
	ps.execute();
	ps.close();
	connection.close();
}

cambiar

@Test
public  void testUpdate() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	String sql = "update dept set dname=? where deptno = ?";

	PreparedStatement ps = connection.prepareStatement(sql);
	ps.setString(1, "大卖部");
	ps.setLong(2, 1L);
	ps.execute();
	ps.close();
	connection.close();
}

controlar

@Test
public static void testQuery() throws Exception {
    String url="jdbc:oracle:thin:@localhost:1521:ORCL";
    String uname="scott";
    String pwd="tiger";
    Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
    Connection connection = DriverManager.getConnection(url, uname, pwd);
    PreparedStatement ps = connection.prepareStatement("select * from dept");
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
        Department department = new Department();
        department.setDeptno(rs.getLong("deptno"));
        department.setDname(rs.getString("dname"));
        department.setLoc(rs.getString("loc"));
        System.out.println(department);
    }
    rs.close();
    ps.close();
    connection.close();
}

paginación

//分页信息分组对象
@Getter
public class PageResult<T> {
    private int currentPage;        //当前页
    private int pageSize;           //每页显示条数
    private int totalCount;        //总记录数
    private List<T> data;           //当前页显示数据集
    private int prePage;            //上一页
    private int nextPage;           //下一页
    private int totalPage;          //总页数
    public PageResult(int currentPage, int pageSize, int totalCount, List<T> data){
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
        this.data = data;
        if(totalCount == 0){
            this.prePage = 1;
            this.totalPage = 1;
            this.nextPage = 1;
        }
        this.totalPage = totalCount % pageSize == 0? totalCount/pageSize : totalCount / pageSize + 1;
        this.prePage = currentPage > 1 ? currentPage - 1 : 1;
        this.nextPage = currentPage > totalPage ? currentPage + 1 : totalPage;
    }
}

@Test
public  void testPage() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	//查总数
	String totalsql = "select count(1) from dept ";
	PreparedStatement ps = connection.prepareStatement(totalsql);
	ResultSet countRS = ps.executeQuery();
	int totalCount = 0;
	while (countRS.next()){
		totalCount = countRS.getInt(1);
	}
	countRS.close();
	ps.close();

	//模拟页面传入:currentPage  pageSize
	int currentPage = 1;
	int pageSize = 3;

	int skip = (currentPage - 1) * pageSize;
	String sql = "select * from dept  offset ?  rows fetch next ? rows only";
	ps = connection.prepareStatement(sql);

	ps.setInt(1, skip);
	ps.setInt(2, pageSize);

	ResultSet rs = ps.executeQuery();

	List<Department> data = new ArrayList<>();

	while(rs.next()){
		Department department = new Department();
		department.setDeptno(rs.getLong("deptno"));
		department.setDname(rs.getString("dname"));
		department.setLoc(rs.getString("loc"));
		data.add(department);
	}
	//分页对象
	PageResult<Department> page = new PageResult<Department>(currentPage, pageSize, totalCount, data);
	System.out.println("当前页:" + page.getCurrentPage());
	System.out.println("上一页:" + page.getPrePage());
	System.out.println("下一页:" + page.getNextPage());
	System.out.println("总页数:" + page.getTotalPage());
	System.out.println("每页显示:" + page.getPageSize());
	System.out.println("每页数据:" );
	page.getData().forEach(System.out::println);

	rs.close();
	ps.execute();
	ps.close();
	connection.close();
}

procedimiento/función almacenados

Hay 2 formatos para jdbc llamando a procedimientos/funciones almacenados

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}  //包含结果参数的调用形式   如:函数(funciton)
{call <procedure-name>[(<arg1>,<arg2>, ...)]}  //不包含结果参数的调用形式     如:存储过程(procedure)

Configuración de parámetros

en tipo de entrada

setXXX(int parameterIndex,XXX x) //主要用于设置过程调用时候需要的输入参数信息  其中XXX代表对应类型  

tipo de salida

void registerOutParameter(int parameterIndex, int sqlType)  
        throws SQLException; //在调用存储过程的时候设置输出参数的类型,用于接收输出结果  

Donde sqlType está especificado por el tipo de enumeración OracleTypes

public abstract class OracleTypes {
    public static final int BIT = -7;
    public static final int TINYINT = -6;
    public static final int SMALLINT = 5;
    public static final int INTEGER = 4;
    public static final int BIGINT = -5;
    public static final int FLOAT = 6;
    public static final int REAL = 7;
    public static final int DOUBLE = 8;
    public static final int NUMERIC = 2;
    public static final int DECIMAL = 3;
    public static final int CHAR = 1;
    public static final int VARCHAR = 12;
    public static final int LONGVARCHAR = -1;
    public static final int DATE = 91;
    public static final int TIME = 92;
    public static final int TIMESTAMP = 93;
    public static final int PLSQL_BOOLEAN = 252;
    /** @deprecated */
    public static final int TIMESTAMPNS = -100;
    public static final int TIMESTAMPTZ = -101;
    public static final int TIMESTAMPLTZ = -102;
    public static final int INTERVALYM = -103;
    public static final int INTERVALDS = -104;
    public static final int BINARY = -2;
    public static final int VARBINARY = -3;
    public static final int LONGVARBINARY = -4;
    public static final int ROWID = -8;
    public static final int CURSOR = -10;
    public static final int BLOB = 2004;
    public static final int CLOB = 2005;
    public static final int BFILE = -13;
    public static final int STRUCT = 2002;
    public static final int ARRAY = 2003;
    public static final int REF = 2006;
    public static final int NCHAR = -15;
    public static final int NCLOB = 2011;
    public static final int NVARCHAR = -9;
    public static final int LONGNVARCHAR = -16;
    public static final int SQLXML = 2009;
    public static final int REF_CURSOR = 2012;
    public static final int OPAQUE = 2007;
    public static final int JAVA_STRUCT = 2008;
    public static final int JAVA_OBJECT = 2000;
    public static final int PLSQL_INDEX_TABLE = -14;
    public static final int BINARY_FLOAT = 100;
    public static final int BINARY_DOUBLE = 101;
    public static final int NULL = 0;
    public static final int NUMBER = 2;
    public static final int RAW = -2;
    public static final int OTHER = 1111;
    public static final int FIXED_CHAR = 999;
    public static final int DATALINK = 70;
    public static final int BOOLEAN = 16;

    public OracleTypes() {
    }
}

valor devuelto

getXXX(int x) //主要用于获取过程调用后返回的参数的信息 

Definir procedimientos almacenados

-- 给指定员工加100工资
create or replace procedure addSal(v_eno in number) 
	is
	v_sal number;
begin
	update emp set sal = sal + 100 where empno = v_eno;
	dbms_output.put_line('操作成功');
end;

llamar al procedimiento almacenado

@Test
public  void testPro() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	//调用存储过程, 指定名称
	CallableStatement cs = connection.prepareCall("{call addSal(?)}");
	//传入参数
	cs.setLong(1,7981);
	cs.execute();

	cs.close();
	connection.close();
}

definir función

-- 调用函数
create or replace function findEmpYearSal(pno in number,pname out varchar2,psal out number)
  return number
as
  pcomm emp.comm%type;
begin
  select ename,sal,comm into pname,psal,pcomm from emp where empno=pno;
  return psal*12+nvl(pcomm,0);
end;

Funciones de llamada

@Test
public  void testFun() throws Exception {
	String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	String uname="scott";
	String pwd="tiger";
	Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
	Connection connection = DriverManager.getConnection(url, uname, pwd);

	//调用存储过程, 指定名称
	CallableStatement cs = connection.prepareCall("{? = call findEmpYearSal(?,?,?)}");
	//设置返回值类型
	cs.registerOutParameter(1, OracleTypes.DOUBLE);
	cs.setLong(2,7981);

	cs.registerOutParameter(3, OracleTypes.VARCHAR);
	cs.registerOutParameter(4, OracleTypes.NUMBER);
	cs.execute();
	System.out.println("年薪:" + cs.getDouble(1));
	System.out.println("姓名:" + cs.getString(3));
	System.out.println("月薪:" + cs.getString(4));

	cs.close();
	connection.close();
}

Supongo que te gusta

Origin blog.csdn.net/langfeiyes/article/details/123991067
Recomendado
Clasificación