Java持久化基础-将数据保存到数据库JDBC连接
之前在学习JavaSE的IO操作时候,我曾将字节、字符或对象保存在一个目标文件,这个目标保存在我的硬盘上,下次可以直接读取目标文件上的内容来恢复我保存对象的状态,可以很好的将内存中瞬时数据转化为持久数据的。但是,随着需求不断增多,繁琐的业务也不断增大,用1个或者几个文件来保存数据远远不能满足,最主要随着业务与业务之间逻辑的增强,我更需要一个结构性强能很好体现数据之间关系的容器来存储管理我的数据,这样我就需要一个数据库。目前,使用较多的关系型数据库有MSSQL、MYSQL、ORACLE、DB2,根据数据管理的存储量不同,使用不同数据库。
一、什么是JDBC
现在有了数据库来为我存储管理数据,我每次只需告诉数据库怎么去维护我的数据,但是我总不能写中文来告诉它怎么做吧,我需要一个通话方式将我的Java程序和数据库连接起来,这个方式就是JDBC(一种用于执行SQL语句的Java API),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
二、JDBC连接数据库
先来看看JDBC连接数据库的步奏:
1、加载驱动程序
Class.forName(driver);
2、创建一个连接对象
Connection conn = DriverManager.getConnection(url, user, password);
3.编写SQL语句 使用问号代替动态的参数
String sql = "......?";
4、 使用连接对象创建预编译语句对象
PreparedStatement pre = conn.preparedStatement();
//这里使用preparedStatement预编译是为了防止SQL注入,没有用Statement
5、按问号出现的位置设置问号的值
pre.setXXX(x,xxx)
6、操作数据或查询数据
pre.executeUpdate();
ResultSet rs = pre.executeQuery();
5、依次关闭各种对象
rs.close();
pre.close();
conn. close();
下面是JDBC连接数据库的实例,可参考注释(没有封装处理):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* JDBC连接Oracle数据
* 连接其它数据只需修改驱动类、驱动和用户、密码
* @author Administrator
*
*/
public class JDBCTest {
private static String CLASSNAME = "oracle.jdbc.driver.OracleDriver"; //驱动类
private static String DRIVER = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; //驱动,填写数据库IP、端口和数据库名
private static String USERNAME = "scott"; //数据库用户名
private static String PWD = "tiger"; //数据库密码
private Connection conn = null; //连接对象
private PreparedStatement ps = null; //预加载对象
private ResultSet rs = null; //结果集
/**
* 获取一个连接对象
* @return
*/
public Connection getConnection(){
try {
Class.forName(CLASSNAME);
} catch (ClassNotFoundException e) {
System.out.println("没有找到驱动类!");
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DRIVER, USERNAME, PWD);
} catch (SQLException e) {
System.out.println("获取连接失败!");
e.printStackTrace();
}
return conn;
}
/**
* 查询操作(一般项目不是返回ResultSet,一般返回封装好的对象集合或单个对象)
* @param sql SQL查询语句
* @param pares 查询条件
* @return
*/
public ResultSet query( String sql,Object[] pares ){
try {
ps = conn.prepareStatement(sql); //预编译SQL
if( 0!=pares.length ){
for( int i = 0; i
ps.setObject(i+1, pares[i]); //循环设置参数
}
}
rs = ps.executeQuery(); //执行查询返回结果集
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
/**
* 增删改操作
* @param sql SQL查询语句
* @param pares 判断条件
* @return
*/
public int edit( String sql, Object[] pares ){
int hasEffect = 0;
try {
ps = conn.prepareStatement(sql); //预编译SQL
if( 0 != pares.length ){
for( int i = 0; i
ps.setObject(i+1, pares[i]); //循环设置参数
}
}
hasEffect = ps.executeUpdate(); //执行增删改返回影响行数
} catch (SQLException e) {
e.printStackTrace();
}
return hasEffect;
}
/**
* 关闭所有对象
* @throws Exception
*/
public void close() throws Exception{
if( rs != null ){
rs.close();
}
if( ps != null ){
ps.close();
}
if( conn != null ){
conn.close();
}
}
/**
* 测试方法
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
JDBCTest jdbc = new JDBCTest();
jdbc.getConnection();
String sql = "select * from ADDDRESSBOOK"; //查询通讯录表的所有列
jdbc.rs = jdbc.query(sql, new Object[]{}); //查询返回结果集
if( jdbc.rs.next() ){
ResultSetMetaData rsm = jdbc.rs.getMetaData(); //用于获取结果集中列的类型和属性信息对象
for( int i = 1; i<=rsm.getColumnCount();i++ ){//遍历输出列字段名称
System.out.print(rsm.getColumnName(i)+" ");
}
}
while( jdbc.rs.next() ){ //遍历结果集输出每一列的值
System.out.println();
System.out.print(jdbc.rs.getString("yname")+" ");
System.out.print(jdbc.rs.getString("sex")+" ");
System.out.print(jdbc.rs.getString("phone")+" ");
System.out.print(jdbc.rs.getString("address"));
}
jdbc.close(); //关闭所有连接等
}
}
运行结果:
YNAME SEX PHONE ADDRESS
王四 男 123311231 广元市
候五 男 13111121231 南充市
李莉 女 13113124111 遂宁市 下面是通讯录表结构: