JDBC_part4_大对象_DAO_Bean_DButi
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** 谢谢配合!
JDBCday04_大对象_Dao_DBUtil_JavaBean
大对象 (一般不用)
clob(海量文字,如图书)
blob(二进制数据,如图片,音乐,电影)
clob海量文字存入数据库 : FileReader(读文本) + PreparedStatement的setCharacterStream方法(以字符输入)
blob图片,音乐存入数据库 : FileInputStream(字节读) + PreparedStatement的setBinaryStream的方法(以二进制输入)
clob海量文字从数据库写到本地磁盘 : FileWriter(文本写出) + PreparedStatement的getCharacterStream(先读再写)方法返回给Reader + FileWrite的write方法
clob图片音频从数据库写到本地磁盘 : FileOutputStream(字节写出) + ResultSet的getBinaryStream获取字节文件传给InputStream,然后创建byte数组,FileOutputStream的write方法写入.
往数据库中存大文本或图片 :
setCharacterStream(int parameterIndex,Reader x)将指定参数设置为给定输入流
File file = new File("D:\\mianshiti.txt");
//图片FileInputStream
FileReader fr = new FileReader(file);
Connection conn = DBUtil.getConnection();
String sql = "insert into t_book(book_id,book_name,book_content) values(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1");
pstmt.setString(2,"面试题");
//图片pstmt.setBinaryStream
pstmt.setCharacterStream(3, fr);
int i = pstmt.executeUpdate();
System.out.println(i);
DBUtil.close(pstmt);
DBUtil.close(conn);
fr.close();
2. 将数据库中的大文件存放到本地
File file = new File("D:\\HA.png");
//输出图片FileOutputStream fos = new FileOutputStream(file);
FileWriter fw = new FileWriter("D:\\haha.txt");
Connection conn = DBUtil.getConnection();
String sql = "select * from t_book";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) {
/*
图片读取
InputStream is = rs.getBinaryStream(4);
byte[] b = new byte[23000];
*/
Reader reader = rs.getCharacterStream(3);
char[] ch = new char[1024];
int length = 0;
//作为整数读取的字符,如果已到达流的末尾,则返回 -1
while((length=reader.read(ch))!=-1) {
fw.write(ch, 0, length);
}
}
fw.close();
DBUtil.close(rs, stmt, conn);
DAO(Database Access Object)数据库访问对象
- 使用数据库访问对象来抽象和封装对数据库的所有访问
- 将底层的数据库访问和上层的业务逻辑分开
Dao怎么用
DAO操作数据库:即在DAO中封装了一个数据表在一个项目中的增、删、改、查的全部动作。
JavaBean
1.JavaBean是一个public类
2.JavaBean提供公共的无参构造方法
3.JavaBean内的属性(字段)都是私有的.这些属性只能通过
优点
1.减少了数据传递间的碎片
2.代码结构清晰
3.便于维护和程序扩展
4.节约了开发周期,避免了重复代码
DBUtil
将数据库的连接和关闭封装在一个类里,在其他类里如果需要开启或者关闭连接,只需要调用DBUtil里的方法,返回一个连接即可。不需要在当前类里写繁琐的代码。
优点
1.代码结构清晰
2.便于维护和程序扩展
3.节约了开发周期,避免了重复代码
查询工资在1-10的员工信息 (分页显示)
SELECT * FROM(
SELECT ROWNUM r,a.* FROM(
SELECT copy_emp.* FROM copy_emp WHERE salary IS NOT NULL ORDER BY salary DESC)a)
WHERE r>0 AND r<=10
分页代码
/**
* 分页显示
*/
public List<EmpBean> showEmpMagByPage(int page,int pageSize) {
Connection conn = DBUtil.getConnection();
String sql = "SELECT * FROM ( " +
" SELECT ROWNUM r,a.* FROM ( " +
" SELECT copy_emp.* FROM copy_emp"+
" WHERE salary IS NOT NULL ORDER BY salary DESC ) a ) " +
" WHERE r>? AND r<=?"; //字符串前边要加空格
PreparedStatement pstmt = null;
//int pageSize = 10;//每页显示条数
int startPage = (page - 1) * pageSize;
int endPage = pageSize * page;
ResultSet rs = null;
List<EmpBean> list = new ArrayList<EmpBean>();
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, startPage);
pstmt.setInt(2, endPage);
rs = pstmt.executeQuery();
while(rs.next()) {
EmpBean bean = new EmpBean();
//bean.getFirstName(rs.getString(1));
bean.setRownum(rs.getInt(1));
bean.setEmpID(rs.getInt(2));
bean.setFirstName(rs.getString(3));
bean.setLastName(rs.getString(4));
bean.setSalary(rs.getDouble(9));
list.add(bean);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//DBUtil.close(rs, pstmt, conn);
DBUtil.close(rs);
DBUtil.close(pstmt);
DBUtil.close(conn);
}
return list;
}