JDBC----常用操作总结

最近在学JDBC,对观看视频的内容进行一下总结

Statement接口

用于执行静态的SQL语句并返回它所生成结果的对象
三种Statement类:

  1. Statement:由createStatement创建,用于发送简单的SQL语句。(不带参数)
  2. PreparedStatement:继承自Statement接口,由PreparedStatement创建,由于发送含有含有一个或多个输入参数的sql语句,PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,我们一般都用PreparedStatement.。
  3. 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)

  1. Atomicity(原子性)
    表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败;
  2. Consistency(一致性)
    表示一个事务内有一个操作失败时,所有更改过的数据必须回滚到修改前的状态,要么是另一半事务修改它之前的状态,事务不会查看中间状态的数据
  3. Isolation(隔离性)
    事务查看数据时数据所处的状态,要么是另一并发事务修改之前的状态,要么是另一事务修改之后的状态,事务不会查看中间状态的数据
  4. 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);
		         }
		    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值