Java Database Connectivity:Java访问数据库的解决方案。
JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者但愿用相同的方式访问不一样的数据库,以实现与具体数据库无关的Java操做界面。
JDBC定义了一套标准接口,即访问数据库的通用API,不一样的数据库厂商根据各自数据库的特色去实现这些接口。
JDBC中定义了一些接口:
一、驱动管理:
DriverManager
二、链接接口
Connection
DatabasemetaData
三、语句对象接口
Statement
PreparedStatement
CallableStatement
四、结果集接口
ResultSet
ResultSetMetaData
JDBC只定义接口,具体实现由各个数据库厂商负责。
程序员使用时只须要调用接口,实际调用的是底层数据库厂商的实现部分。
JDBC访问数据库的工做过程:
加载驱动,创建链接
建立语句对象
执行SQL语句
处理结果集
关闭链接
要使用JDBC接口,须要先将对应数据库的实现部分(驱动)加载进来。
驱动类加载方式(Oracle):
Class.forName("oracle.jdbc.driver.OracleDriver");
这条语句的含义是:装载驱动类,驱动类经过static块实如今DriverManager中的“自动注册”。java
Connection接口负责应用程序对数据库的链接,在加载驱动以后,使用url、username、password三个参数,建立到具体数据库的链接。
Class.forName("oracle.jdbc.OracleDriver") //根据url链接参数,找到与之匹配的Driver对象,调用其方法获取链接 Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.26:1521:tarena", "openlab","open123");
须要注意的是:Connection只是接口,真正的实现是由数据库厂商提供的驱动包完成的。程序员
Statement接口用来处理发送到数据库的SQL语句对象,经过Connection对象建立。主要有三个经常使用方法:
Statement stmt=conn.createStatement(); //1.execute方法,若是执行的sql是查询语句且有结果集则返回true,若是是非查询语句或者没有结果集,返回false boolean flag = stmt.execute(sql); //2.执行查询语句,返回结果集 ResultSetrs = stmt.executeQuery(sql); //3.执行DML语句,返回影响的记录数 int flag = stmt.executeUpdate(sql);
执行查询SQL语句后返回的结果集,由ResultSet接口接收。
经常使用处理方式:遍历 / 判断是否有结果(登陆)。
String sql = "select * from emp"; ResultSetrs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getInt("empno")+",“ +rs.getString("ename") ); }
查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。sql
ResultSet表明DQL查询结果,是2维结果. 其内部维护了一个读取数据的游标,默认状况在,游标在第一行数据以前, 当调用next() 方法时候, 游标会向下移动,并将返回结果集中是否包含数据, 若是包含数据就返回true. 结果集还提供了很好getXXX方法用于获取结果集游标指向当前行数据.数据库
原理:oracle
案例:工具
/** * 执行DQL 语句 */ public class Demo03 { public static void main(String[] args) throws Exception{ //注册驱动 String driver="oracle.jdbc.OracleDriver";; Class.forName(driver); //链接数据库 String url="jdbc:oracle:thin:@192.168.201.227:1521:orcl"; String user="openlab"; String pwd="open123"; Connection conn=DriverManager.getConnection( url, user, pwd); //建立Statement Statement st=conn.createStatement(); //执行SQL(dql) String sql="select id, name " + "from robin_demo "; ResultSet rs=st.executeQuery(sql); //处理结果 ... //rs结果集中包含一个游标,游标默认在结果集 //的第一行以前 //rs.next():移动结果集游标到下一行 //检查是否有数据, 若是有返回true, 不然false while(rs.next()){ //getXXX(列名): 返回结果集当前行中 // 指定列名的数据. int id = rs.getInt("id"); String name=rs.getString("name"); //输出查询结果 System.out.println(id+","+name); } //关闭链接 conn.close(); } }
Properties 是Java中专门用于读取配置文件的API.url
Properties 经常使用API方法:spa
使用步骤:设计
案例, 读取配置文件:指针
在resource 文件夹中添加配置文件 db.properties:
# db.properties jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl jdbc.username=openlab jdbc.password=open123
使用Properties读取配置文件内容:
public class Demo05 { public static void main(String[] args) throws IOException{ // Properties 就是为了读取 // *.properties 文件而设计的API // 其底层就是文本文件IO // Properties 自己 实现 Map接口 // 内部是散列表, 限定了key和Value都是 // String 类型. //方法: load(流) 将文件就读取为散列表 //String getProperty(key) 查询value //使用步骤 //1 建立 Properties 对象 Properties cfg = new Properties(); System.out.println(cfg); System.out.println(cfg.size()); System.out.println(cfg.isEmpty()); //2\. 利用load方法读取文件 InputStream in= Demo05.class.getClassLoader() .getResourceAsStream("db.properties"); //执行之后,将文件内容读取到散列表中了 cfg.load(in); System.out.println(cfg); System.out.println(cfg.size()); //3\. 查找文件内容, 就是读取文件内容 String s= cfg.getProperty("jdbc.driver"); System.out.println(s); } }
利用配置文件能够将程序中的参数保存到配置文件中, 修改程序参数只须要修改配置文件便可.
在软件中数据库链接使用很是频繁, 若是每次都建立链接, 就会形成代码的大量冗余, 常规的作法是创建数据库链接工具类, 封装数据库链接过程, 统一数据库链接过程, 使用时候就能够简化代码.
实现步骤:
建立DbUtils.java 封装数据库链接方法
# db.properties jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl jdbc.username=openlab jdbc.password=open123
public class DbUtils { static String driver; static String url; static String username; static String password; //读取文件中的数据库链接参数 static{ //初始化静态属性 //1\. 利用Properties 读取配置文件 //2\. 从配置文件中查找 相应参数值 try{ Properties cfg=new Properties(); InputStream in= DbUtils.class.getClassLoader() .getResourceAsStream("db.properties"); cfg.load(in); System.out.println(cfg); //初始化 链接参数 driver=cfg.getProperty("jdbc.driver"); url=cfg.getProperty("jdbc.url"); username=cfg.getProperty("jdbc.username"); password=cfg.getProperty("jdbc.password"); in.close(); }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } /** * 封装建立数据库链接的过程 * 简化数据库链接 */ public static Connection getConnection(){ try{ Class.forName(driver); Connection conn= DriverManager.getConnection( url, username, password); return conn; }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } //DbUtils.java /* * 关闭数据库的链接方法, 封装复杂的关闭过程 */ public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
说明:
public class Demo06 { public static void main(String[] args) { Connection conn=null; try{ conn=DbUtils.getConnection(); Statement st=conn.createStatement(); String sql="select * from robin_demo"; ResultSet rs=st.executeQuery(sql); while(rs.next()){ int id=rs.getInt("id"); String name=rs.getString("name"); System.out.println(id+","+name); } rs.close();//释放查询结果 st.close();//释放语句对象 }catch(Exception e){ e.printStackTrace(); }finally { DbUtils.close(conn); } } }
显然: 使用DbUtils能够简化JDBC代码的书写.
这个代码中在finally中关闭数据库链接, 其好处是可靠关闭链接.
最后,若是你们对这些内容感兴趣的话能够持续关注我,天天都有更新喔~
固然,须要以往的内容也能够找我阅读哦,我这里都整合起来了方便你们阅读,详情点击这里!!!