一、MySQL大对象储存数据类型
----------------------------------------------------------
LongBlob : 大字节对象存储形式。
Text : 大文本文件储存形式
二、操作大对象longblob,text
---------------------------------------------------------
1.表中增加两个字段,一个pic是图片类型,一个info是大文本类型
alter table mytable add column pic longblob;
alter table mytable add column info text;
2.数据库中插入图片
pt.setBinaryStream(2, is, file.length());
3.读取数据库中的图片字节数组
pt = conn.prepareStatement("select pic from mytable");
ResultSet set = pt.executeQuery();
byte [] bs = set.getBytes(1);
/**
* 测试保存大对象到数据库
*/
public static void tsSavePic()
{
int max = 9000;
Ts02.loadDriversClass();
Connection conn = Ts02.getConn();
PreparedStatement pt = null;
try {
conn.setAutoCommit(false);
//开始插入数据
long time1 = System.currentTimeMillis();
pt = conn.prepareStatement("insert into mytable (name,pic,info) values(?,?,?)");
pt.setString(1, "tom");
//获取图片的输入流
File file = new File("D:\\1.png");
FileInputStream is = new FileInputStream(file);
pt.setBinaryStream(2, is, file.length());
pt.setString(3, "xxxxxxxxxxxxxxx");
//开始更新
pt.executeUpdate();
conn.commit();
System.out.println("耗时:" + (System.currentTimeMillis() - time1));
//处理关闭
pt.close();
conn.close();
System.out.println("update over");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试查询大对象
*/
public static void tsSelectPic()
{
int max = 9000;
Ts02.loadDriversClass();
Connection conn = Ts02.getConn();
PreparedStatement pt = null;
try {
conn.setAutoCommit(false);
//开始插入数据
pt = conn.prepareStatement("select pic from mytable");
ResultSet set = pt.executeQuery();
while(set.next())
{
byte [] bs = set.getBytes(1);
File file = new File("D:\\1.1.png");
FileOutputStream fos = new FileOutputStream(file);
fos.write(bs);
fos.flush();
fos.close();
}
conn.commit();
//处理关闭
pt.close();
conn.close();
System.out.println("select over");
} catch (Exception e) {
e.printStackTrace();
}
}
三、存储过程procedure(大数据量统计计算的时候,非常具有优势)
----------------------------------------------------------
1.在数据库中预先存放的一种sql程序
2.创建存储过程 实现两个数相加
3.定义 分隔符:delimiter 重新定义分割符,结束符,为了和函数语句的;区分开来
4.调用存储过程语句: Call func_name;
6.in 表示输入; out 表示输出 ; := 表示赋值; begin 表示 函数创建开始 end 表示函数创建结束
7.创建存储过程:
delimiter //
create procedure fun_name(in a int , in b int , out c int);
begin
set c:= a+b;
end
//
8.使用存储过程(@c表示 变量c)
call up_add(1,2,@c) //
select @c //
9.查看所有的存储过程
show procedure status;
10.删除存储过程
drop procedure myprocedure;
四、java中调用存储过程procedure
------------------------------------------------------------
1.Connection conn;
2.CallableStatement cst = conn.prepareCall("{call func_name(?,?,?)}");
3.cst.setInt(1,1); cst.setInt(2,3);
4.cst.registerOutParameter(3,Types.Integer);
5.cst.execute();
6.int c = cst.getInt(3);
/**
* 测试存储语句
*/
public static void tsUpAdd()
{
//加载驱动
Ts02.loadDriversClass();
//建立连接
Connection conn = Ts02.getConn();
//创建服务器语句
try {
//创建查询串
CallableStatement call = conn.prepareCall("{call up_add(?,?,?)}");
//注册参数
call.setInt(1, 1);
call.setInt(2, 1);
call.registerOutParameter(3, Types.INTEGER);
//开始执行
call.execute();
//获取结果
int c = call.getInt(3);
System.out.println("c= " + c);
//处理关闭
call.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
五、mysql的赋值语句
------------------------------------------------------------
1. set x : a + b;
2. select count(*) into x from mytable;
六、MySql中的游标
-------------------------------------------------------------
create procedure curdemo() //创建存储过程
begin
declare bl_name int default 0; //定义int 类型变量 bl_name,并赋初值 0;
declare a char(20); //定义char (20) 类型变量a
declare b,c int;
declare cur1 cursor for select id,name from mydata.mytable; //给表mytable定义游标cur1,对应表中的id和name字段
declare continue handler for sqlstate '02000' set bl_name = 1; //定义一个逻辑,当fetch游标到了数据库表格最后一行的时候,设置done=1.
open cur1; //打开游标(从mytable的头部开始浏览)
repeat //开始循环
fetch cur1 into a,b; //将游标中的存储的id 和 name 赋值变量给 a,b
if not done then //if语句,如果没有达到表格末尾,这里可以自定义判断条件
Insert into mytable1 values (a,b); //要执行的sql语句。
end if; //结束if
until bl_name end reprat; //结束循环
close cur1; //关闭游标
end //结束存储过程
七、通过存储过程实现百万记录插入
-------------------------------------------------------------
1.创建存储过程
create procedure big_insert(in num int) //创建存储过程
begin
declare i int default 0; //定义变量 i = 0;
start transaction; //开启事务
while i < num do //循环条件
insert into mytable (name,password,age) values(concat('tom',i), concat('' + i) ,i % 30); //插入数据
set i := i + 1; //i自增
end while; //结束循环
commit; //提交事务
end
2.java 中执行存储过程
/**
* 测试使用存储过程。进行100万条语句插入
*/
public static void tsBigInsert()
{
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.建立数据库连接
String url = "jdbc:mysql://localhost:3306/mydata";
String user = "mysql";
String password = "mysql";
Connection conn = DriverManager.getConnection(url, user, password);
//3.执行存储过程
CallableStatement call = conn.prepareCall("{call big_insert2(?)}");
//4.传参
call.setInt(1, 100000);
//5.执行
call.execute();
//6.关闭
call.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
}
八、MySql的函数
------------------------------------------------------------------
1.创建函数
create function uf_add(a int , b int) returns int
return a + b ;
//测试使用函数
public static void tsUseFunc()
{
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.建立数据库连接
String url = "jdbc:mysql://localhost:3306/mydata";
String user = "mysql";
String password = "mysql";
Connection conn = DriverManager.getConnection(url, user, password);
CallableStatement call = conn.prepareCall("{? = call myfunc(?,?)}");
call.setInt(2, 1);
call.setInt(3, 1);
call.registerOutParameter(1, Types.INTEGER);
call.execute();
System.out.println(call.getInt(1));
call.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
}