第9章 JDBC.docx
- 文档编号:11619895
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:45
- 大小:84.84KB
第9章 JDBC.docx
《第9章 JDBC.docx》由会员分享,可在线阅读,更多相关《第9章 JDBC.docx(45页珍藏版)》请在冰豆网上搜索。
第9章JDBC
第10章JDBC
1.由于Java的厂商和数据库的厂商,开发Java与开发数据库的就技术有可能不同,因此,Java要想连接不同的数据库,就必须为不同的数据编写驱动。
因此我们连接不同的数据库,也必须使用不同的驱动程序。
2.Java连接数据库的步骤:
1.加载驱动(就是把数据库驱动加载到内存中,可以让Java操作此数据库)。
Class.forName(驱动名);
2.获取连接(在加载驱动的基础上,连接数据库,这样JVM端就与数据库端保持连接了,也就可以操作数据库。
)
DriverManager.getConnection(Stringurl);
注意:
其中的参数url代表连接什么数据库(数据库名),用户名,密码,那台机器上的数据库,包括数据库的端口。
例:
连接MySQL用
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:
mysql:
//localhost/test?
user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
//连接字符串含义:
jdbc:
mysql:
//localhost/test表示连接的是哪台电脑上的什么数据库,库名叫什么。
//user=root&password=123456表示此数据库的用户名密码
//useUnicode=true&characterEncoding=utf-8"数据库的字符编码方式
例:
连接Oracle
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
Stringurl="jdbc:
oracle:
thin:
@localhost:
1521:
orcl";
//orcl为数据库的SID
Stringuser="test";
Stringpassword="test";
Connectionconn=DriverManager.getConnection(url,user,password);
Connectionconn=DriverManager.getConnection(url);
//连接Oracle的url
jdbc:
oracle:
thin:
@localhost:
1521:
LIUFY
注意:
jdbc:
oracle:
thin:
表示连接Oracle数据库
Localhost:
1521:
表示哪台机器,数据库端口
LIUFY表示此数据库名(服务管理器中:
OracleServiceXXXX,此中的XXXX就是数据库名)
3.操作数据库(Statement这个接口或其子接口)
注意:
Statement,PreparedStatement,CallableStatement----都是接口
Statementstmt=conn.createStatement();
Stringsql="select*fromemployeeswhereename='"+username
+"'andepassword='"+password+"'";
stmt.executeQuery(sql);
4.如果执行查询语句,必须返回结果集ResultSet
ResultSetrs=stmt.executeQuery(sql);
利用rs.next()可以获取数据库中是否有此条记录。
5.关闭数据库
try{
if(rs!
=null){
rs.close();
}
if(stmt!
=null){
stmt.close();
}
if(conn!
=null){
conn.close();
}
}catch(SQLExceptione){
e.printStackTrace();
}
3.连接数据库的小例子
publicclassDBDemo{
publicConnectiongetConnection(){
Connectionconn=null;
try{
//Class.forName("org.gjt.mm.mysql.Driver");
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:
mysql:
//localhost/employee?
user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
//test为数据库名
conn=DriverManager.getConnection(url);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}
returnconn;
}
publicvoidfree(Connectionconn,Statementstmt,ResultSetrs){
try{
if(rs!
=null){
rs.close();
}
if(stmt!
=null){
stmt.close();
}
if(conn!
=null){
conn.close();
}
}catch(SQLExceptione){
e.printStackTrace();
}
}
publicbooleanselectOneDataByENameAndEPassword(Stringusername,
Stringpassword){
booleankey=false;
Connectionconn=null;
Statementstmt=null;
ResultSetrs=null;
try{
conn=this.getConnection();
stmt=conn.createStatement();
Stringsql="select*fromemployeeswhereename='"+username
+"'andepassword='"+password+"'";
rs=stmt.executeQuery(sql);
if(rs.next()){
key=true;
}
}catch(Exceptione){
e.printStackTrace();
}finally{
free(conn,stmt,rs);
}
returnkey;
}
}
4.Class(java.lang包)
Class类的实例表示正在运行的Java应用程序中的类和接口。
publicstaticClass
>forName(String className)throwsClassNotFoundException
作用:
把指定路径下的类或接口className加载到JVM中。
5.DriverManager(java.sql包)
publicclassDriverManagerextendsObject
作用:
管理一组JDBC驱动程序的基本服务。
1.publicstaticConnectiongetConnection(String url)throwsSQLException
作用:
试图建立到给定数据库URL的连接。
即获取数据库连接对象,注意必须加载驱动后才能调用(注意:
从JDK6.0以后,JDBC发展到4.0,加载驱动的代码可以不写,但是必须配置)。
2.publicstaticConnectiongetConnection(String url,Properties info)throwsSQLException
作用:
试图建立到给定数据库URL的连接。
在Properties中配置用户名密码。
通常至少应该包括"user"和"password"属性。
3.publicstaticConnectiongetConnection(String url,String user,String password)throwsSQLException
作用:
试图建立到给定数据库URL的连接。
6.Connection接口
publicinterfaceConnectionextendsWrapper
作用:
与特定数据库的连接(会话)。
在连接上下文中执行SQL语句并返回结果。
1.StatementcreateStatement()throwsSQLException
作用:
创建一个Statement对象用于操作数据库(包括添删改查)。
2.PreparedStatementprepareStatement(String sql)throwsSQLException
作用:
创建一个PreparedStatement对象用于操作数据库(包括添删改查)。
3.CallableStatementprepareCall(String sql)throwsSQLException
作用:
创建一个CallableStatement对象用于操作存储过程。
4.voidsetAutoCommit(boolean autoCommit)throwsSQLException
作用:
设置数据库的提交方式:
包括自动提交,手动提交(true表示自动提交,false表示手动提交)
5.voidcommit()throwsSQLException
作用:
如果setAutoCommit(false);必须用commit();手动进行提交。
6.voidrollback()throwsSQLException
作用:
如果setAutoCommit(false);如果发现错误,可以利用rollback()方法进行回滚。
7.voidclose()throwsSQLException
作用:
立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放。
7.publicinterfaceStatementextendsWrapper
作用:
用于执行静态SQL语句并返回它所生成结果的对象。
1.ResultSetexecuteQuery(String sql)throwsSQLException
作用:
执行select语句。
返回ResultSet。
2.intexecuteUpdate(String sql)throwsSQLException
作用:
执行insert,update,delete语句,返回影响行数。
8.publicinterfaceResultSetextendsWrapper
作用:
存储executeQuery方法的返回结果。
1.booleannext()throwsSQLException
作用:
将光标从当前位置向前移一行。
ResultSet光标最初位于第一行之前;第一次调用next方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。
9.Properties类为Hashtable的子类。
publicclassPropertiesextendsHashtable
1.publicvoidload(InputStream inStream)throwsIOException
作用:
加载指定的InputStream流(InputStream流中加载*.properties文件)。
2.publicStringgetProperty(String key)
作用:
获取键为key的值。
注意:
在J2SE中的加载load中的InputStream与J2EE中的InputStream略有不同。
因此,以下代码只适合J2SE情况。
10.由于Statement具有SQL注入的缺点,因此一般不推荐使用。
最简单的sql注入:
用户名:
任意
密码:
'or'1'='1
11.由于Statement的漏洞与效率问题,一般JDBC程序操作数据会使用PreparedStatement。
12.PreparedStatement预编译的Statement。
弥补了Statement的SQL注入漏洞,在反复执行同一条语句效率极高。
publicinterfacePreparedStatementextendsStatement
作用:
SQL语句被预编译并存储在PreparedStatement对象中。
然后可以使用此对象多次高效地执行该语句。
1.ResultSetexecuteQuery()throwsSQLException
作用:
查询数据库。
2.intexecuteUpdate()throwsSQLException
作用:
添删改操作。
3.voidsetXXXX(intlocation,XXXXx);
作用:
将指定参数设置为给定x。
13.自定义类BaseDAO,用于获取连接,以及关闭资源,为抽象类。
(必须会)
publicabstractclassBaseDAO{
publicConnectiongetConnection(){
Connectionconn=null;
try{
//Class.forName("org.gjt.mm.mysql.Driver");
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:
mysql:
//localhost:
3306/employee?
user=root&password=123456&useUnicode=true&characterEncoding=utf-8";
conn=DriverManager.getConnection(url);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}
returnconn;
}
publicvoidfree(Connectionconn,Statementstmt,ResultSetrs){
try{
if(rs!
=null){
rs.close();
}
if(stmt!
=null){
stmt.close();
}
if(conn!
=null){
conn.close();
}
}catch(SQLExceptione){
e.printStackTrace();
}
}
}
14.PreparedStatement的用法(必须会)
publicclassPreparedStatementDemoextendsBaseDAO{
/**
*根据用户名密码判断用户是否存在
*@paramemp
*@return
*/
publicbooleanselectOneDataByNameAndPassword(Employeeemp){
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
booleankey=false;
try{
conn=this.getConnection();
Stringsql="select*fromemployeeswhereename=?
andepassword=?
";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,emp.getEname());
pstmt.setString(2,emp.getEpassword());
rs=pstmt.executeQuery();
if(rs.next()){
key=true;
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
free(conn,pstmt,rs);
}
returnkey;
}
/**
*查询所用用户信息
*@return
*/
publicList
Connectionconn=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
booleankey=false;
List
try{
conn=this.getConnection();
Stringsql="select*fromemployees";
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next()){
Employeeemp=newEmployee();
emp.setEid(rs.getInt("eid"));
emp.setEname(rs.getString("ename"));
emp.setEpassword(rs.getString("epassword"));
emp.setEage(rs.getInt("eage"));
emp.setEsex(rs.getString("esex"));
list.add(emp);
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
free(conn,pstmt,rs);
}
returnlist;
}
/**
*插入一条记录
*@paramemployee
*@return
*/
publicbooleaninsertOneData(Employeeemployee){
Connectionconn=null;
PreparedStatementpstmt=null;
booleankey=false;
try{
conn=this.getConnection();
Stringsql="insertintoemployees(eid,ename,epassword,eage,esex)values(?
?
?
?
?
)";
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,createPrimaryKey());
pstmt.setString(2,employee.getEname());
pstmt.setString(3,employee.getEpassword());
pstmt.setInt(4,employee.getEage());
pstmt.setString(5,employee.getEsex());
intn=pstmt.executeUpdate();
if(n>0){
key=true;
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
this.free(conn,pstmt,null);
}
returnkey;
}
/**
*更新一条记录
*@paramemployee
*@return
*/
publicbooleanupdateOneData(Employeeemployee){
Connectionconn=null;
PreparedStatementpstmt=null;
booleankey=false;
try{
conn=this.getConnection();
Stringsql="updateemployeessetename=?
epassword=?
eage=?
esex=?
whereeid=?
";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,employee.getEname());
pstmt.setString(2,employee.getEpassword());
pstmt.setInt(3,employee.getEage());
pstmt.setString(4,employee.getEsex());
pstmt.setInt(5,employee.getEid());
intn=pstmt.executeUpdate();
if(n>0){
key=true;
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
this.free(conn,pstmt,null);
}
returnkey;
}
/**
*删除一条记录
*@paramemployee
*@return
*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 JDBC