面向接口编程
DAO模式
具体的实现类创建,隐藏在工厂中,
通过工厂类的get方法得到这个接口的实现类的实例
工厂类
返回一个具体的UserDao 的实现类对象
1.给出一个配置文件,文件中给出UserDao接口的实现类名称
2.加载配置文件,获取类名称,然后通过反射来创建这个类对象
加载配置文件,就是键值对的文件,实现类的名称和自己的’‘xxx’’'配对
加载配置文件:
首先,加载一个流
InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("配置文件");
Propeties props = new Properties();
props.load(in);
这样,配置文件信息就到了props中,上面部分可以放在工厂类的静态块中,只需要执行一次
获取实现类名称:
String name = props.getProperty(“xxx”)
反射创建对象:
class c = class.forName(name);
Usedao u = c.newInstance();
就创建出来了
这样 我们的相关接口的实现类的创建,就直接可以在工厂类中使用get方法就行 ,这样代码中,没有出现过实现类的名称,只存在配置文件中。
util包下的Date与sql包下的时间类型之间的转换
数据库 的类型 与Java中类型的对应关系
DATE -> java.sql.Date
TIME -> java.sql.Time
TIMESTAMP -> java.sql.Timestamp
领域对象 ,其中所有的属性不能出现javas.sql包下的东西。
所以我们需要把领域对象中的util类型,转换成sql的类型,完成get方法
把结果集中的sql类型,转换utils类型,赋给领域对象,完成set方法
比如:ResultSet 结果集 getDate()方法 返回的是java.sql.Date的类型
PrepareStatement 的setData(int,Date),Date就是java.sql.Date下的
所以我们需要时间类型的转换:
java.sql.Time----java.util.Time
java.sql.Date – java.util.Date
java.sql.Timestamp --java.util.Timestamp
util -> sql
我们查看sql的三种类型 的 构造器,发现其参数是long类型 毫秒值
所以我们util的三种类型 ,使用毫秒值来创建sql 的三种类型
java.util.Date date = new java.util.Date();
long l = date.getTime();
java.sql.Date sqlDate = new java.sql.Date(l);
sql -> util
直接赋值,因为util的三种类型 , 是sql三种类型的父类,子类可以直接赋值给父类,隐藏了子类的功能
大数据传入数据库
1.把mp3保存在数据库中
连接数据库
得到连接Connection(通过JDBC Utils)
sql模板,然后得到PrepareStatement
给参数赋值
主要是放入mp3的数据,是blob类型
如何将 mp3文件 -> blob类型
查看blob 发现是接口,有一个实现类SerialBlob,其构造器 需要一个byte[]
mp3 文件 变成 byte[]
先导入一个io的包,获得方法
byte[] bytes = IOUtils.toByteArray(new FileInputStream("文件路径"))
执行,exectuteUpdate()
从数据库中读取mp3
创建Connetion
给sql模板,创建PrepareStatement
直接执行 查询 ,得到结果集
获取结果集 中的 mp3数据
先得到Blob类型 的这个数据
Blob 类型 对象变成文件
通过Blob 得到输入流对象
创建输出流对象
把输入流的数据写入输出流中
InputStream in = biob.getBinaryStream();
OutputStream out = new FileOutputStream("路径");
IOUtils.copy(in, out);
这样,这个路径下就会出现mp3文件了。
批处理
即是一次性向服务器发送多条sql语句,服务器一次性处理
批处理只针对更新(增,删,改)
我们之前创建pstmt对象,传递一个sql模板
然后给sql模板的? 赋值
现在我们批处理
-
创建pstmt对象,也是需要一个sql模板,然后其内部有集合
-
使用循环,向pstmt中添加参数。然后一组参数与模板匹配,成为一条sql语句
-
调用其执行批方法,完成向数据库发送
如何循环往pstmt中添加参数
for循环中,往 各个列 的位置添加好参数后,
加 pstmt.addBatch();
就是将这一组参数加入到了pstmt 内部的集合中
循环结束后,执行批处理
pstmt.executeBatch();
MySQL的批处理也需要通过参数来打开:
rewrtiteBatchedStatements = true