Java40: 数据库四(Oracle)

2024-09-03 22:32
文章标签 java oracle 数据库 40

本文主要是介绍Java40: 数据库四(Oracle),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JDBC 提供访问数据库的标准  就是一系列接口 定义了访问数据库的通用的方法

由各个数据库厂商提供对JDBC的实现


JDBC接口的定义

数据库厂商对jdbc的实现 jar


建立连接-发送sql-执行sql-返回结果-关闭连接


JDBC API(接口)

    java.sql.Connection//封装和数据库的连接

    java.sql.Statement//封装SQL语句的执行

    jave.sql.ResultSet//封装DQL执行的结果

package jdbc;import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import oracle.jdbc.OracleDriver;public class OracleDemo01 {public static void main(String[] args) throws Exception{//装载JDBC的实现//Driver driver =new OracleDriver() ; 自己写//DriverManager.registerDriver(driver);//把类装载到内存中  静态 快中执行  上面的两条  就不用自己写了//该类的静态块中的代码会进行Driver的注册Class.forName("oracle.jdbc.OracleDriver");//装载JDBC的实现用这个就好了//创建连接//调用DriverManager 的getConnection方法//该方法返回的是数据库厂商对Connection接口的实现类的对象(因为DriverManager已经注册了数据库厂商的Driver信息)String url = "jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user = "scott";String pass = "xxxxx";Connection con = DriverManager.getConnection(url,user,pass);//url 用于表示数据库的连接信息(ip port 数据库名称)  不同的数据库厂商有特定的url的格式和标识// DriverManager 会根据这个标识来选取不同的驱动信息//如果同时注册了多个数据库厂商的实现//user//password//System.out.println(con);//执行SQL//Connection 的createStatement() 方法用于创建Statement 实现类的对象Statement stmt = con.createStatement();//只能执行DQL语句//返回值是ResultSet//把SQl语句传输给数据库执行//获取数据库传输会的结果数据//并把这个数据封装成ResultSet 对象ResultSet rs = stmt.executeQuery("select empno,ename name,sal from emp");//获取结果while(rs.next()){//.next() 游标 向下System.out.println(rs.getString("empno")+","+rs.getString("name")+","+rs.getString("sal"));}rs.close();//关闭连接} 
}
package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class OracleDemo02 {public static void main(String[] args) throws Exception{Class.forName("oracle.jdbc.OracleDriver");String url = "jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user="scott";String pass="xxxxx";Connection con = DriverManager.getConnection(url,user,pass);Statement stmt = con.createStatement();//执行DML语句 insert delete updateString sql = "insert into emp2(empno,ename,sal,deptno) values(20,'lmdtx',3000,10)";int n = stmt.executeUpdate(sql);//返回整数表示,刚才的语句影响的行数System.out.println(n);con.close();}
}
package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class OracleDemo03 {public static void main(String[] args) throws Exception{Class.forName("oracle.jdbc.OracleDriver");String url = "jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user = "scott";String pass = "xxxxx";Connection con = DriverManager.getConnection(url,user,pass);Statement stmt = con.createStatement();String sql = "delete from emp2 where ename='lmdtx'";int n = stmt.executeUpdate(sql);System.out.println(n);con.close();}
}



会有被注入的风险

name:a' or 'b'='b
a' or 'b'='b
select ename,empno,sal from emp2 where ename = 'a' or 'b'='b'
package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;public class OracleDemo04 {public static void main(String[] args) throws Exception{Scanner in = new Scanner(System.in);System.out.print("name:");String name = in.nextLine();System.out.println(name);Class.forName("oracle.jdbc.OracleDriver");String url = "jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user = "scott";String pass = "xxxxx";Connection con = DriverManager.getConnection(url,user,pass);Statement stat = con.createStatement();String sql ="select ename,empno,sal from emp2 where ename = '"+name+"'";System.out.println(sql);ResultSet rs = stat.executeQuery(sql);while(rs.next()){System.out.println(rs.getString(1)+","+rs.getInt(2)+","+rs.getInt(3));}con.close();}
}

PreparedStatement 接口(用这个好)

  提高效率

  防止SQL Injection

    1创建连接

    2PreparedStatement

        PreparedStatement stmt = con.prepareStatement(sql)

    3 stmt.setString(1,"xxx");

     stmt.setInt(1,123);

package jdbc;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class OracleDemo05 {public static void main(String[] args)throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("name:");String name = br.readLine();Class.forName("oracle.jdbc.OracleDriver");String url = "jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user = "scott";String pass = "xxxxx";Connection con = DriverManager.getConnection(url,user,pass);String sql = "select empno,ename,sal from emp2 where ename=?";PreparedStatement stmt = con.prepareStatement(sql);//将 sql 中 第一个问号的值设置为字符串 stmt.setString(1,name);ResultSet rs = stmt.executeQuery();while(rs.next()){System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getInt(3));}con.close();}
}

    

package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;public class OracleDemo06 {public static void main(String[] args) throws Exception{Class.forName("oracle.jdbc.OracleDriver");String url ="jdbc:oracle:thin:@x1.zongxuan.online:1521:xx";String user ="scott";String pass = "xxxxx";Connection con = DriverManager.getConnection(url,user,pass);String sql ="insert into emp2(empno,ename) values(?,?)";PreparedStatement stmt = con.prepareStatement(sql);int n =0;for(int i =1000;i<3000;i++){stmt.setInt(1, i+1);stmt.setString(2, "sting"+i);n = stmt.executeUpdate();System.out.println(i+","+n);}con.close();}
}


封装连接工具类

properties 

    文本文件, 存放的是KEY—VALUSE

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@x1.zongxuan.online:1521:xx
user=scott
pass=xxxxx
package jdbc;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;public class DBUtils {private static String driver;private static String url;private static String user;private static String pass;static{Properties props = new Properties();try {props.load(DBUtils.class.getClassLoader().getResourceAsStream("jdbc/db.properties"));driver= props.getProperty("driver");url= props.getProperty("url");user= props.getProperty("user");pass= props.getProperty("pass");Class.forName(driver);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection openConnection() throws Exception{return DriverManager.getConnection(url,user,pass);}
}
package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class OracleDemo08 {public static void main(String[] args) throws Exception {Connection con = DBUtils.openConnection();String sql = "select empno,ename,sal from emp2";PreparedStatement stmt = con.prepareStatement(sql);// 将 sql 中 第一个问号的值设置为字符串ResultSet rs = stmt.executeQuery();while (rs.next()) {System.out.println(rs.getInt(1) + "," + rs.getString(2) + ","+ rs.getInt(3));}con.close();}
}


日期

package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;public class Oracledemo09 {public static void main(String[] args) throws Exception{Connection con = DBUtils.openConnection();String sql ="insert into emp2(empno,ename,hiredate)"+ "values(?,?,?)";PreparedStatement stmt =con.prepareStatement(sql);stmt.setInt(1, 4000);stmt.setString(2,"lmdtx");stmt.setDate(3,new Date(System.currentTimeMillis()));int n =stmt.executeUpdate();System.out.println(n);con.close();}
}



批处理

    Batch 处理 批量的插入 更新

    stmt.addBatch();

        把刚刚设置好的数据添加批处理缓冲

    stmt

        执行批处理,把缓冲的数据一次传送给数据库执行

    

    缓存的批处理量受到哭护短JVM内存的限制要指定一个合理的批量值才好

package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;public class OracleDemo10 {public static void main(String[] args) throws Exception{Connection con = DBUtils.openConnection();String sql = "insert into emp2(empno,ename) values(?,?)";PreparedStatement stmt = con.prepareStatement(sql);//批量插入for(int i =5000;i<=6000;i++){stmt.setInt(1, i);stmt.setString(2, "M"+i);stmt.addBatch();//添加批处理}stmt.executeBatch();//执行批处理con.close();}
}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;public class OracleDemo10 {public static void main(String[] args) throws Exception{Connection con = DBUtils.openConnection();String sql = "insert into emp100(id,name) values(?,?)";PreparedStatement stmt = con.prepareStatement(sql);//批量插入for(int i =1;i<=2000000;i++){stmt.setInt(1, i);stmt.setString(2, "M"+i);stmt.addBatch();//添加批处理if(i%20000==0){stmt.executeBatch();}}stmt.executeBatch();//执行批处理con.close();}
}



JDBC的事物操作

    JDBC 中所有的DML会默认提交 在每条DML语句后会默认的加入commit


    con.setAutoCommit(false)

    con.commit();//成功

    con.rollback();//失败

    提交事务使用 连接的api

    


测试 表 pay id 10 和id 100 

id 10 的人向 id 100 的人 转账500

create table pay(id number(10),money number(10)
);
insert into pay values(10,20000);
insert into pay values(100,10000);select * from pay;
package jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class OracleDemo11 {public static void main(String[] args) throws Exception {Connection con = DBUtils.openConnection();PreparedStatement stmt = con.prepareStatement("update pay set money = money-500 where id=10");int n = stmt.executeUpdate();System.out.println(n+"行"+"id = 10  money -500");if (true) {throw new Exception("模仿异常");}PreparedStatement stmt2 = con.prepareStatement("update pay set money = money+500 where id=100");stmt2.executeUpdate();System.out.println("id = 100 money +500");con.close();}
}

 这个就会有异常, id =10的钱被-了500 但是id =100 的却没有+500


使用con.setAutoCommit(false)

package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class OracleDemo12 {public static void main(String[] args) throws Exception{Connection con =null;try{con = DBUtils.openConnection();con.setAutoCommit(false);PreparedStatement stmt = con.prepareStatement("update pay set money = money-500 where id=10");int n  = stmt.executeUpdate();System.out.println(n+"行"+"id = 10  money -500");if (true) {throw new Exception("模仿异常");}PreparedStatement stmt2 = con.prepareStatement("update pay set money = money+500 where id=100");stmt2.executeUpdate();System.out.println("id = 100 money +500");con.commit();}catch(Exception e){con.rollback();e.printStackTrace();}finally{if(con!=null){con.close();}}}
}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class OracleDemo12 {public static void main(String[] args) throws Exception{Connection con =null;try{con = DBUtils.openConnection();con.setAutoCommit(false);PreparedStatement stmt = con.prepareStatement("update pay set money = money-500 where id=10");int n  = stmt.executeUpdate();System.out.println(n+"行"+"id = 10  money -500");PreparedStatement stmt2 = con.prepareStatement("update pay set money = money+500 where id=100");stmt2.executeUpdate();System.out.println("id = 100 money +500");con.commit();}catch(Exception e){con.rollback();e.printStackTrace();}finally{if(con!=null){con.close();}}}
}



连接池技术

    别自己写 用开源的  

    Oracle 

        weblogic 

    阿里

          Druid 

    Apache Commons

        DBCP

        POOL

        LOGGING



    连接池是一个软件 管理一系列已经建立好的连接 可以节省连接频繁建立的开销,一些牛X的连接池还可以根据当时的用户访问量动态的改变所管理连接的数目

    在应用了连接池以后

    con.close()

    只是将连接 还给连接池,不在是真正的关闭掉了

    

package jdbc;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;import org.apache.commons.dbcp2.BasicDataSource;public class DBUtils2 {private static String driver;private static String url;private static String user;private static String pass;private static BasicDataSource ds;static{Properties props = new Properties();try {props.load(DBUtils.class.getClassLoader().getResourceAsStream("jdbc/db.properties"));driver= props.getProperty("driver");url= props.getProperty("url");user= props.getProperty("user");pass= props.getProperty("pass");ds = new BasicDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(user);ds.setPassword(pass);} catch (IOException e) {e.printStackTrace();} }public static Connection getConnection() throws Exception{return ds.getConnection();}
}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;public class OracleDemo13 {public static void main(String[] args) throws Exception{Connection con = DBUtils2.getConnection();String sql = "insert into emp100(id,name) values(?,?)";PreparedStatement stmt = con.prepareStatement(sql);//批量插入for(int i =1;i<=10000000;i++){stmt.setInt(1, i);stmt.setString(2, "M"+i);stmt.addBatch();//添加批处理if(i%20000==0){stmt.executeBatch();System.out.println(i);}}stmt.executeBatch();//执行批处理con.close();}
}


DAO 

    Data Access Object

 专门用来访问数据库的程序=》 数据访问层 (Data Access Layer) 



    1》实体类

        和数据表对应的类,一般只包含数据和对数据的基本访问方法(setter,getter)

        一般情况下:一个实体类对应一个表

               一个实体类的对象 对应表中的一行数据

    2》DAO类

        负责对数据库的CRUD(增删改查)

        封装所有对数据库的操作 供其它模块的程序调用

        一帮情况是 一个表对一个DAO类

        DAO 中有很多的方法,每个方法都是对数据库的一种操作

    3》数据连接工具

        用于封装对数据库连接的获取


完整的参考下面(  第一个 )  后面还有改版.

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@c1.zongxuan.online:1521:xx
user=scott
pass=xxxxx
package jdbc;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;import org.apache.commons.dbcp2.BasicDataSource;public class DBUtils {private static String driver;private static String url;private static String user;private static String pass;private static BasicDataSource ds;static{Properties props = new Properties();try {props.load(DBUtils.class.getClassLoader().getResourceAsStream("jdbc/db.properties"));driver= props.getProperty("driver");url= props.getProperty("url");user= props.getProperty("user");pass= props.getProperty("pass");ds = new BasicDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(user);ds.setPassword(pass);} catch (IOException e) {e.printStackTrace();} }public static Connection getConnection() throws Exception{return ds.getConnection();}public static void main(String[] args) throws Exception{Connection con = getConnection();System.out.println(con);}}
package jdbc;public class Dept {private int deptno;private String dname;private String loc;public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class DeptDAO {private static final String FIND_ALL="select deptno,dname,loc from dept";private static final String FIND_BY_LOC="select deptno,dname,loc from dept where loc=?";private static final String ADD="insert into dept(deptno,dname,loc) values(?,?,?)";public List<Dept> finaALL() throws Exception{List<Dept> list;Connection con = null;try {con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(FIND_ALL);ResultSet rs = stmt.executeQuery();list = new ArrayList<Dept>();while(rs.next()){list.add(toDept(rs));}return list;} catch (Exception e) {e.printStackTrace();throw e;}finally{if(con != null){con.close();}}}public List<Dept> findByLoc(String loc) throws Exception{List<Dept> list;Connection con = null;try {con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(FIND_BY_LOC);stmt.setString(1,loc);ResultSet rs = stmt.executeQuery();list = new ArrayList<Dept>();while(rs.next()){list.add(toDept(rs));}return list;} catch (Exception e) {e.printStackTrace();throw e;}finally{if(con != null){con.close();}}}public void Add(Dept dept) throws Exception{Connection con = null;try{con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(ADD);stmt.setInt(1, dept.getDeptno());stmt.setString(2, dept.getDname());stmt.setString(3, dept.getLoc());stmt.executeUpdate();}catch(Exception e){e.printStackTrace();throw e;}}/*** 从结果集中取出数据封装成实体对象* @throws SQLException * */private Dept toDept(ResultSet rs) throws SQLException{Dept dept = new Dept();dept.setDeptno(rs.getInt("deptno"));dept.setDname(rs.getString("dname"));dept.setLoc(rs.getString("loc"));return dept;}}
package jdbc;import java.math.BigDecimal;
import java.sql.Date;public class Emp {//FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";private int empno;private String ename;private Date hireDate;private BigDecimal sal;private String job;private int mgr;private int comm;private int deptno;public int getEmpno() {return empno;}public void setEmpno(int empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public Date getHireDate() {return hireDate;}public void setHireDate(Date hireDate) {this.hireDate = hireDate;}public BigDecimal getSal() {return sal;}public void setSal(BigDecimal sal) {this.sal = sal;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public int getMgr() {return mgr;}public void setMgr(int mgr) {this.mgr = mgr;}public int getComm() {return comm;}public void setComm(int comm) {this.comm = comm;}public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class EmpDAO {private static final String FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";private static final String FIND_BY_LOC="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename=?";private static final String ADD="insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?)";public List<Emp> finaALL() throws Exception{List<Emp> list;Connection con = null;try {con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(FIND_ALL);ResultSet rs = stmt.executeQuery();list = new ArrayList<Emp>();while(rs.next()){list.add(toEmp(rs));}return list;} catch (Exception e) {e.printStackTrace();throw e;}finally{if(con != null){con.close();}}}public List<Emp> findByLoc(String ename) throws Exception{List<Emp> list;Connection con = null;try {con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(FIND_BY_LOC);stmt.setString(1,ename);ResultSet rs = stmt.executeQuery();list = new ArrayList<Emp>();while(rs.next()){list.add(toEmp(rs));}return list;} catch (Exception e) {e.printStackTrace();throw e;}finally{if(con != null){con.close();}}}public void Add(Emp emp) throws Exception{Connection con = null;try{con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(ADD);stmt.setInt(1, emp.getEmpno());stmt.setString(2, emp.getEname());stmt.setString(3, emp.getJob());stmt.setInt(4, emp.getMgr());stmt.setDate(5, emp.getHireDate());stmt.setBigDecimal(6, emp.getSal());stmt.setInt(7, emp.getComm());stmt.setInt(8, emp.getDeptno());stmt.executeUpdate();}catch(Exception e){e.printStackTrace();throw e;}}/*** 从结果集中取出数据封装成实体对象* @throws SQLException * *///FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";private Emp toEmp(ResultSet rs) throws SQLException{Emp emp = new Emp();emp.setEmpno(rs.getInt("empno"));emp.setEname(rs.getString("ename"));emp.setJob(rs.getString("job"));emp.setMgr(rs.getInt("mgr"));emp.setHireDate(rs.getDate("hiredate"));emp.setSal(rs.getBigDecimal("sal"));emp.setComm(rs.getInt("comm"));emp.setDeptno(rs.getInt("deptno"));return emp;}
}
package jdbc;import org.junit.Test;public class TestDeptDAO {@Testpublic void testFinadAll() throws Exception{for(Dept l:new DeptDAO().finaALL()){System.out.println(l.getDeptno()+","+l.getDname()+","+l.getLoc());}}@Testpublic void testFinadByLoc() throws Exception{for(Dept l:new DeptDAO().findByLoc("DALLAS")){System.out.println(l.getDeptno()+","+l.getDname()+","+l.getLoc());}}@Testpublic void testAdd() throws Exception{Dept dept = new Dept();dept.setDeptno(60);dept.setDname("RD");dept.setLoc("SH");new DeptDAO().Add(dept);}}
package jdbc;import org.junit.Test;public class TestEmpDAO {
//	private static final String FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";@Testpublic void test() throws Exception {for(Emp l:new EmpDAO().finaALL()){System.out.println(l.getEmpno()+","+l.getEname()+","+l.getJob()+","+l.getMgr()+","+l.getHireDate()+","+l.getSal()+","+l.getComm()+","+l.getDeptno());}}}








优化一下:

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@c1.zongxuan.online:1521:xx
user=scott
pass=xxxxx
package jdbc;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;import org.apache.commons.dbcp2.BasicDataSource;public class DBUtils {private static String driver;private static String url;private static String user;private static String pass;private static BasicDataSource ds;static{Properties props = new Properties();try {props.load(DBUtils.class.getClassLoader().getResourceAsStream("jdbc/db.properties"));driver= props.getProperty("driver");url= props.getProperty("url");user= props.getProperty("user");pass= props.getProperty("pass");ds = new BasicDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(user);ds.setPassword(pass);} catch (IOException e) {e.printStackTrace();} }public static Connection getConnection() throws Exception{return ds.getConnection();}public static void main(String[] args) throws Exception{Connection con = getConnection();System.out.println(con);}}
package jdbc;import java.math.BigDecimal;
import java.sql.Date;public class Emp {//FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";private int empno;private String ename;private Date hireDate;private BigDecimal sal;private String job;private int mgr;private int comm;private int deptno;public int getEmpno() {return empno;}public void setEmpno(int empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public Date getHireDate() {return hireDate;}public void setHireDate(Date hireDate) {this.hireDate = hireDate;}public BigDecimal getSal() {return sal;}public void setSal(BigDecimal sal) {this.sal = sal;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public int getMgr() {return mgr;}public void setMgr(int mgr) {this.mgr = mgr;}public int getComm() {return comm;}public void setComm(int comm) {this.comm = comm;}public int getDeptno() {return deptno;}public void setDeptno(int deptno) {this.deptno = deptno;}}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;public abstract class BaseDAO {//封装查询  修饰符protected//sql语句//参数protected List query(String sql,Object[] o) throws Exception{Connection con  = null;try {con = DBUtils.getConnection();PreparedStatement stmt = con.prepareStatement(sql);if(o != null){for(int i =0;i<o.length;i++){stmt.setObject(i+1, o[i]);//JDBC 帮你判断具体的参数类型}}ResultSet rs = stmt.executeQuery();List list = new ArrayList();while(rs.next()){list.add(toEntity(rs));}return list;} catch (Exception e) {e.printStackTrace();throw e;}finally{if(con != null){con.close();}}}//不同的子类用不通的方法吧结果集中的数据转换public abstract Object toEntity(ResultSet rs) throws Exception;}
package jdbc;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class EmpDAO extends BaseDAO {private static final String FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";private static final String FIND_BY_ENAME="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename=?";private static final String ADD="insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?)";public Object toEntity(ResultSet rs) throws Exception{Emp emp = new Emp();emp.setEmpno(rs.getInt("empno"));emp.setEname(rs.getString("ename"));emp.setJob(rs.getString("job"));emp.setMgr(rs.getInt("mgr"));emp.setHireDate(rs.getDate("hiredate"));emp.setSal(rs.getBigDecimal("sal"));emp.setComm(rs.getInt("comm"));emp.setDeptno(rs.getInt("deptno"));return emp;}public List<Emp> finadAll() throws Exception{return (List<Emp>)query(FIND_ALL, null);}public List<Emp> finadByEname(String ename) throws Exception{return (List<Emp>)query(FIND_BY_ENAME,new Object[]{ename});}}
package jdbc;import org.junit.Test;public class TestEmpDAO {
//	private static final String FIND_ALL="select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";@Testpublic void testFinadAll() throws Exception {for(Emp l:new EmpDAO().finadAll()){System.out.println(l.getEmpno()+","+l.getEname()+","+l.getJob()+","+l.getMgr()+","+l.getHireDate()+","+l.getSal()+","+l.getComm()+","+l.getDeptno());}}@Testpublic void testFinaByLoc() throws Exception {for(Emp l:new EmpDAO().finadByEname("SCOTT")){System.out.println(l.getEmpno()+","+l.getEname()+","+l.getJob()+","+l.getMgr()+","+l.getHireDate()+","+l.getSal()+","+l.getComm()+","+l.getDeptno());}}}


这篇关于Java40: 数据库四(Oracle)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134233

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听