JDBC 是一种java 数据库连接技术,能实现java程序对各种数据库的访问。由一组使用java 语言编写的类和接口组成,这些类和接口称为JDBC API,他们位于包java.sql 以及javax.sql中。这也是最最原始的java连接数据库的方式。以后的Hibernate 、mybatis等等都是对这一技术的封装而已。下面来详细讲解下JDBC 的相关操作技术:
先来了解一下需要掌握的理论知识
一、JDBC 的主要作用
1.建立与数据库之间的访问连接。
2.将编写好的SQL 语句发送到数据库执行。
3.对数据库返回的执行结果进行处理。
二、JDBC 的工作原理
将自己编写的java 应用程序使用java.sql和javax.sql 包中的JDBC API 来连接和操作数据库。
三、JDBC API 工作的五个重要环节
1.DriverManager 类: 依据数据库的不同,管理JDBC 驱动,即跟踪已注册的驱动程序,当调用getConnection()方法时它会搜索整个驱动程序列表找到能够连接的只i的那个的驱动程序对数据库进行连接,主要分为 ORACLE 的驱动类 Mysql 的驱动类,
语法为 Class.forName("JDBC 驱动类的完整路径”)。
2.Connection接口:负责连接数据库并担任传送数据的任务。这个接口是最最重要的一环,他是调DriverManager 类里的方法连接的 ,直接通过这一步来连接的数据库。
语法为 Connection con = DriverManager.getConnection(数据库的url ,连接的数据库用户名、密码); 数据库的url 不同的数据库有不同的写法的。用户名和密码是可选的,但一般都需要的。
3.Statement接口: 负责执行SQL 语句,这一步是向连接好的数据库传递 编写的SQL 并予以执行。这一步是调用Connection接口的实现 的方法来执行的。
语法 Statement stmt = connection.createStatement9();
4.ResultSet接口:负责保存Statement执行后所产生的查询结果。这是最终的结果所得 根据最后三个字母Set可以知道,最后得到的其实是一个集合,但是一种类似与键值对的,通过 他的实现的 next()方法判断是否为空,通过getString("字段名") 取值,取出的都是String 类型的,当然也有例外 日期 用getTimestamp("日期字段名")方法来取,取出的是Timestamp 类型的,id用getInt("id")方法取 ,取出的是INT 类型的
语法,ResultSet rs = stmt.executeQuery(sql)
while(rs.next()){
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp time =rs. getTimestamp("creatdate");
......
}
5.释放资源。即对使用的接口进行非空判断,予以关闭。
语法 if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null){
connection.close();
}
下面直接上一段代码:
public class TestJdbc {
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:news", "scott", "tiger");
String sql = "select * from news_detail";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp time =rs. getTimestamp("creatdate");
......
}catch (SQLException e) {
e.printStackTrace();
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null){
connection.close();
}
}
}
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:news", "scott", "tiger");
String sql = "select * from news_detail";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp time =rs. getTimestamp("creatdate");
......
}catch (SQLException e) {
e.printStackTrace();
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null){
connection.close();
}
}
}
像上面把所有的信息都写在代码里有一个很大的问题,如果数据库一旦做了改动 ,还得去改动代码,这样肯定是不好的。所以有一种方式就是将数据库的连接信息写在一个配扩展名为 properties的配置文件里,然后通过一些工具类将配置文件的信息读取到代码中。
一、配置文件的创建
先建个 扩展名为properties 的文件
写入数据库连接的信息,在配置文件中采用key_value 对应的方式进行类容的组织,关键代码:
jdbc.driver_class = oacle.jdbc.driver.OrecleDriver
jdbc.connection.url=jdbc:oracle:thin:@localhost:1521:news
jdbc.connection.username=scott
jdbc.connection.password=tiger
那么要如何读取,需要写一个工具类, 使用Properties对象的load()方法来实现,还需要用到流来实现对文件的操作。但此处的流是通过 类的对象的getClassLoader()方法得到一个类的加载器在用加载器的getResourceAsStream("")方法读取流信息。例:ConfigManager.class.getClassLoader).getResourceAsStrem("配置文件名"),下面直接上一个数据库访问的工具类代码:
public class ConfigManager {
private static ConfigManager configManager;
private static Properties properties;
private ConfigManager(){
String configFile = "database.properties";
properties = new Properties();
InputStream in = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
properties.load(in); //里面存的是键值对的形式,可用getProperty("")方法获取,后面有相应方法;
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通过单例模式设置实例化的个数
public static ConfigManager getInstance(){
if(configManager==null){
configManager = new ConfigManager();
}
return configManager;
}
//通过key获取对应的value
public String getString(String key){
return properties.getProperty(key);
}
private static ConfigManager configManager;
private static Properties properties;
private ConfigManager(){
String configFile = "database.properties";
properties = new Properties();
InputStream in = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
properties.load(in); //里面存的是键值对的形式,可用getProperty("")方法获取,后面有相应方法;
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通过单例模式设置实例化的个数
public static ConfigManager getInstance(){
if(configManager==null){
configManager = new ConfigManager();
}
return configManager;
}
//通过key获取对应的value
public String getString(String key){
return properties.getProperty(key);
}
}
工具类写好后就可以,运用起来读取配置文件信息然后放到代码里面实现数据库的访问了。下面上代码:
String driver = ConfigManager.getInstance().getString("jdbc.driver_class");
String url = ConfigManager.getInstance().getString("jdbc.connectin.url");
String username = ConfigManager.getInstance().getString("jdbc.connection.username");
String password = ConfigManager.getInstance().getString("jdbc.connection.password");
try{
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
String sql = "select * from news_detail";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp time =rs. getTimestamp("creatdate");
......
}catch (SQLException e) {
e.printStackTrace();
// TODO: handle exception
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null){
connection.close();
}
}
}
String url = ConfigManager.getInstance().getString("jdbc.connectin.url");
String username = ConfigManager.getInstance().getString("jdbc.connection.username");
String password = ConfigManager.getInstance().getString("jdbc.connection.password");
try{
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
String sql = "select * from news_detail";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp time =rs. getTimestamp("creatdate");
......
}catch (SQLException e) {
e.printStackTrace();
// TODO: handle exception
}finally{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(connection!=null){
connection.close();
}
}
}
}