文章目录
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();