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;
	}
posted @ 2016-10-19 21:49  洛GG  阅读(573)  评论(0编辑  收藏  举报