最全JDBC 视频 https://ke.qq.com/course/280836#tuin=5740604a
* 可以省略 Class.forName(driver); (高版本)
* 原因:mysql-connector-java-5.1.22-bin.jar/META-INF/services/java.sql.Driver 内容com.mysql.jdbc.Driver ,程序将自动加载(SPI机制)
mysql-connector-java-5.1.5-bin.jar不行
* PreparedStatement对象
* sql注入:防止实际参数作为sql语句的一部分。
* 大数据处理
* mysql大数据类型:
* blob :Binary Large Object,二进制大对象。 mysql提供blob(64k),longblob(4G)
* java对象api :
* psmt.setBinaryStream(parameterIndex, x) 二进制数据或者
* psmt.setBlob(parameterIndex, inputStream) blob对象
* clob :Character Large Object字符大对象。mysql提供text(64k),longtext(4G)
大数据表准备
create table bigimg(
id int primary key auto_increment,
img blob
);
create table bigtext(
id int primary key auto_increment,
content longtext
);
@Test
public void sendImg() {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
//1 准备sql语句
String sql = "insert into bigimg(img) values(?)";
//2准备预处理对象
psmt = conn.prepareStatement(sql);
// * 图片的数据流
FileInputStream is = new FileInputStream(new File("台湾.jpg"));
//3设置内容
psmt.setBinaryStream(1, is);
//4执行sql
int r = psmt.executeUpdate(); //不需要sql语句
System.out.println(r);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeResource(conn, psmt, rs);
}
}
@Test
public void getImg() {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
//1 准备sql
String sql = "select img from bigimg where id = ?";
//2预处理对象
psmt = conn.prepareStatement(sql);
//3设置参数
psmt.setInt(1, 1);
//4执行sql
rs = psmt.executeQuery(); //不需要sql语句
//5处理结果
if (rs.next()) {
System.out.println("下载中");
//获得流并保存
InputStream is = rs.getBinaryStream("img");
FileOutputStream out = new FileOutputStream(new File("bak.jpg"));
byte[] buf = new byte[1024];
int len = -1;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.close();
is.close();
} else {
System.out.println("没有数据");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeResource(conn, psmt, rs);
}
}
@Test
public void getText() {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
//1 -- 使用的字段的别名
String sql = "select content c from bigtext where id = ?";
//2
psmt = conn.prepareStatement(sql);
//3
psmt.setInt(1, 2);
//4执行
rs = psmt.executeQuery();
if (rs.next()) {
System.out.println("下载中");
Reader reader = rs.getCharacterStream("c"); //获得内容时,必须使用别名
Writer writer = new OutputStreamWriter(new FileOutputStream("d:/1.txt"), "UTF-8");
char[] buf = new char[1024];
int len = -1;
while ((len = reader.read(buf)) != -1) {
writer.write(buf, 0, len);
}
writer.close();
reader.close();
} else {
System.out.println("没有");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeResource(conn, psmt, rs);
}
}
@Test
public void sendText() {
//java.lang.OutOfMemoryError: Java heap space
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
//1
String sql = "insert into bigtext(content) values(?)";
//2
psmt = conn.prepareStatement(sql);
// * 提供字符串流
Reader reader = new InputStreamReader(new FileInputStream(new File("d:/斗破苍穹.txt")), "UTF-8");
//3 参数
psmt.setCharacterStream(1, reader);
//4
int r = psmt.executeUpdate();
System.out.println(r);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeResource(conn, psmt, rs);
}
}
Statement对象
1. addBatch(String sql) 给批处理缓存中,添加sql语句
2. clearBatch() 清空缓存
3. executeBatch() 将缓存中的sql语句都执行
* PreparedStatement对象*
1. 获得对象,提供sql
2. addBatch() ,将指定的参数添加到批处理缓存
sql脚本
create table batch(id int primary key , content varchar(30));
@Test
public void statement(){ //语句执行
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
st = conn.createStatement();
//批处理
st.addBatch("create database day12_batch");
st.addBatch("use day12_batch");
st.addBatch("create table batch(id int primary key auto_increment , content varchar(30))");
st.addBatch("insert into batch(content) values('jack')");
st.addBatch("insert into batch(content) values('rose')");
//执行
int[] arr = st.executeBatch();
System.out.println(Arrays.toString(arr));
} catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtil.closeResource(conn, st, rs);
}
}
@Test
public void prepared(){ //预处理
//String url = "jdbc:mysql:///day12_batch?useUnicode=true&characterEncoding=UTF-8";
long start = System.currentTimeMillis();
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
String sql = "insert into batch(content) values(?)";
psmt = conn.prepareStatement(sql);
//批处理--设置参数
for(int i = 0 ; i< 100 ; i++){
psmt.setString(1, i + "");
// 添加到缓存
psmt.addBatch(); //没有sql语句
}
//执行
int[] arr = psmt.executeBatch();
System.out.println(Arrays.toString(arr));
} catch (Exception e) {
e.printStackTrace();
} finally{
JdbcUtil.closeResource(conn, psmt, rs);
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
Statement对象,字符串的形式处理或mysql提供时间函数now()
PreparedStatement对象 ,getDate(java.sql.Date) getTime(java.sql.Time) getTimeStamp(java.sql.TimeStamp)
* new java.sql.Date(new java.util.Date().getTime())
sql语句
CREATE TABLE dt(
d DATE,
t TIME,
ts TIMESTAMP
)
create table account(
id int primary key auto_increment,
username varchar(50),
money int
);
insert into account(username,money) values('jack',500);
insert into account(username,money) values('rose',500);