ResultSet提供检索不同类型字段的方法,常用的有:
getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
注意:在JDK1.4以前只支持next移动,且每次移动一个位置。到JDK1.5就可以随意定位。
4、使用JDBC的步骤
加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
2.建立连接
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
jdbc:oracle:thin:@192.168.0.1:1521:SXT
常见参数:
user 用户名
password 密码
autoReconnect 联机失败,是否重新联机(true/false)
maxReconnect 尝试重新联机次数
initialTimeout 尝试重新联机间隔
maxRows 传回最大行数
useUnicode 是否使用Unicode字体编码(true/false)
characterEncoding 何种编码(GB2312/UTF-8/…)
relaxAutocommit 是否自动提交(true/false)
capitalizeTypeNames 数据定义的名称以大写表示
5、JDBC事务
1、 事务介绍
事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行。
事务的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(IsoIation)和持续性(Durability)
原子性(Atomicity):事务应用最小的执行单元,不可再分。是事务中不可再分的最小逻辑执行体。
一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态。
隔离线(IsoIation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
持续性(Durability):持续性也称为持久性(Persistence),指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常就是保存在物理数据库中。
通常数据库的事务涉及到的语句有:
一组DML(Data Munipulation Language,数据操作语言)语句,这组DML语句修改后数据将保持较好的一致性; 操作表的语句,如插入、修改、删除等;
一个DDL(Data Definition Language,数据定义语言)语句,操作数据对象的语言,有create、alter、drop。
一个DCL(Data Control Language,数据控制语言)语句,主要有grant、revoke语句。
DDL和DCL语句最多只能有一个,因为它们都会导致事务的立即提交。当事务所包含的全部数据库操作都成功执行后,应该提交事务,使这些修改永久生效。
事务提交有两种方式:显示提交和自动提交。显示提交:使用commit提交 自动提交:执行DLL或DCL,或者程序正常退出
当事务包含的任意一个数据库操作执行失败后,应该回滚(rollback)事务,使该事务中所作的修改全部失效。
事务的回滚方式有两种:显示回滚和自动回滚。显示回滚:使用rollback 自动回滚:系统错误或强行退出
6.代码区
packagecom.dao;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;/*** 链接数据库工具类
*@authorAdministrator
**/
public classBaseDao {public static final String DRIVER="com.mysql.jdbc.Driver";public static final String URL="jdbc:mysql://127.0.0.1:3306/tb47";public static final String USER="root";public static final String PASSWORD="ok";public Connection conn=null;public CallableStatement cs=null; //该执行者调用存储过程
public ResultSet rs=null;static{try{
Class.forName(DRIVER);
}catch(ClassNotFoundException e) {
System.out.println("driver 有问题");
e.printStackTrace();
}
}publicConnection getConnection(){try{
conn=DriverManager.getConnection(URL, USER, PASSWORD);
}catch(SQLException e) {
System.out.println("URL, USER, PASSWORD 有问题");
e.printStackTrace();
}returnconn;
}public voidcloseAll(ResultSet rs, CallableStatement cs, Connection conn) {try{if(rs!=null){
rs.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if(cs!=null){
cs.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if(conn!=null){
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
BaseDao 调用存储过程
packagecom.dao;importjava.util.List;importcom.entity.Student;/***
*@authorAdministrator
**/
public interfaceStudentDao {/**、
* 查询所有
*@return
*/List findAll(); //没有参数存储过程
/**、
* 查询单条
*@paramsid
*@return
*/Student findById(int sid); //有输入参数存储过程
/*** 统计所有数据条数
*@return
*/
int totalCount(); //有输出参数的存储过程
/*** 统计某个年龄段的人数
*@paramage
*@return
*/
int totalCountAge(int age); //有输入参数和输出参数的存储过程
}
StudentDao
packagecom.dao.impl;importjava.sql.SQLException;importjava.sql.Types;importjava.util.ArrayList;importjava.util.List;importcom.dao.BaseDao;importcom.dao.StudentDao;importcom.entity.Student;public class StudentDaoImpl extends BaseDao implementsStudentDao{/*** 1.查询所有:调用没有参数的存储过程*/@Overridepublic ListfindAll() {
List list=new ArrayList();try{//获取数据库链接
conn=super.getConnection();//定义调用存储过程的语句
String sql="{call proc_student_noparam()}";//创建调用存储过程的执行者并发送调用语句
cs=conn.prepareCall(sql);//执行者执行查询操作,返回n条用
rs=cs.executeQuery();while(rs.next()){
Student stu=new Student(rs.getInt("cid"), rs.getInt("sid"), rs.getString("sname"), rs.getString("password"), rs.getInt("age"), rs.getString("subject"), rs.getDouble("score"), rs.getString("examtime"));
list.add(stu);
}
}catch(SQLException e) {
e.printStackTrace();
}finally{this.closeAll(rs, cs, conn);
}returnlist;
}/*** 2.查询单条:调用输入参数存储过程*/@Overridepublic Student findById(intsid) {//定义对象
Student stu=null;//获取数据库连接
conn=super.getConnection();//定义调用存储过程的语句
String sql="{call proc_student_hasparam(?)}";try{//创建调用存储过程的执行者并发送调用语句
cs=conn.prepareCall(sql);//执行者给调用存储过程领命中的占位符赋值
cs.setInt(1, sid);//执行者执行查询操作:返回一条
rs=cs.executeQuery();if(rs.next()){
stu=new Student(rs.getInt("cid"), rs.getInt("sid"), rs.getString("sname"), rs.getString("password"), rs.getInt("age"), rs.getString("subject"), rs.getDouble("score"), rs.getString("examtime"));
}
}catch(SQLException e) {
e.printStackTrace();
}//返回对象
returnstu;
}/*** 3.统计总条数:调用带有输出参数存储过程*/@Overridepublic inttotalCount() {//定义
int count=0;//获取数据库连接
conn=super.getConnection();//定义调用存储过程命令
String sql="{ call proc_student_outparam(?)}";try{//创建调用存储过程的执行者并发送调用命令
cs=conn.prepareCall(sql);//执行者注册输出参数,并指定参数数据类型
cs.registerOutParameter(1, Types.INTEGER);//执行者执行存储过程操作
cs.execute();//执行者获取执行后得到的输出参数结果
count=cs.getInt(1);
}catch(SQLException e) {
e.printStackTrace();
}finally{//释放资源
super.closeAll(rs, cs, conn);
}//返回结果
returncount;
}/*** 4.统计大于某个年龄段的学生人数:
* 调用带有输入和输出参数的存储过程
* 输入和输出参数是两个或同一个的变量*/@Overridepublic int totalCountAge(intage) {//定义接受输出参数值变量
int count=0;//获取数据库链接
conn=super.getConnection();try{//方法1:输出输入是两个参数
/*//定义调用存储过程语句
String sql="{call proc_student_inoutparam(?,?)}";
//创建调用存储过程的执行者并发送调用命令
cs=conn.prepareCall(sql);
//为调用命令的占位符赋值
cs.setInt(1, age);
//注册输出参数
cs.registerOutParameter(2, Types.INTEGER);*/
//方法2:输入输出是同一个参数//定义调用存储过程语句
String sql="{call proc_student_inoutOneParam(?)}";//创建调用存储过程的执行者并发送调用命令
cs=conn.prepareCall(sql);//为调用命令的占位符赋值
cs.setInt(1, age);//注册输出参数
cs.registerOutParameter(1, Types.INTEGER);//执行调用存储过程操作
cs.execute();//获取存储过程输出参数结果
count=cs.getInt(1);
}catch(SQLException e) {
e.printStackTrace();
}finally{super.closeAll(rs, cs, conn);
}returncount;
}
}
StudentDaoImpl
packagecom.part2;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/*** 2.链接数据库的工具类
*@authorAdministrator
**/
public classBaseDao {//1.定义驱动
public static final String DRIVER = "com.mysql.jdbc.Driver";//2.定义url
public static final String URL = "jdbc:mysql://127.0.0.1:3306/tb50";//3.定义user、
public static final String USER = "root";//4.定义password
public static final String PASSWORD = "ok";//5.定义Connection通路
public static Connection conn = null;//6.定义执行者preparedStatement
public static PreparedStatement pstm = null;//7.定义结果集resultset
public static ResultSet rs = null;//8.static中加载驱动=建立mysql和java
static{try{
Class.forName(DRIVER);
}catch(ClassNotFoundException e) {
System.out.println("DRIVER 有问题");
e.printStackTrace();
}
}/*** 9.获取数据库连接
*@return
*/
publicConnection getConnection(){try{
conn=DriverManager.getConnection(URL, USER, PASSWORD);
}catch(SQLException e) {
e.printStackTrace();
System.out.println("URL, USER, PASSWORD 由问题");
}returnconn;
}/*** 10.增删改公共方法
*@paramsql
*@paramobj
*@return
*/
public intexecuteUpdate(String sql,Object[] param){int num=0;try{//10.1获取数据库链接
this.conn=this.getConnection();//10.2.创建执行者并发送sql命令
pstm=conn.prepareStatement(sql);//10.3 执行者循环给sql占位符赋值
if(param!=null){for (int i = 0; i < param.length; i++) {
pstm.setObject(i+1, param[i]);
}
}//10.4 .执行操作
num=pstm.executeUpdate();
}catch(SQLException e) {
e.printStackTrace();
}finally{//10.5 释放资源
this.closeAll(rs,pstm,conn);
}returnnum;
}/*** 12.查询的公共方法
*@paramsql
*@paramobj
*@return
*/
publicResultSet executeQuery(String sql,Object[] param){try{//10.1获取数据库链接
this.conn=this.getConnection();//10.2.创建执行者并发送sql命令
pstm=conn.prepareStatement(sql);//10.3 执行者循环给sql占位符赋值
if(param!=null){for (int i = 0; i < param.length; i++) {
pstm.setObject(i+1, param[i]);
}
}//10.4 .执行操作
rs=pstm.executeQuery();
}catch(SQLException e) {
e.printStackTrace();
}returnrs;
}/*** 11.释放资源
*@paramrs2
*@parampstm2
*@paramconn2*/
public voidcloseAll(ResultSet rs, PreparedStatement pstm,
Connection conn) {try{if (rs!=null) {
rs.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if (pstm!=null) {
pstm.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if (conn!=null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
BaseDao 深度封裝
packagecom.part2;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.List;/*** 增删改查实现类
*@authorAdministrator
**/
public class StudentDaoImpl extends BaseDao implementsIStudentDao {/*** 1.查询所有*/@Overridepublic ListfindAll() {//1.1定义list集合,用来存放rs中的内容
List list=new ArrayList();//1.2定义sql
String sql="select * from student";//1.3调用basedao的查的方法、
super.rs=super.executeQuery(sql, null);try{//1.4 循环获取rs的内容并添加到list集合
while(rs.next()){//1.4.1 循环拿到一条赋值给student对象一个
/*Student stu=new Student();
stu.setAge(rs.getInt("age"));
stu.setCid(rs.getInt("cid"));
stu.setExamtime(rs.getString("examtime"));
stu.setPassword(rs.getString("password"));
stu.setScore(rs.getDouble("score"));
stu.setSid();
stu.setSname(rs.getString("sname"));
stu.setSubject(rs.getString("subject"));*/Student stu=new Student(rs.getInt("cid"), rs.getInt("sid"), rs.getString("sname"), rs.getString("password"), rs.getInt("age"), rs.getString("subject"), rs.getDouble("score"), rs.getString("examtime"));//1.4.2 向集合添加对象
list.add(stu);
}
}catch(SQLException e) {
e.printStackTrace();
}finally{//1.5 释放资源
super.closeAll(rs, pstm, conn);
}//返回集合
returnlist;
}/*** 2.根据id查询对象*/@Overridepublic Student findById(intsid) {
Student stu=null;
String sql="select * from student where sid=?";
Object[] param={sid};
rs=super.executeQuery(sql, param);try{if(rs.next()){
stu=new Student(rs.getInt("cid"), rs.getInt("sid"), rs.getString("sname"), rs.getString("password"), rs.getInt("age"), rs.getString("subject"), rs.getDouble("score"), rs.getString("examtime"));
}
}catch(SQLException e) {
e.printStackTrace();
}finally{super.closeAll(rs, pstm, conn);
}returnstu;
}/*** 添加*/@Overridepublic intsaveStu(Student stu) {
String sql="insert into student(sname,password," +
"age,subject,score,examtime,cid) " +
"values(?,?,?,?,?,?,?)";
Object[] param={stu.getSname(),stu.getPassword(),
stu.getAge(),stu.getSubject(),stu.getScore(),
stu.getExamtime(),stu.getCid()};return super.executeUpdate(sql, param);
}/*** 4.修改*/@Overridepublic intupdateStu(Student stu) {
String sql="update student set sname=?,password=?,age=?," +
"subject=?,score=?,examtime=?,cid=? where sid=?";
Object[] param={stu.getSname(),stu.getPassword(),
stu.getAge(),stu.getSubject(),stu.getScore(),
stu.getExamtime(),stu.getCid(),stu.getSid()};return super.executeUpdate(sql, param);
}/*** 5.删除*/@Overridepublic int deleteStuById(intsid) {
String sql="delete from student where sid=?";
Object[] param={sid};return super.executeUpdate(sql, param);
}
}
StudentDaoImpl 和上面一起
packagecom.part2;importjava.sql.Date;/*** 1.实体类==封装的是数据库的字段
* 实体类的属性名一般情况和数据库的字段保持一一对应
*@authorAdministrator
**/
public classStudent {private int cid;//47
private intsid;privateString sname;privateString password;private intage;privateString subject;private doublescore;privateString examtime;publicStudent() {
}public Student(int cid, String sname, String password, intage,
String subject,doublescore, String examtime) {this.cid =cid;this.sname =sname;this.password =password;this.age =age;this.subject =subject;this.score =score;this.examtime =examtime;
}public Student(int cid, intsid, String sname, String password,int age, String subject, doublescore, String examtime) {this.cid =cid;this.sid =sid;this.sname =sname;this.password =password;this.age =age;this.subject =subject;this.score =score;this.examtime =examtime;
}public intgetCid() {returncid;
}public void setCid(intcid) {this.cid =cid;
}public intgetSid() {returnsid;
}public void setSid(intsid) {this.sid =sid;
}publicString getSname() {returnsname;
}public voidsetSname(String sname) {this.sname =sname;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}publicString getSubject() {returnsubject;
}public voidsetSubject(String subject) {this.subject =subject;
}public doublegetScore() {returnscore;
}public void setScore(doublescore) {this.score =score;
}publicString getExamtime() {returnexamtime;
}public voidsetExamtime(String examtime) {this.examtime =examtime;
}
@OverridepublicString toString() {return "Student [age=" + age + ", cid=" + cid + ", examtime="
+ examtime + ", password=" + password + ", score=" +score+ ", sid=" + sid + ", sname=" +sname+ ", subject=" + subject + "]";
}
}
Student
用PreparedStatement有占位符的jdbc操
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.sql.Statement;importjavax.swing.text.html.HTMLDocument.HTMLReader.PreAction;/*** 测试PreparedStatement的基本用法
*@author高淇 www.sxt.cn
**/
public classDemo03 {public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement ps= null;try{//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
String sql= "insert into t_user (username,pwd,regTime) values (?,?,?)"; //?占位符
ps =conn.prepareStatement(sql);//ps.setString(1, "高淇3");//参数索引是从1开始计算, 而不是0//ps.setString(2, "123456");//ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));//可以使用setObject方法处理参数
ps.setObject(1, "高淇5");
ps.setObject(2, "234567");
ps.setObject(3, newjava.sql.Date(System.currentTimeMillis()));
System.out.println("插入一行记录");//ps.execute();
int count =ps.executeUpdate();
System.out.println(count);
}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();
}
}
}
}
Demo03 insert
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;/*** 测试ResultSet结果集的基本用法
*@author高淇 www.sxt.cn
**/
public classDemo04 {public static voidmain(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();
}
}
}
}
Demo04 select
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;/*** 测试批处理的基本用法
*@author高淇 www.sxt.cn
**/
public classDemo05 {public static voidmain(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();
}
}
}
}
Demo05 batch20000
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;/*** 测试事务的基本概念和用法
*@author高淇 www.sxt.cn
**/
public classDemo06 {public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement ps1= null;
PreparedStatement ps2= null;try{//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
conn.setAutoCommit(false); //JDBC中默认是true,自动提交事务
ps1= conn.prepareStatement("insert into t_user (username,pwd) values (?,?)");
ps1.setObject(1, "高淇");
ps1.setObject(2, "123456");
ps1.execute();
System.out.println("插入一个用户,高淇");try{
Thread.sleep(6000);
}catch(InterruptedException e) {
e.printStackTrace();
}
ps2= conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
ps2.setObject(1, "马士兵");
ps2.setObject(2, "123456");
ps2.execute();
System.out.println("插入一个用户,马士兵");
conn.commit();
}catch(ClassNotFoundException e) {
e.printStackTrace();try{
conn.rollback();//回滚
} catch(SQLException e1) {
e1.printStackTrace();
}
}catch(SQLException e) {
e.printStackTrace();
}finally{try{if(ps1!=null){
ps1.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if(conn!=null){
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
Demo06 事务
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Timestamp;importjava.util.Random;/*** 测试时间处理(java.sql.Date,Time,Timestamp)
*@author高淇 www.sxt.cn
**/
public classDemo07 {public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement ps= null;try{//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");for(int i=0;i<1000;i++){
ps= conn.prepareStatement("insert into t_user (username,pwd,regTime,lastLoginTime) values (?,?,?,?)");
ps.setObject(1, "高淇"+i);
ps.setObject(2, "123456");int rand = 100000000+new Random().nextInt(1000000000);
java.sql.Date date= new java.sql.Date(System.currentTimeMillis()-rand);
Timestamp stamp= new Timestamp(System.currentTimeMillis()-rand); //如果需要插入指定日期,可以使用Calendar、DateFormat
ps.setDate(3, date);
ps.setTimestamp(4, stamp);
ps.execute();
}
System.out.println("插入一个用户,高淇");
}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();
}
}
}
}
Demo07 测试时间处理
packagecom.zwj.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Timestamp;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Random;/*** 测试时间处理(java.sql.Date,Time,Timestamp),取出指定时间段的数据
*@author高淇 www.sxt.cn
**/
public classDemo08 {/*** 将字符串代表的日期转为long数字(格式:yyyy-MM-dd hh:mm:ss)
*@paramdateStr
*@return
*/
public static longstr2Date(String dateStr){
DateFormat format= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");try{returnformat.parse(dateStr).getTime();
}catch(ParseException e) {
e.printStackTrace();return 0;
}
}public static voidmain(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();
}
}
}
}
Demo08 取出指定时间段的数据
packagecom.zwj.jdbc;importjava.io.Reader;importjava.sql.Clob;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/*** 测试CLOB 文本大对象的使用
* 包含:将字符串、文件内容插入数据库中的CLOB字段、将CLOB字段值取出来的操作。
*@author高淇 www.sxt.cn
**/
public classDemo09 {public static voidmain(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();
}
}
}
}
Demo09 CLOB 文本大对象的使用
packagecom.zwj.jdbc;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importjava.sql.Blob;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/*** 测试BLOB 二进制大对象的使用
*@author高淇 www.sxt.cn
**/
public classDemo10 {public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement ps= null;
ResultSet rs= null;
InputStream is= null;
OutputStream os= 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,headImg) values (?,?) ");//ps.setString(1, "高淇");//ps.setBlob(2, new FileInputStream("d:/icon.jpg"));//ps.execute();
ps= conn.prepareStatement("select * from t_user where id=?");
ps.setObject(1, 101026);
rs=ps.executeQuery();while(rs.next()){
Blob b= rs.getBlob("headImg");
is=b.getBinaryStream();
os= new FileOutputStream("d:/a.jpg");int temp = 0;while((temp=is.read())!=-1){
os.write(temp);
}
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally{try{if(is!=null){
is.close();
}
}catch(Exception e) {
e.printStackTrace();
}try{if(os!=null){
os.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();
}
}
}
}
Demo10 BLOB 二进制大对象的使用
简单封装、资源文件properties处理连接信息
packagecom.bjsxt.testorm;importjava.io.IOException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Properties;public classJDBCUtil {static Properties pros = null; //可以帮助读取和处理资源文件中的信息
static { //加载JDBCUtil类的时候调用
pros = newProperties();try{
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
}catch(IOException e) {
e.printStackTrace();
}
}public staticConnection getMysqlConn(){try{
Class.forName(pros.getProperty("mysqlDriver"));return DriverManager.getConnection(pros.getProperty("mysqlURL"),
pros.getProperty("mysqlUser"),pros.getProperty("mysqlPwd"));
}catch(Exception e) {
e.printStackTrace();return null;
}
}public staticConnection getOracleConn(){try{
Class.forName(pros.getProperty("oracleDriver"));return DriverManager.getConnection(pros.getProperty("oracleURL"),
pros.getProperty("oracleUser"),pros.getProperty("oraclePwd"));
}catch(Exception e) {
e.printStackTrace();return null;
}
}public static voidclose(ResultSet rs,Statement ps,Connection conn){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 static voidclose(Statement ps,Connection conn){try{if(ps!=null){
ps.close();
}
}catch(SQLException e) {
e.printStackTrace();
}try{if(conn!=null){
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}public static voidclose(Connection conn){try{if(conn!=null){
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
JDBCUtil
1 #右击该properties文件--properties--Resource--Text file encoding,选中other,选择其它编码方式。2 #如UTF-8或GBK,这样就能在properties里面输入中文,而不会自动转成Unicode了。3
4#java中的properties文件是一种配置文件,主要用于表达配置信息。5 #文件类型为*.properties,格式为文本文件,文件内容是"键=值"的格式。6 #在properties文件中,可以用"#"来作注释7
8#MySQL连接配置9 mysqlDriver=com.mysql.jdbc.Driver10 mysqlURL=jdbc:mysql://localhost:3306/testjdbc
11 mysqlUser=root12 mysqlPwd=mysql13
14#Oracle连接配置15 #...
jdbc.properties
1 packagecom.test.jdbc;2
3 importjava.sql.Connection;4 importjava.sql.PreparedStatement;5 importjava.sql.ResultSet;6
7 /**8 * 测试使用JDBCUtil工具类来简化JDBC开发
9*/
10 public classDemo11 {11 public static voidmain(String[] args) {12 Connection conn = null;13 PreparedStatement ps = null;14 ResultSet rs = null;15
16 try{17 conn =JDBCUtil.getMysqlConn();18
19 ps = conn.prepareStatement("insert into t_user (userName) values (?)");20 ps.setString(1, "小高高");21ps.execute();22
23 } catch(Exception e) {24e.printStackTrace();25 } finally{26JDBCUtil.close(rs, ps, conn);27}28}29 }
Demo11