Statement:由createStatement创建, 用于发送简单的SQL语句(不带参数的)
PreparedStatement:继承自Statement接口,由prepareStatement创建, 用于发送含有一个或多个输入参数的哦SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement
CallableStatement:继承自PreparedStatement.由方法prePareCall创建,用于调用存储过程
常用的Statement方法:
execute():运行语句,返回是否有结果集
executeQuery():运行select语句,返回ResultSet结果集
PreparedStatement:继承自Statement接口,由prepareStatement创建, 用于发送含有一个或多个输入参数的哦SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement
CallableStatement:继承自PreparedStatement.由方法prePareCall创建,用于调用存储过程
常用的Statement方法:
execute():运行语句,返回是否有结果集
executeQuery():运行select语句,返回ResultSet结果集
executeUpdate():运行insert/update/delete操作,返回更新的行数
案例:ResultSet 用法
public class Demo04 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
String sql = "select id,username,pwd from t_user where id>?"; //?占位符
ps = conn.prepareStatement(sql);
ps.setObject(1, 2); //把id大于2的记录都取出来
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+"---"+rs.getString(2)+"---"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//遵循:resultset-->statment-->connection这样的关闭顺序!一定要将三个trycatch块,分开写!
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
案例 测试批处理的基本用法
public class Demo05 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
conn.setAutoCommit(false); //设为手动提交
long start = System.currentTimeMillis();
stmt = conn.createStatement();
for(int i=0;i<20000;i++){
stmt.addBatch("insert into t_user (username,pwd,regTime) values ('gao"+i+"',666666,now())");
}
stmt.executeBatch();
conn.commit(); //提交事务
long end = System.currentTimeMillis();
System.out.println("插入20000条数据,耗时(毫秒):"+(end-start));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//遵循:resultset-->statment-->connection这样的关闭顺序!一定要将三个trycatch块,分开写!
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(stmt!=null){
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
事务开始于: 链接到数据库上,并执行一条DML语句(INSERT UPDATE 或DELETE)
前一个事物结束后,又输入了另外一条DML语句
事物结束于:
执行commit 或rollback语句
执行一条DDL语句 ,例如create table 会自动执行commit 语句
执行一条DCL语句 例如grant语句 会自动执行commit 语句
断开与数据库的链接
执行了一条DML语句,该语句却失败了 在这种情况下,会为这个无效的DML语句执行rollback语句
前一个事物结束后,又输入了另外一条DML语句
事物结束于:
执行commit 或rollback语句
执行一条DDL语句 ,例如create table 会自动执行commit 语句
执行一条DCL语句 例如grant语句 会自动执行commit 语句
断开与数据库的链接
执行了一条DML语句,该语句却失败了 在这种情况下,会为这个无效的DML语句执行rollback语句
案例 测试时间处理(java.sql.Date,Time,Timestamp),取出指定时间段的数据
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
// ps = conn.prepareStatement("select * from t_user where regTime>? and regTime<?");
// java.sql.Date start = new java.sql.Date(str2Date("2015-4-10 10:23:45"));
// java.sql.Date end = new java.sql.Date(str2Date("2015-4-13 10:23:45"));
// ps.setObject(1, start);
// ps.setObject(2, end);
ps = conn.prepareStatement("select * from t_user where lastLoginTime>? and lastLoginTime<? order by lastLoginTime ");
Timestamp start = new Timestamp(str2Date("2015-4-18 8:10:20"));
Timestamp end = new Timestamp(str2Date("2015-4-18 9:9:10"));
ps.setObject(1, start);
ps.setObject(2, end);
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")+"--"+rs.getString("username")+"--"+rs.getTimestamp("lastLoginTime"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
案例 测试CLOB 文本大对象的使用
LOB (Character Large Object)
用来存储大量的文本数据
大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的,而非一般的字段,一次即可读出数据
Mysql 中相关类型:
TINYTEXT 最大长度 55 字符的text列
TEXT[(M)] 65535 2^16-1 字符的text列
MEDIUMTEXT 2^24-1 字符的text列
LOGTEXT 2^32-1 字符的text列
public class Demo09 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Reader r = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
// ps = conn.prepareStatement("insert into t_user (username,myInfo) values (?,?) ");
// ps.setString(1, "高淇");
// ps.setClob(2, new FileReader(new File("d:/a.txt"))); //将文本文件内容直接输入到数据库中
//将程序中的字符串输入到数据库的CLOB字段中
// ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaabbbbbb".getBytes()))));
ps = conn.prepareStatement("select * from t_user where id=?");
ps.setObject(1, 101024);
rs = ps.executeQuery();
while(rs.next()){
Clob c = rs.getClob("myInfo");
r = c.getCharacterStream();
int temp = 0;
while((temp=r.read())!=-1){
System.out.print((char)temp);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(r!=null){
r.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
案例 BLOB
用于存储大量的二进制数据
大字段有些特殊,不同数据库处理方式不一样, 大字段的操作常常是以流的方式来处理的,而非一般的字段,一次即可读出数据
Mysql 中相关的类型:
TINYBLOB最大长度为255 2^8-1的BLOB
BLOB[(M)]最大长度为65535 2^16-1
MEDIUMBLOB 2^24-1
LONGBLOB 2^32-1