JDBC及DBUtils.docx
- 文档编号:12102498
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:62
- 大小:35.74KB
JDBC及DBUtils.docx
《JDBC及DBUtils.docx》由会员分享,可在线阅读,更多相关《JDBC及DBUtils.docx(62页珍藏版)》请在冰点文库上搜索。
JDBC及DBUtils
JDBC编程
思考:
软件中最重要的是什么?
数据(MySQL)通过程序操作数据
1.什么是JDBC
JDBCJavaDataBaseConnection即数据库连接技术。
那么该技术是SUN公司提供的一套API类。
java.sql.*操作数据库的接口
javax.sql.*操作数据库的类的扩展
2.体验连接数据库的参数
协议:
//主机名:
端口/数据库名jdbc:
mysql:
//localhost:
3306/day13
用户:
root
密码:
root
驱动类:
com.mysql.jdbc.Driver驱动.jar
MyEclipse中的数据库视图
3.JDBC的设计
进行JDBC编程的时候需要使用SUN提供的JDBC接口进行实现,这样的话开发者只需要面向接口,而不需要
面向具体的数据库的驱动类,可以方便后期的维护(便于扩展)。
4.java.sql.*包中提供的接口和类
-----|Driver接口
-----|DriverManager类
-----|Connection接口
-----|Statement接口
---------|PreparedStatement接口
-------------|CallableStatement接口
-----|ResultSet接口
体验:
使用JDBC查询指定数据库的指定的表数据?
准备数据:
mysql>createdatabaseday15
->charactersetutf8
->collateutf8_general_ci;
mysql>useday15;
mysql>createtabletest(
->idintprimarykeyauto_increment,
->namevarchar(20)notnull,
->addressvarchar(100)default''
->);
mysql>insertintotest(name,address)values('jack','gz');
mysql>select*fromtest;
+----+------+---------+
|id|name|address|
+----+------+---------+
|1|jack|gz|
+----+------+---------+
代码:
1.创建javase项目引入mysql-connector-java-5.1.6-bin.jar包
2.创建java类
publicclassTestJDBC{
publicstaticvoidmain(String[]args)throwsException{
//1.创建驱动类对象
Driverdriver=(Driver)Class.forName("com.mysql.jdbc.Driver").newInstance();
//2.注册驱动
DriverManager.registerDriver(driver);
//3.建立连接
Stringurl="jdbc:
mysql:
//localhost:
3306/day15";
Stringname="root";
Stringpsw="root";
Connectionconn=DriverManager.getConnection(url,name,psw);
//4.定义语句对象
Stringsql="select*fromtest";
Statementstate=conn.createStatement();
//5.执行SQL语句,获取结果对象
ResultSetset=state.executeQuery(sql);
//6.遍历数据
while(set.next()){
intid=set.getInt
(1);
Stringusername=set.getString
(2);
Stringaddress=set.getString(3);
System.out.println(id+""+username+""+address);
}
//7.释放资源
set.close();
state.close();
conn.close();
}
}
5.java.sql.*API详解
-----|Driver接口
该接口定义了连接各种数据库通用的方法和属性。
那么每一个数据库厂商都有该接口的实现类。
MySQL:
com.mysql.jdbc.Driver
源码:
com.mysql.jdbc.Driver
publicclasscom.mysql.jdbc.DriverextendsNonRegisteringDriverimplementsjava.sql.Driver{
static
{
try
{
DriverManager.registerDriver(newDriver());
}catch(SQLExceptionE){
thrownewRuntimeException("Can'tregisterdriver!
");
}
}
}
源码:
org.gjt.mm.mysql.Driver
publicclassDriverextendscom.mysql.jdbc.Driver{
}
思考:
在一个数据库的驱动包中为什么提供了两个驱动的实现类?
MySQL早期是没有自己的驱动的jar包的,一个社区的程序员免费的给MySQL提供了一个java版本驱动,
然后供开发者下载org.gjt.mm.mysql.Driver。
那么随着后期MySQL的发展,MySQL公司自己开发了数据库
的驱动com.mysql.jdbc.Driver,但是为了维护以前的项目,原来的社区的驱动依旧在官方的驱动包。
-----|DriverManager类
该类主要用于管理注册好的不同的数据库的驱动类。
主要的方法有如下两个:
staticvoidregisterDriver(Driverdriver)注册驱动(一般在驱动的实现类的静态代码块中被调用)
staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)获取数据库连接
参数:
url连接数据库的地址
格式:
协议:
子协议:
//主机名:
端口号/数据库
举例:
jdbc:
mysql:
//localhost:
3306/day15
当连接的数据库的主机名是本机自身和默认的端口3306,那么可以简化为以下方式
jdbc:
mysql:
///day15
参数:
user连接数据库的用户名
参数:
password连接数据库的密码
-----|Connection接口
该接口主要用于定义web服务器和数据库服务器建立连接的共性和协议。
一般有两大用途:
第一大用途:
建立语句对象
StatementcreateStatement()获取普通的语句对象(一般的SQL)
PreparedStatementprepareStatement(Stringsql)获取预编译的语句对象(带?
的SQL语句)
CallableStatementprepareCall(Stringsql)获取执行存储过程的语句对象(存储过程)
voidclose()
第二大用途:
事务操作(待定)
voidsetAutoCommit(booleanautoCommit)
voidrollback()
SavepointsetSavepoint()
voidrollback(Savepointsavepoint)
voidcommit()
voidsetTransactionIsolation(intlevel)
-----|Statement接口(执行一般的SQL语句)
该接口的实现类主要用于执行SQL语句。
booleanexecute(Stringsql)执行SQL语句,查询语句true更新语句false
ResultSetexecuteQuery(Stringsql)只能执行查询语句,返回查询的结果
intexecuteUpdate(Stringsql)只能执行更新语句(删除、修改、添加)返回值是影响的行数
ResultSetgetResultSet()获取语句对象查询的结果数据
---------|PreparedStatement接口(执行带?
号的SQL语句)
该接口的主要的目的是创建一个可以执行带?
的SQL语句对象(一般的SQL语句也可以执行)。
voidsetInt(intparameterIndex,intx)设置指定列的参数:
参数1:
?
号的位置
(1)参数2:
值(列的类型只能是int)
voidsetString(intparameterIndex,Stringx)设置指定列的参数:
参数1:
?
号的位置
(1)参数2:
值(列的类型只能是varchar/char/text)
voidsetObject(intparameterIndex,Objectx)类型未知的时候使用
原来的插入操作:
publicstaticintinsertTest(Testtest)throwsException{
Connectionconn=null;
Statementstate=;
intcount=0;
//1.加载驱动类
nullClass.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn=DriverManager.getConnection("jdbc:
mysql:
///day15","root","root");
//3.创建语句对象
Stringsql="insertintotest(name,address)values('"+test.getName()+"','"+test.getAddress()+"')";
state=conn.createStatement();
//4.执行sql语句
count=state.executeUpdate(sql);
//5.释放资源
state.close();
conn.close();
returncount;
}
以上的情况会导致在拼接SQL的时候容易发生错误!
使用PreparedStatement接口进行改进后的代码
publicstaticintinsertTest(Testtest)throwsException{
Connectionconn=null;
PreparedStatementstate=null;
intcount=0;
//1.加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn=DriverManager.getConnection("jdbc:
mysql:
///day15","root","root");
//3.创建语句对象
Stringsql="insertintotest(name,address)values(?
?
)";
state=conn.prepareStatement(sql);
//4.设置参数替换SQL语句中的?
state.setString(1,test.getName());
state.setString(2,test.getAddress());
//5.执行sql语句
count=state.executeUpdate();
//6.释放资源
state.close();
conn.close();
returncount;
}
-------------|CallableStatement接口*(执行存储过程)
该接口的实现类只能调用存储过程。
准备:
delimiter//
createproceduredeletePro()
begin
deletefromtestwhereid=6;
end//
代码:
publicstaticvoiddeleteTest()throwsException{
Connectionconn=null;
CallableStatementstate=null;
//1.加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn=DriverManager.getConnection("jdbc:
mysql:
///day15","root","root");
//3.创建语句对象
Stringsql="calldeletePro()";
state=conn.prepareCall(sql);
//4.执行sql语句
state.execute();
//5.释放资源
state.close();
conn.close();
}
-----|ResultSet接口
该接口主要的目的是接收查询的数据。
代表查询的一张表。
主要提供的方法就是用于遍历结果数据。
booleannext()判断下一行是否有数据。
有true没有false
booleanprevious()判断上一行是否有数据。
有true没有false
booleanfirst()将指针移动到第一行
booleanlast()将指针移动到最后一行
booleanabsolute(introw)将指针移动到指定的行
intgetInt(intcolumnIndex)读取指定的列(该列定义的类型必须是int),指定列数
(1)
StringgetString(intcolumnIndex)读取指定的列(该列定义的类型必须是char/varchar()/text),指定列数
(1)
ObjectgetObject(StringcolumnName)读取位置类型的列的数据
mysql>select*fromtest;
+----+------+---------+
|id|name|address|<-------指针(默认)
+----+------+---------+
|1|jack|gz|
|2|lucy|xg|
|3|lili|usa|
+----+------+---------+
6.JDBC的模版代码(重点)
如果要实现一个表的增、删、改、查需要提供分别4个方法进行操作,那么会导致有如下的几个问题:
1.获取连接重复
2.连接数据库的参数写死
3.释放资源重复
解决:
1.定义连接数据库的参数的配置文件
db.properties
driverclass=com.mysql.jdbc.Driver
url=jdbc:
mysql:
///day15
name=root
psw=root
2.定义工具类获取参数、提供返回数据库连接的方法、释放资源
publicclassDBUtils{
privatestaticStringdriverClass=null;
privatestaticStringurl=null;
privatestaticStringname=null;
privatestaticStringpsw=null;
//初始化变量
static{
Propertiesps=newProperties();
//使用反射获取流
InputStreamin=DBUtils.class.getResourceAsStream("/db.properties");
try{
ps.load(in);
//获取值并初始化变量
driverClass=ps.getProperty("driverclass");
url=ps.getProperty("url");
name=ps.getProperty("name");
psw=ps.getProperty("psw");
//测试
System.out.println(driverClass+""+url+""+name+""+psw);
}catch(IOExceptione){
}
}
//提供一个方法用于返回连接
publicstaticConnectiongetConnection()throwsException{
//加载驱动
Class.forName(driverClass);
returnDriverManager.getConnection(url,name,psw);
}
//释放资源
publicstaticvoidreleaseResource(Connectionconn,Statementstate,ResultSetset){
//释放资源
if(set!
=null){
try{
set.close();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
set=null;
}
}
if(state!
=null){
try{
state.close();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
state=null;
}
}
if(conn!
=null){
try{
conn.close();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
conn=null;
}
}
}
//测试
publicstaticvoidmain(String[]args)throwsException{
System.out.println(newDBUtils().getConnection());
}
}
3.写一个操作数据库表的Dao类
TestDao.java
publicclassTestDao{
//提供一个方法进行更新test
@org.junit.Test
publicvoidupdateTest()throwsException{
Testtest=newTest(1,"jnb","td");
Connectionconn=null;
PreparedStatementstate=null;
conn=DBUtils.getConnection();
Stringupdate="updatetestsetname=?
address=?
whereid=?
";
state=conn.prepareStatement(update);
//设置参数
state.setString(1,test.getName());
state.setString(2,test.getAddress());
state.setInt(3,test.getId());
//执行
state.executeUpdate();
//释放资源
DBUtils.releaseResource(conn,state,null);
}
}
7.Web案例:
图书管理系统
分析:
图书
准备数据:
7.1数据库层
createtablebooks(
idvarchar(120)primarykey,
namevarchar(40)notnull,
authorvarchar(40)notnull,
pricedoubledefault0.0,
publishervarchar(20)notnull,
createdatedatenotnull,
infotext
)
7.2bean层
publicclassBook{
privateStringid;
privateStringname;
privateStringauthor;
privatedoubleprice;
privateStringpublisher;
privateDatecreatedate;
privateStringinfo;
//省略get和set和构造函数
}
7.3utils层
引入包:
mysql-connector-java-5.1.6-bin.jar
参考上面的工具类(一致)
7.4dao层
publicclassBookDao{
//提供一个插入图书的方法
publicvoidaddOne(Bookbook){
//定义接口的变量
Connectionconn=null;
PreparedStatementstate=null;
try{
//定义sql语句
Stringinsert="insertintobooksvalues(?
?
?
?
?
?
?
)";
//创建语句对象
co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDBC DBUtils