javawebday46(大数据【存储大的文件】事件类型 time批处理 batch)
2018-03-09 13:03
477 查看
UserDao 修改项目 1、把UserDao修改为接口,然后把原来的UserDao修改类名为UserDaoImp 2、修改UserService中对UserDao的实例化:private UserDao userDao = Daofactory.getUserDao(); 1、DAO模式 DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)直接 实体域,即操作的对象,例如我们操作的是user表,那么就需要先写一个User类 DAO模式需要先提供一个DAO接口 然后再提供一个DAO接口的实体类 再编写一个DAO工厂,Service通过工厂来获取DAO实现 时间类型 SQL包下相关时间的方法 java.sql.ResultSet#java.sql.Date.getDate() java.sql.PreparedStatement#setDate(int col,java.sql.Data date) 例如 user.setBirthday(rs.getDate("birthday"));其中rs.getDate()方法返回的是java.sql.Date而User的birthday必须是java.util.Date类型。把sql包的Date赋给util包下的Date这是子类给父类,不用强转 例如:pstmt.setDate(3,user.getBirthday())其中user.getBirthday() 返回的是util包下的Date,而setDate()方法的参数类型是sql包下的Date,这说明需要把utilDate转换成sqlDate。这需要处理类型转换问题 pstmt.setDate(3,new java.sql.Date(user.getBirthday().getTime())) 数据库类型与java中类型的对应关系 DATE->java.sql.Date TIME->java.sql.Time TIMESTAMP->java.sql.TimeStamp 领域对象(domain)中的所有属性不能出现java.sql包下的东西。即不能使用java.sql.Date ResultSet#getDate()返回的是java.sql.Date() PreparedStatement#setDate(int,Date) 其中第二个参数也是java.sql.Date 时间类型的转换 java.util.Date->java.sql.Date、Time、Timestamp 把util的Date转换成毫秒值 使用毫秒值创建sql的Date、Time、Timestamp java.sql.Date、Time、Timestamp->java.util.Date 不需要处理了:因为java.sql.Date是java.util.Date java.util.Date date = new java.sql.Date();儿子给爸爸 不用转换 java.util.Date date = new java.util.Date(); long l = date.getTime(); java.sql.Date sqlDate = new java.sql.Date(l); Java中的时间类型 java.sql包中给出三个与数据库相关的日期时间类型,分别是 Date:表示日期,只有年月日,没有时分秒。会丢失事件 Time:表示时间,只有时分秒,没有年月日。会丢失日期 Timestamp:表示时间戳,有年月日时分秒,以及毫秒 这三个类都是java.util.Date的子类 大数据 目标:把mp3保存到数据库中 在my.ini中添加如下配置 max_allowed_packet=10485760 1、什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据。标准sql提供了如下类型来保存大数据类型 类型 长度 tinyblod 2^8-1B(256B) blob 2^16-1B(64K) mediumblob 2^24-1B(16M) longblob 2^32-1B(4G) tinyclod 2^8-1B(256B) clob 2^16-1B(64K) mediumclob 2^24-1B(16M) longclob 2^32-1B(4G) 但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据 tinytext 2^8-1B(256B) text 2^16-1B(64K) mediumtext 2^24-1B(16M) longtext 2^32-1B(4G) 批处理 感觉就像在小黑屏运行已经写好的sql语句 select * from ab; mysql -uroot -p -D db1 < c:/batchmysql/batchfile2.txt >c:/batchmysql/mysql0716.out db1是数据库 < 查询 >输出结果保存在xxx地方 mysql -uroot -p123 -D db1 < d:/batch.txt
/** * 大数据 * @author Administrator * */ public class Demo4 { /* * 把mp3保存到数据库中 */ @Test public void fun1() throws SQLException, Exception{ /* * 1、得到Connection * 2、给出sql模版,创建pstmt * 3、设置sql模版中的参数 * 4、调用pstmt的executeUpdate()执行 */ Connection con = JdbcUtils.getConnections(); String sql = "insert into tab_bin values(?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "together.mp3"); /* * 需要得到Blob * 1、我们有的是文件,目标是Blob de01 * 2、先把文件变成byte[] * 3、在使用byte[]创建Blob */ //把文件转换成byte[] byte[] bytes = IOUtils.toByteArray(new FileInputStream("d:/together.mp3")); //使用byte[] 创建blob Blob blob = new SerialBlob(bytes); // pstmt.setBlob(3, blob); pstmt.executeUpdate(); } /* * 从数据库中读取mp3 */ @Test public void fun2() throws Exception{ /* * 1、创建Connection */ Connection con = JdbcUtils.getConnections(); /* * 2、给出select语句模版,创建pstmt */ String sql ="select * from tab_bin"; PreparedStatement pstmt = con.prepareStatement(sql); /* * 3、pstmt执行查询,得到ResultSet */ ResultSet rs = pstmt.executeQuery(); /* * 4、获取rs中data的列数据 */ if(rs.next()){ Blob blob = rs.getBlob("data"); /* * 把blob变成硬盘上的文件 */ /* * 1、通过Blob得到输入流对象 * 2、自己创建输出流对象 * 3、把输入流的数据写入到输出流中 */ InputStream in = blob.getBinaryStream(); OutputStream out = new FileOutputStream("d:/abc.mp3"); IOUtils.copy(in, out); } } /** * 使用Statement来进行批处理 */ @Test public void fun3(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = JdbcUtils.getConnections();//自己写的工具类不要误解 String sql1 = "insert into student values (1,'a')"; String sql2 = "insert into student values (2,'b')"; String sql3 = "delete from student where id = 2"; stmt = conn.createStatement();//这种方式,如果sql语句有上百条以上,那就要有很多次addBatch。很麻烦 stmt.addBatch(sql1); stmt.addBatch(sql2); stmt.addBatch(sql3); int[] results = stmt.executeBatch();// 获得三条语句每条执行后影响的行数。形成一个数组 for (int r : results) { System.out.println(r);// 结果是三个1 } } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtils.release(rs, stmt, conn);//工具类,释放连接 } } /** * 使用PreparedStatement来进行预处理 */ @Test public void fun4(){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = JdbcUtils.getConnections(); String sql = "insert into student values (?,?)"; stmt = conn.prepareStatement(sql); for(int i=0;i<100;i++){ stmt.setInt(1, i+1); stmt.setString(2, "bbb");//参数数据,实际应用时,可以通过别的方式进行赋值。 stmt.addBatch(); } stmt.executeBatch(); } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtils.release(rs, stmt, conn); } } /** * 缓存需要注意清除溢出 */ @Test public void fun5(){ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = JdbcUtils.getConnections(); String sql = "insert into student values (?,?)"; stmt = conn.prepareStatement(sql); for (int i = 0; i < 1000000; i++) {// 时间较长 stmt.setInt(1, i + 1); stmt.setString(2, "aaa"); stmt.addBatch(); if ((i + 1) % 1000 == 0) { stmt.executeBatch();// 每执行1000次就清一次sql缓存 stmt.clearBatch(); // 否则每一次是执行1000,2000,3000...条sql语句而不是每一次执行1000条 } } stmt.executeBatch();// 最后少于1000条sql语句也要执行。 } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtils.release(rs, stmt, conn); } } }
public class JdbcUtils { private static Properties props = null; //只在JdbcUtils类被加载一次 static{ //props进行初始化,即加载dbconfig.properties文件到props对象中 try { /* * 1.加载配置文件 * 2、加载驱动类 * 3、调用DriverManager.getConnection() */ //加载配置文件 InputStream in = JdbcUtils.class.getClassLoader() .getResourceAsStream("dbconfig.properties"); props = new Properties(); props.load(in); } catch (IOException e) { throw new RuntimeException(e); } try { //加载驱动类 Class.forName(props.getProperty("driverClassName")); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } //获取连接 public static Connection getConnections() throws SQLException{ //得到Connection return DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password")); } public static void release(ResultSet rs,Statement st,Connection conn){ try { if(rs!=null) rs.close(); if(st!=null) st.close(); if(conn!=null) conn.close(); } catch (SQLException e) { throw new RuntimeException(e); } } }
相关文章推荐
- Java中基本数据类型的存储方式和相关内存的处理方式
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
- Java中基本数据类型的存储方式和相关内存的处理方式
- Java中基本数据类型的存储方式和相关内存的处理方式
- 使用Java来处理C++存储在数据库中的Blob数据。
- MongoDB在java中的操作-添,删,查 基本数据 文件存储 可使用
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- Json树形结构数据转Java对象并存储到数据库的实现-超简单的JSON复杂数据处理
- 使用OLEDB方式读取Excel文件到DataTable中数据类型的处理
- 保存数据(2)java 原生文件存储示例
- 关于使用java从http接口取数据保存到本地文件的中文乱码处理
- JAVA 文件上传后台判断浏览器的类型以及JDK1.5和1.6处理的不同
- java 用jxl导出XLS文件,大量数据多个sheet存储
- Hibernate配置文件映射java数据基本类型
- 强类型的数据集,在处理以直接附加方式的SQLServer的MDF文件时无法更新数据-原因分析
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式