JAVA基础12--JDBC

本文详细介绍了SQL语句的使用,包括Statement、PreparedStatement、CallableStatement的运用,以及ResultSet的使用方法。同时,展示了批处理操作、时间处理、CLOB和BLOB的使用案例,全面覆盖了数据库操作的核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Statement:由createStatement创建, 用于发送简单的SQL语句(不带参数的)
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语句



案例 测试时间处理(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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值