您的位置:首页 > 大数据

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐