jdbc、时间类型、大数据、stmt批处理

1.JDBC

1.1 基本操作

JDBC是接口,而JDBC驱动才是接口的实现。
在这里插入图片描述
加载驱动类:

Class.forName(“com.mysql.jdbc.Driver”);

调用静态方法进行注册,jdk5以上自动完成。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
……
}

创建链接的url中可提供编码参数::

jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8

1.2 增删改查

Statement stmt = con.createStatement();
int m = stmt.executeUpdate(sql); //  增删改
ResultSet rs = stmt.executeQuery(sql); // 查

在这里插入图片描述
Object getObject(int columnIndex):获取指定列的Object类型的数据。
对于上面ResultSet的方法中,参数columnIndex表示列的索引,列索引从1开始,而不是0,这第一点与数组不同。

1.3 使用PreparedStatement

它是Statement接口的子接口,可以防止SQL攻击。
SQL攻击:用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们DAO中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段!

2. java.utl.Date类型与java.sql. 时间类型转换

java.sql.Date,
java.sql.Time,
java.sql.Timestamp
以上类都是java.util.Date的子类

(1)把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用,不需要转换:

java.sql.Date date =//子类对象
java.util.Date d = date; // 直接给父类对象

java.sql.Time time = …
java.util.Date d = time;

java.sql.Timestamp timestamp = …
java.util.Date d = timestamp;

当需要把java.util.Date转换成数据库的三种时间类型时,这就不能直接赋值了:

java.utl.Date d = new java.util.Date();
java.sql.Date date = new java.sql.Date(d.getTime());//会丢失时分秒
Time time = new Time(d.getTime());//会丢失年月日
Timestamp timestamp = new Timestamp(d.getTime());

3.数据库存储大数据

在my.ini中添加如下配置,设置可存放的数据大小限制。

max_allowed_packet=10485760

mysql使用如下四种类型来处理文本大数据:
在这里插入图片描述
把图片转为二进制数进行存储:
(1)方法一:pstmt.setBinaryStream(int, InputSteam)

pstmt.setString(1, "a.jpg");
InputStream in = new FileInputStream("f:\\a.jpg");
pstmt.setBinaryStream(2, in);
pstmt.executeUpdate();

ResultSet读取二进制数:
ResultSet. getBinaryStream(String columnLabel)

String filename = rs.getString("filename");
OutputStream out = new FileOutputStream("F:\\" + filename);
InputStream in = rs.getBinaryStream("data");
IOUtils.copy(in, out);
out.close();

(2)方法二:存储的数据包装成Blob类型,然后调用pstmt的setBlob()方法来设置数据
存:pstmt.setBlob(2, blob)

pstmt.setString(1, "a.jpg");
File file = new File("f:\\a.jpg");
byte[] datas = FileUtils.getBytes(file);//获取文件中的数据
Blob blob = new SerialBlob(datas);      //转为Blob对象
pstmt.setBlob(2, blob);					//存
pstmt.executeUpdate();

读:rs.getBlob("data")

String filename = rs.getString("filename");//获取文件名
File file = new File("F:\\" + filename) ;  //创建文件对象
Blob blob = rs.getBlob("data");            //获取文件的Blob格式数据
byte[] datas = blob.getBytes(0, (int)file.length()); // 转为字节数组
FileUtils.writeByteArrayToFile(file, datas); // 写到指定文件

4.批处理

(1)Statement
 void addBatch(String sql):添加一条语句到“批”中;
 int[] executeBatch():执行“批”中所有语句。返回值表示每条语句所影响的行数据;
 void clearBatch():清空“批”中的所有语句。

for(int i = 0; i < 10; i++) {
	String number = "S_10" + i;
	String name = "stu" + i;
	int age = 20 + i;
	String gender = i % 2 == 0 ? "male" : "female";
	String sql = "insert into stu values('" + number + "', '" + name + "', " + age + ", '" + gender + "')";
	stmt.addBatch(sql); // 增加一批sql
	}
	stmt.executeBatch();

(1)PreparedStatement

pstmt = con.prepareStatement(sql);
for(int i = 0; i < 10; i++) {
	// 循环赋值
	pstmt.setString(1, "S_10" + i);
	pstmt.setString(2, "stu" + i);
	pstmt.setInt(3, 20 + i);
	pstmt.setString(4, i % 2 == 0 ? "male" : "female");
	pstmt.addBatch(); // 增加一批值
}
pstmt.executeBatch();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值