最近在学JDBC,对观看视频的内容进行一下总结
Statement接口
用于执行静态的SQL语句并返回它所生成结果的对象
三种Statement类:
- Statement:由createStatement创建,用于发送简单的SQL语句。(不带参数)
- PreparedStatement:继承自Statement接口,由PreparedStatement创建,由于发送含有含有一个或多个输入参数的sql语句,PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,我们一般都用PreparedStatement.。
- CallableStatement:继承自PreparedStatement。Y由方法prepareCall创建,用于调用存储过程。
常用的Statement方法
- Execute():运行语句,返回是否有结果集
- executQeuery():运行select语句,返回ResultSet结果集
- executeUpdate():运行insert/update/delete操作,返回更新的行数
//Statement进行简单的插入操作
Statement stmt=conn.createStatement();
String sql="INSERT INTO `test`.`demo1`(`num`, `name`, `age`) VALUES (9, '周六', 20)";
stmt.execute(sql);
//用PreparedStatement将一行数据插入表
String sql="INSERT INTO `test`.`demo02`(`num`, `name`, `age`,`regTime`) VALUES (?, ?, ? ,?)";//?为占位符
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, "4");//索引从1开始
ps.setString(2, "王二");
ps.setString(3, "26");
java.sql.Date date=new java.sql.Date(System.currentTimeMillis());
ps.setDate(4, date);
int count=ps.executeUpdate();//返回整型,插入几行数据
System.out.println(count);
System.out.println("插入一行记录");
ps.execute();
ResultSet接口
- Statement执行SQL语句返回ResultSet结果集
- ResultSet提供的检索不同类型字段的方法,常用的有:
getSring()获得在数据库里是varchar、char等数据类型的对象
getFloat()获得数据库里是float类型的对象
getDate()获得数据库里是Date类型的数据
getBoolean():获得数据库里是Boolean类型的数据
//结果集操作
String sql="SELECT * FROM demo1 WHERE regTime>? AND lastLoginTime>?";//?为占位符
ps=conn.prepareStatement(sql);
ps.setObject(1, 2);//将2赋给?,即num>2
set=ps.executeQuery();//返回结果集
while(set.next())//对结果集进行遍历
{
System.out.println( set.getInt(1)+set.getString(2)+set.getInt(3));
}
批处理操作
批处理(Batch):对于大量的批处理,建议使用Statement,因为使用PreparedStatement的预编译空间有限,当数据量特别大的时候,会发生异常。
conn.setAutoCommit(false);//设置为手动连接
long start=System.currentTimeMillis();
sm=conn.createStatement();
for(int i=0;i<20000;i++)
{
sm.addBatch("INSERT INTO `test`.`demo1`(`num`, `name`, `age`) VALUES ("+i+",'杨',18)");
}
sm.executeBatch();
conn.commit();//提交事务
long end=System.currentTimeMillis();
System.out.println("提交两万条数据所花的时间为:"+(end-start)+"毫秒");
事务
事务基本概念:一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元
事务开始于:
- 连接到数据库上,并执行一条DML语句(INSERT,UPDATE或DELETE).
- 前一个事务结束后,又输入另外一条DML语句。
事务结束于:
- 执行commit语句或rollback语句
- 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
- 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行commit语句
- 断开与数据库的连接
- 执行一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句
事务的四大特点(ACID)
- Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败; - Consistency(一致性)
表示一个事务内有一个操作失败时,所有更改过的数据必须回滚到修改前的状态,要么是另一半事务修改它之前的状态,事务不会查看中间状态的数据 - Isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改之前的状态,要么是另一事务修改之后的状态,事务不会查看中间状态的数据 - Durability(持久性)
持久性事务完成以后,它对于系统的影响是永久性的
Java.util.Date
- 子类:java.sql.Date 表示年月日
- 子类:java.sql.Time 表示时分秒
- 子类:java.sql.TimeStamp 表示年月日时分秒
//插入一千条随机时间数据
for(int i=0;i<1000;i++)
{
String sql="INSERT INTO `test`.`demo02`(`num`, `name`, `age`,`regTime`,lastLoginTime) VALUES (?,?, ?, ?, ?)";//?为占位符
PreparedStatement ps=conn.prepareStatement(sql);
ps.setObject(1, "1");//索引从1开始
ps.setObject(2, "王二"+i);
ps.setObject(3, "26");
int rand=new Random().nextInt(1000000000)+100000000;
java.sql.Date date=new java.sql.Date(System.currentTimeMillis()-rand);
Timestamp stamp=new Timestamp(System.currentTimeMillis()-rand);//如果需要插入指定的时间,可以使用Calender类和DateFormat类
ps.setDate(4, date);
ps.setTimestamp(5, stamp);
ps.execute();
}
ps=conn.prepareStatement("SELECT * FROM demo1 WHERE regTime>? AND regTime<?");
java.sql.Date start=new java.sql.Date(strDate("2019-7-19 10:23:45"));
java.sql.Date end=new java.sql.Date(strDate("2019-7-20 10:23:45"));
ps.setObject(1, start);
ps.setObject(2,end );
rs=ps.executeQuery();
while(rs.next())
{
System.out.println(rs.getInt(""));
}
CLOB(Character Large Object)
- 用于存储大量的文本数据
- MySQL中相关类型:
Tinytext最大长度为255字符的text列
Text最大长度为65535字符的text列
Mediumtext最大长度为16777215(2^24)字符的text列
Longtext最大长度为4294967295或4GB字符的text列
BLOB(Binary Large Object)
- 用于存储大量的二进制数据
- Tinyblob最大长度为255字节的blob列
Text最大长度为65535字节的blob列
Mediumblob最大长度为16777215(2^24)字符的blob列
Longblob最大长度为4294967295或4GB字符的blob列
(大字段有些特殊,不同的数据库处理方式不一样,大字段的操作常常是以流的方式来处理的,而非一般的字段,一次即可读出数据)
//对文件的处理
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","ym19990111");
//ps=conn.prepareStatement("INSERT INTO Demo03(num,myInfo) VALUES(?,?)");
//ps.setInt(1, 4);
//ps.setClob(2, new FileReader("d:/a.txt"));//将文本内容直接输入到数据库中
//将程序中的 字符串输入到数据库中
//ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaabbbbb".getBytes()))));
//ps.executeUpdate();
ps=conn.prepareStatement("SELECT * FROM demo03 WHERE num=?");
ps.setObject(1, 3);
rs= ps.executeQuery();
while(rs.next())
{
Clob c=rs.getClob("myInfo");
Reader r=c.getCharacterStream();
int temp=0;
while((temp=r.read())!=-1)
{
System.out.print((char)temp);
}
}
//对图片的处理
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","ym19990111");
//ps=conn.prepareStatement("INSERT INTO Demo03(num,headImg,myInfo) VALUES(?,?,?)");
//ps.setInt(1, 4);
//ps.setBlob(2,new FileInputStream("d:/12345.jpg"));
//ps.setClob(3, new FileReader("d:/a.txt"));//将文本内容直接输入到数据库中
//将程序中的 字符串输入到数据库中
//ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaabbbbb".getBytes()))));
//ps.execute();
ps=conn.prepareStatement("SELECT * FROM demo03 WHERE num=?");
ps.setObject(1, 4);
rs= ps.executeQuery();
while(rs.next())
{
Blob b=rs.getBlob("headImg");
i=b.getBinaryStream();
os=new FileOutputStream("d:/12345.jpg");
int temp=0;
while((temp=i.read())!=-1)
{
os.write(temp);
}
}