韩顺平j2eeJDBC与MySQL学习笔记.docx
《韩顺平j2eeJDBC与MySQL学习笔记.docx》由会员分享,可在线阅读,更多相关《韩顺平j2eeJDBC与MySQL学习笔记.docx(118页珍藏版)》请在冰点文库上搜索。
韩顺平j2eeJDBC与MySQL学习笔记
jdbc详解+学生选课项目
jdbc简介
数据库驱动
sun公司为统一对数据库的操作,定义一套java操作数据库的规范(接口+类),称之为jdbc。
jdbc接口和类主要是放在java.sql包和javax.sql包。
JDBC全称为:
JavaDatabaseConnectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:
java.sql和javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
做jdbc开发的几个前提
1、引包importjava.sql.*;importjavax.sql.*;
2、把数据库驱动包jar包导入到java项目中,使用不同的数据库时要使用对应数据库版本的驱动。
这些驱动可以到相应数据库提供商的官方网站下载。
第一个JDBC程序
编写一个程序,这个程序从user1表中读取数据,并打印在命令行窗口中。
一、搭建实验环境:
1、在oracle中创建一个库,并创建user1表和插入表的数据。
user1表结构如下:
idnumber主键自增长
namevarchar2(30)
passwdvarchar2(50)
emailvarchar2(100)
birthdaydate
agenumber(3)
oracle下先建序列
createsequenceuser1_seq
startwith1
incrementby1
minvalue1
nomaxvalue
nocache
nocycle;
建user1表
createtableuser1(
idnumberprimarykey,
namevarchar2(30),
passwdvarchar2(50),
emailvarchar2(100),
birthdaydate,
agenumber(3));
2、新建一个java工程,并导入数据驱动。
二、编写程序,在程序中加载数据库驱动
DriverManager.registerDriver(Driverdriver);
Class.forName("oracle.jdbc.driver.OracleDriver");
程序详解--DriverManager
Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个类的常用方法:
DriverManager.registerDriver(newOracleDriver())
注意:
在实际开发中,并不推荐采用这个方法注册驱动。
查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序加载两次,也就是在内存中会有两个Driver对象。
推荐方式:
Class.forName("oracle.jdbc.driver.OracleDriver");
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱动,使程序的灵活性更高。
DriverManager.getConnection(url,user,password),根据url获取数据库的链接。
三、建立连接(Connection)
Connectionconn=DriverManager.getConnection(url,user,pass);
数据库URL
URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
常用数据库URL地址的写法:
Oracle--jdbc:
oracle:
thin:
@localhost:
1521:
sid
Sqlserver--jdbc:
microsoft:
sqlserver:
//localhost:
1433;DatabaseName=sid
MySql--jdbc:
mysql:
//localhost:
3306/sid
程序详解--Connection接口
Jdbc程序中的Connection,它用于代表数据库的链接,Connection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过Connection对象完成的,这个对象的常用方法:
createStatement():
创建向数据库发送sql的statement对象。
prepareStatement(sql):
创建向数据库发送预编译sql的PrepareSatement对象。
prepareCall(sql):
创建执行存储过程的callableStatement对象。
setAutoCommit(booleanautoCommit):
设置事务是否自动提交。
commit():
在链接上提交事务。
rollback():
在链接上回滚事务。
System.out.println(接口引用的某个类实例);将输出该类的全名@十六机制的hash值,该方法常用于查看某个接口引用指向的真正对象实例的类型是什么!
Connection接口连接不同的数据库,返回的对象实例类型是不同的。
对Connection中的事务提交示例详解:
setAutoCommit,commit(),rollback()的使用
packagecom.oracle.jdbc.test;
importjava.sql.*;
publicclassTestJdbcAutoCommit{
//使用jdbc去操作oracle数据库--事务处理setAutoCommit
publicstaticvoidmain(String[]args){
Connectionct=null;
Statementstatement=null;
Stringurl="jdbc:
oracle:
thin:
@127.0.0.1:
1521:
orcl";
Stringusername="scott";
Stringpassword="tiger";
//1、加载驱动
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、得到连接
ct=DriverManager.getConnection(url,username,password);
//把事务设为不自动提交
ct.setAutoCommit(false);
//3、创建sql对象(Statement/PreparedStatement/CallableStatement)
statement=ct.createStatement();
//4、通过statement向数据库发出sql指令
//需求:
对emp表进行操作,把SMITH的sal-10给KING的sal+10
statement.executeUpdate("updateempsetsal=sal-10whereename='SMITH'");
statement.executeUpdate("updateempsetsal=sal+10whereename='KING'");
//提交所有语句
mit();
}catch(Exceptione){
//如果事务中的sql语句中有任何错误则进行回滚操作。
try{
ct.rollback();
}catch(SQLExceptione1){
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//关闭资源[先开后关,后开先关]
if(statement!
=null){
try{
statement.close();
}catch(SQLExceptione){
e.printStackTrace();
}
statement=null;
}
if(ct!
=null){
try{
ct.close();
}catch(SQLExceptione){
e.printStackTrace();
}
ct=null;
}
}
}
}
四、创建用于向数据库发送SQL的Statement对象,并发送SQL
Statementst=conn.createStatement();
ResultSetrs=st.excuteQuery(sql);
程序详解--ResultSet
Jdbc程序中的ResultSet用于代表sql语句的执行结果。
ResultSet封装执行结果时,采用类似于表格的方式。
ResultSet对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next()方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法。
获取任意类型的数据
getObject(intindex)
getObject(stringcolumnName)
获取指定类型的数据,如:
getString(intindex)
getString(StringcolumnName)
提问:
数据库中列的类型是varchar2,获取该列的数据调用什么方法?
int类型呢?
bigint类型呢?
boolean类型?
答:
获取varchar2类型的列数据,会调用getString方法。
常用数据类型转换表(oracle)
SQL类型
jdbc对应方法
返回类型
number
getBoolean()
boolean
number
getByte()
byte
number
getShort()
short
number
getInt()
int
number
getLong()
long
char,nvarchar2,varchar2
getString()
String
Text(clob)Blob
getClobgetBlob()
ClobBlob
DATE
getDate()
java.sql.Date
TIMESTAMP
getTimestamp()
java.sql.Timestamp
number
getFloat()
float
number
getDouble()
double
常用数据类型转换表(sqlserver)
编号
SQLServer数据库类型
JDBC类型
1
int
java.lang.Integer
2
varchar
java.lang.String
3
char
java.lang.String
4
nchar
java.lang.String
5
nvarchar
java.lang.String
6
text
java.lang.String
7
ntext
java.lang.String
8
tinyint
java.lang.Integer
9
int
java.lang.Integer
10
tinyint
java.lang.Integer
11
smallint
java.lang.Integer
12
bit
java.lang.Boolean
13
bigint
java.lang.Long
14
float
java.lang.Double
15
decimal
java.math.BigDecimal
16
money
java.math.BigDecimal
17
smallmoney
java.math.BigDecimal
18
numeric
java.math.BigDecimal
19
real
java.lang.Float
20
uniqueidentifier
java.lang.String
21
smalldatetime
java.sql.Timestamp
22
datetime
java.sql.Timestamp
23
timestamp
byte[]
24
binary
byte[]
25
varbinary
byte[]
26
image
byte[]
27
sql_variant
java.lang.String
常用数据类型转换表(MySql)
类型名称
显示长度
数据库类型
JAVA类型
VARCHAR
L+N
VARCHAR
java.lang.String
CHAR
N
CHAR
java.lang.String
BLOB
L+N
BLOB
java.lang.byte[]
TEXT
65535
VARCHAR
java.lang.String
INTEGER
4
INTEGERUNSIGNED
java.lang.Long
TINYINT
3
TINYINTUNSIGNED
java.lang.Integer
SMALLINT
5
SMALLINTUNSIGNED
java.lang.Integer
MEDIUMINT
8
MEDIUMINTUNSIGNED
java.lang.Integer
BIT
1
BIT
java.lang.Boolean
BIGINT
20
BIGINTUNSIGNED
java.math.BigInteger
FLOAT
4+8
FLOAT
java.lang.Float
DOUBLE
22
DOUBLE
java.lang.Double
DECIMAL
11
DECIMAL
java.math.BigDecimal
BOOLEAN
1
同TINYINT
ID
11
PK(INTEGERUNSIGNED)
java.lang.Long
DATE
10
DATE
java.sql.Date
TIME
8
TIME
java.sql.Time
DATETIME
19
DATETIME
java.sql.Timestamp
TIMESTAMP
19
TIMESTAMP
java.sql.Timestamp
YEAR
4
YEAR
java.sql.Date
五、从表结果集的ResultSet中取出数据,打印到命令行窗口
程序详解--ResultSet
ResultSet还提供了对结果集进行滚动的方法:
next():
移动到下一行
Previous():
移动到前一行
absolute(introw):
移动到指定行[row从1开始计算]
beforeFirst():
移动resultSet的最前面
afterLast():
移动到resultSet的最后面
ResultSet的说明:
在默认情况下,rs的结果集,只能向前移动,这样rs结果集只能使用一次,不能复用。
如果需要复用,则可以在ct.createStatement(ResultSet.滚动类型,ResultSet.并发类型);
ResultSet的可选项有:
resultSetType结果集类型有三种:
ResultSet.TYPE_FORWARD_ONLY只能向下移动
ResultSet.TYPE_SCROLL_INSENSITIVE可以滚动,只读
ResultSet.TYPE_SCROLL_SENSITIVE可以滚动,可更改
resultSetConcurrency并发类型有两种:
ResultSet.CONCUR_READ_ONLY只读并发
ResultSet.CONCUR_UPDATABLE可写并发
ResultSet的详细讲解示例代码:
packagecom.oracle.jdbc.test;
importjava.sql.*;
publicclassTestJdbcResultSet{
//使用jdbc去操作oracle数据库--ResultSet
publicstaticvoidmain(String[]args){
Connectionct=null;
Statementstatement=null;
ResultSetrs=null;
Stringurl="jdbc:
oracle:
thin:
@127.0.0.1:
1521:
orcl";
Stringusername="scott";
Stringpassword="tiger";
//1、加载驱动
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、得到连接
ct=DriverManager.getConnection(url,username,password);
//3、创建sql对象(Statement/PreparedStatement/CallableStatement)
//假设我们希望rs结果,可以滚动(可以向前,亦可向后)和只读并发
statement=ct.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//4、通过statement向数据库发出sql查询指令,并将返回结果集给ResultSet
rs=statement.executeQuery("select*fromemp");
//5、取出结果集
while(rs.next()){
System.out.println("雇员编号:
"+rs.getInt
(1)+"姓名:
"+rs.getString("ename")+"职位:
"+rs.getObject("job"));
}
//如果我们希望,重新使用rs
rs.beforeFirst();
System.out.println("*****************************");
while(rs.next()){
System.out.println("雇员编号:
"+rs.getInt
(1)+"姓名:
"+rs.getString("ename")+"职位:
"+rs.getObject("job"));
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭资源[先开后关,后开先关]
if(rs!
=null){
try{
rs.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
rs=null;
}
if(statement!
=null){
try{
statement.close();
}catch(SQLExceptione){
e.printStackTrace();
}
statement=null;
}
if(ct!
=null){
try{
ct.close();
}catch(SQLExceptione){
e.printStackTrace();
}
ct=null;
}
}
}
}
六、断开与数据库的连接,并释放相关资源。
程序详解--释放资源
jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet,Statement和Connection对象
特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。
Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
操作USER1表的java源代码
packagecom.oracle.jdbc.test;
importjava.sql.*;
publicclassTestJdbc{
//使用jdbc去操作oracle数据库
publicstaticvoidmain(String[]args){
Connectionct=null;
Statementstatement=null;
Stringurl="jdbc:
oracle:
thin:
@127.0.0.1:
1521:
orcl";
Stringusername="scott";
Stringpassword="tiger";
//1、加载驱动
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、得到连接
ct=DriverManager.getConnection(url,username,password);
//3、创建sql对象(Statement/PreparedStatement/CallableStatement)
//Statement可以用来查询和操作数据库,缺点有注入漏洞。
//PreparedStatement预处理sql对象,安全性和可用性较高。
具有set方法可以有效防止sql注入漏洞。
//CallableStatement用来调用存储过程
statement=ct.createStatement();
//4、通过statement向数据库发出sql指令
//executeQuery用来执行DQL语句,查询操作
//executeUpdate用来执行DML语句,增删改操作
intn=statement.executeUpdate("insertintouser1values(user1_seq.nextval,'alex','123','alex@',sysdate,16)");
//可以通过n来判断sql操作是否成功!
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭资源[先开后关,后开先关]
if(statement