JDBC连接oracle的实例
好久没写过jdbc,基本忘干净了,随意插一个图,简单学习一下。然后干别的。。。。。
使用jdbc操作数据库步骤是固定的
1.将驱动包导入到数据库,每一个数据库的驱动包都不一样,下面我提供一个Oracle数据库的驱动包http://download.csdn.net/detail/hncsy403/4530830将它下载后放入web项目中的 web-inf中的lib中
2.选择项目右键,选择Build Bath,在libraries中add JARs,选择刚才的jar包
学生类bean
package jdbc.bean; import java.util.Date; public class Student { private int id;
private String name;
private String password;
private String sex;
private int age;
private Date birthday;
private String memo;
private String photo;
private Date regTime; public int getAge() {
return age;
} public Date getBirthday() {
return birthday;
} public int getId() {
return id;
} public String getMemo() {
return memo;
} public String getName() {
return name;
} public String getPassword() {
return password;
} public String getPhoto() {
return photo;
} public Date getRegTime() {
return regTime;
} public String getSex() {
return sex;
} public void setAge(int age) {
this.age = age;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public void setId(int id) {
this.id = id;
} public void setMemo(String memo) {
this.memo = memo;
} public void setName(String name) {
this.name = name;
} public void setPassword(String password) {
this.password = password;
} public void setPhoto(String photo) {
this.photo = photo;
} public void setRegTime(Date regTime) {
this.regTime = regTime;
} public void setSex(String sex) {
this.sex = sex;
} }
工具类:DBUtil
package jdbc.util; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class DBUtil { private static final String driverClass = "oracle.jdbc.driver.OracleDriver";
private static final String jdbcUrl = "jdbc:oracle:thin:@liumo:1521:ORCL";
private static final String user = "test_lm";
private static final String password = "test_lm"; public static Connection getConn() {
// 1.注册驱动
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} // 2.创建Connection(数据库连接对象)
Connection conn = null;
try {
conn = DriverManager.getConnection(jdbcUrl, user, password);
conn.setAutoCommit(false);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
/*
* Connection是Statement的工厂,一个Connection可以生产多个Statement。
* Statement是ResultSet的工厂,一个Statement却只能对应一个ResultSet(它们是一一对应的关系)。
* 所以在一段程序里要用多个ResultSet的时候,必须再Connection中获得多个Statement,然后一个Statement对应一个ResultSet。
*/
return null;
} /**
* 关闭连接(数据库连接对象)
* @param conn
*/
public static void close(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 关闭编译的 SQL 语句的对象
* @param stmt
*/
public static void close(Statement stmt) {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 关闭结果集
* @param rs
*/
public static void close(ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 提交事务
* @param conn
*/
public static void commit(Connection conn) {
try {
if (conn != null) {
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 回滚事务
* @param conn
*/
public static void rollback(Connection conn) {
try {
if (conn != null) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
实际的dao:StudentDao
package jdbc.dao; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import jdbc.bean.Student;
import jdbc.util.DBUtil; public class StudentDao { /**
* 保存
* @param student
*/
public void save(Student student) { Connection conn = DBUtil.getConn(); PreparedStatement pstmt = null;
String sql = " insert into t_student(name,password,sex,age,birthday,memo,photo,reg_time) ";
sql += " values(?,?,?,?,?,?,?,?) ";
try {
pstmt = conn.prepareStatement(sql); pstmt.setString(1, student.getName());
pstmt.setString(2, student.getPassword());
pstmt.setString(3, student.getSex());
pstmt.setInt(4, student.getAge());
pstmt.setDate(5, new java.sql.Date(student.getBirthday().getTime())); // 只存年月日这种形式
pstmt.setString(6, student.getMemo());
try {
// 构建一个输入流存blob
pstmt.setBlob(7, new FileInputStream(student.getPhoto()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
pstmt.setTimestamp(8, new java.sql.Timestamp(student.getRegTime().getTime())); // 完整的时间格式
pstmt.executeUpdate();
DBUtil.commit(conn);
} catch (SQLException e) {
DBUtil.rollback(conn);
e.printStackTrace();
} finally {
DBUtil.close(pstmt);
DBUtil.close(conn);
}
} /**
* 删除
* @param id
*/
public void delete(int id) {
Connection conn = DBUtil.getConn();
PreparedStatement pstmt = null;
String sql = " delete from t_student where id=?";
try {
pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id);
pstmt.executeUpdate();
DBUtil.commit(conn);
} catch (SQLException e) {
DBUtil.rollback(conn);
e.printStackTrace();
} finally {
DBUtil.close(pstmt);
DBUtil.close(conn);
}
} /**
* 批量删除
* @param ids
*/
public void deleteBatch(int[] ids) { Connection conn = DBUtil.getConn();
PreparedStatement pstmt = null;
String sql = " delete from t_student where id=?";
try {
pstmt = conn.prepareStatement(sql);
for (int id : ids) {
pstmt.setInt(1, id);
pstmt.addBatch();
}
pstmt.executeBatch();
DBUtil.commit(conn);
} catch (SQLException e) {
DBUtil.rollback(conn);
e.printStackTrace();
} finally {
DBUtil.close(pstmt);
DBUtil.close(conn);
}
} /**
* 修改
* @param student
*/
public void update(Student student) {
Connection conn = DBUtil.getConn();
PreparedStatement pstmt = null;
String sql = " update t_student set name=?,password=?,sex=?,age=?,birthday=?,memo=?,photo=?,reg_time=? where id=?";
try {
pstmt = conn.prepareStatement(sql); pstmt.setString(1, student.getName());
pstmt.setString(2, student.getPassword());
pstmt.setString(3, student.getSex());
pstmt.setInt(4, student.getAge());
pstmt.setDate(5, new java.sql.Date(student.getBirthday().getTime())); // 只存年月日这种形式
pstmt.setString(6, student.getMemo());
try {
// 构建一个输入流存blob
pstmt.setBlob(7, new FileInputStream(student.getPhoto()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
pstmt.setTimestamp(8, new java.sql.Timestamp(student.getRegTime().getTime())); // 完整的时间格式
pstmt.setInt(9, student.getId()); pstmt.executeUpdate();
DBUtil.commit(conn);
} catch (SQLException e) {
DBUtil.rollback(conn);
e.printStackTrace();
} finally {
DBUtil.close(pstmt);
DBUtil.close(conn);
}
} /**
* 查找
* @param id
* @return
*/
public Student find(int id) {
Connection conn = DBUtil.getConn();
PreparedStatement pstmt = null;
ResultSet resultSet = null;
String sql = " select * from t_student where id=?";
Student student = null;
try {
pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id);
resultSet = pstmt.executeQuery(); if (resultSet.next()) {
student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
student.setBirthday(resultSet.getDate("birthday"));
student.setMemo(resultSet.getString("memo"));
student.setPassword(resultSet.getString("password"));
student.setRegTime(resultSet.getTimestamp("reg_time"));
student.setSex(resultSet.getString("sex"));
InputStream in = resultSet.getBlob("photo").getBinaryStream();
String path = "d:\\ltf.jpg";
try {
OutputStream out = new FileOutputStream(path);
copy(in, out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
student.setPhoto(path);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(resultSet);
DBUtil.close(pstmt);
DBUtil.close(conn);
}
return student;
} private void copy(InputStream in, OutputStream out) {
int i = 0;
try {
while ((i = in.read()) != -1) {
out.write(i);
}
out.flush();
} catch (IOException e) { e.printStackTrace();
}
} /**
* 查询多条记录
* @return
*/
public List<Student> query() {
Connection conn = DBUtil.getConn();
PreparedStatement pstmt = null;
ResultSet resultSet = null;
String sql = " select * from t_student ";
List<Student> studentList = new ArrayList<Student>(); try {
pstmt = conn.prepareStatement(sql); resultSet = pstmt.executeQuery(); while (resultSet.next()) {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
student.setBirthday(resultSet.getDate("birthday"));
student.setMemo(resultSet.getString("memo"));
student.setPassword(resultSet.getString("password"));
student.setRegTime(resultSet.getTimestamp("reg_time"));
student.setSex(resultSet.getString("sex"));
InputStream in = resultSet.getBlob("photo").getBinaryStream();
String path = "d:\\ltf.jpg";
try {
//将数据库存的图片放到磁盘的某个位置
OutputStream out = new FileOutputStream(path);
copy(in, out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
student.setPhoto(path);
studentList.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(resultSet);
DBUtil.close(pstmt);
DBUtil.close(conn);
}
return studentList;
} }
测试类:DaoTest
package jdbc.test;
import static org.junit.Assert.fail; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import jdbc.bean.Student;
import jdbc.dao.StudentDao; import org.junit.Test; public class DaoTest { @Test
public void test() {
fail("Not yet implemented"); Student s=new Student();
//s.setId(3);
s.setName("zss");
s.setPassword("zss");
s.setSex("女");
s.setAge(21);
try {
s.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1980-01-01"));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s.setMemo("我人还不错");
s.setPhoto("c:\\ltf.jpg");
s.setRegTime(new Date()); StudentDao sd=new StudentDao();
//sd.save(s);
//sd.update(s);
//sd.delete(1);
//sd.deleteBatch(new int[]{2,3});
System.out.println(sd.query().size());
} }
每次SQL操作都需要建立和关闭连接,这势必会消耗大量的资源开销,如何避免
分析:可以采用连接池,对连接进行统一维护,不必每次都建立和关闭。事实上这是很多对JDBC进行封装的工具所采用的。(等看到hibernate,spring连接数据库和事务的时候在研究一下。)
参考:
通过JDBC进行简单的增删改查(以MySQL为例) http://www.cnblogs.com/wuyuegb2312/p/3872607.html
JDBC学习之-如何获取Connection http://blog.csdn.net/luohuacanyue/article/details/8770450