1、韩顺平j2eeJDBC与MySQL学习笔记jdbc详解+学生选课项目jdbc简介数据库驱动sun公司为统一对数据库的操作,定义一套java操作数据库的规范(接口+类),称之为jdbc。jdbc接口和类主要是放在java.sql包和javax.sql包。JDBC全称为:Java Database Connectivity (java数据库连接),它主要由接口组成。组成JDBC的2个包:java.sql和javax.sql开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。做jdbc开发的几个前提1、引包import java.sql.*;import ja
2、vax.sql.*;2、把数据库驱动包jar包导入到java项目中,使用不同的数据库时要使用对应数据库版本的驱动。这些驱动可以到相应数据库提供商的官方网站下载。第一个JDBC程序编写一个程序,这个程序从user1表中读取数据,并打印在命令行窗口中。一、搭建实验环境:1、在oracle中创建一个库,并创建user1表和插入表的数据。user1表结构如下:id number 主键 自增长name varchar2(30)passwd varchar2(50)email varchar2(100)birthday dateage number(3)oracle下先建序列create sequence
3、 user1_seqstart with 1increment by 1minvalue 1nomaxvaluenocachenocycle;建user1表create table user1(id number primary key,name varchar2(30),passwd varchar2(50),email varchar2(100),birthday date,age number(3);2、新建一个java工程,并导入数据驱动。二、编写程序,在程序中加载数据库驱动DriverManager.registerDriver(Driver driver);Class.forNam
4、e(oracle.jdbc.driver.OracleDriver);程序详解-DriverManagerJdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个类的常用方法:DriverManager.registerDriver(new OracleDriver()注意:在实际开发中,并不推荐采用这个方法注册驱动。查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序加载两次,也就是在内存中会有两个Driver对象。推荐方式:Class.forName(oracle.jdbc.driver.OracleDriver);采用此种方式不会导致驱动对象在内存
5、中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱动,使程序的灵活性更高。DriverManager.getConnection(url,user,password),根据url获取数据库的链接。三、建立连接(Connection)Connection conn=DriverManager.getConnection(url,user,pass);数据库URLURL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:常用数据库URL地址的写法:Oracle-jdbc:oracle:thin:l
6、ocalhost:1521:sidSqlserver-jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=sidMySql-jdbc:mysql:/localhost:3306/sid程序详解-Connection接口Jdbc程序中的Connection,它用于代表数据库的链接,Connection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过Connection对象完成的,这个对象的常用方法:createStatement():创建向数据库发送sql的statement对象。prepareStatement(sql):创
7、建向数据库发送预编译sql的PrepareSatement对象。prepareCall(sql):创建执行存储过程的callableStatement对象。setAutoCommit(boolean autoCommit):设置事务是否自动提交。commit():在链接上提交事务。rollback():在链接上回滚事务。System.out.println(接口引用的某个类实例);将输出该类的全名十六机制的hash值,该方法常用于查看某个接口引用指向的真正对象实例的类型是什么!Connection接口连接不同的数据库,返回的对象实例类型是不同的。对Connection中的事务提交示例详解:se
8、tAutoCommit,commit(),rollback()的使用package com.oracle.jdbc.test;import java.sql.*;publicclass TestJdbcAutoCommit /使用jdbc去操作oracle数据库-事务处理setAutoCommit publicstaticvoid main(String args) Connection ct=null; Statement statement=null; String url=jdbc:oracle:thin:127.0.0.1:1521:orcl; String username=scot
9、t; String password=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指
10、令 /需求:对emp表进行操作,把SMITH的sal-10给KING的sal+10 statement.executeUpdate(update emp set sal=sal-10 where ename=SMITH); statement.executeUpdate(update emp set sal=sal+10 where ename=KING); /提交所有语句 mit(); catch (Exception e) /如果事务中的sql语句中有任何错误则进行回滚操作。 try ct.rollback(); catch (SQLException e1) e1.printStackT
11、race(); e.printStackTrace(); finally /关闭资源先开后关,后开先关 if(statement!=null) try statement.close(); catch (SQLException e) e.printStackTrace(); statement=null; if(ct!=null) try ct.close(); catch (SQLException e) e.printStackTrace(); ct=null; 四、创建用于向数据库发送SQL的Statement对象,并发送SQLStatement st=conn.createState
12、ment();ResultSet rs=st.excuteQuery(sql);程序详解-ResultSetJdbc程序中的ResultSet用于代表sql语句的执行结果。ResultSet封装执行结果时,采用类似于表格的方式。ResultSet对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next()方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法。获取任意类型的数据getObject(int index)getObject(string colum
13、nName)获取指定类型的数据,如:getString(int index)getString(String columnName)提问:数据库中列的类型是varchar2,获取该列的数据调用什么方法?int类型呢?bigint类型呢?boolean类型?答:获取varchar2类型的列数据,会调用getString方法。常用数据类型转换表(oracle)SQL类型jdbc对应方法返回类型numbergetBoolean()booleannumbergetByte()bytenumbergetShort()shortnumbergetInt()intnumbergetLong()longcha
14、r,nvarchar2,varchar2getString()StringText(clob) BlobgetClob getBlob()Clob BlobDATEgetDate()java.sql.DateTIMESTAMPgetTimestamp()java.sql.TimestampnumbergetFloat()floatnumbergetDouble()double常用数据类型转换表(sql server)编号SQLServer数据库类型JDBC类型1intjava.lang.Integer2varcharjava.lang.String3charjava.lang.String4n
15、charjava.lang.String5nvarcharjava.lang.String6textjava.lang.String7ntextjava.lang.String8tinyintjava.lang.Integer9intjava.lang.Integer10tinyintjava.lang.Integer11smallintjava.lang.Integer12bitjava.lang.Boolean13bigintjava.lang.Long14floatjava.lang.Double15decimaljava.math.BigDecimal16moneyjava.math.
16、BigDecimal17smallmoneyjava.math.BigDecimal18numericjava.math.BigDecimal19realjava.lang.Float20uniqueidentifierjava.lang.String21smalldatetimejava.sql.Timestamp22datetimejava.sql.Timestamp23timestampbyte24binarybyte25varbinarybyte26imagebyte27sql_variantjava.lang.String 常用数据类型转换表(MySql)类型名称显示长度数据库类型J
17、AVA类型VARCHARL+NVARCHARjava.lang.String CHARNCHARjava.lang.StringBLOBL+NBLOBjava.lang.byteTEXT65535VARCHARjava.lang.StringINTEGER4INTEGER UNSIGNEDjava.lang.LongTINYINT3TINYINT UNSIGNEDjava.lang.Integer SMALLINT5SMALLINT UNSIGNEDjava.lang.IntegerMEDIUMINT8MEDIUMINT UNSIGNEDjava.lang.IntegerBIT1BITjava
18、.lang.BooleanBIGINT20BIGINT UNSIGNEDjava.math.BigIntegerFLOAT4+8FLOATjava.lang.FloatDOUBLE22DOUBLEjava.lang.DoubleDECIMAL11DECIMALjava.math.BigDecimalBOOLEAN1同TINYINT ID11PK(INTEGER UNSIGNED)java.lang.LongDATE10DATEjava.sql.DateTIME8TIMEjava.sql.TimeDATETIME19DATETIMEjava.sql.TimestampTIMESTAMP19TIM
19、ESTAMPjava.sql.TimestampYEAR4YEARjava.sql.Date五、从表结果集的ResultSet中取出数据,打印到命令行窗口程序详解-ResultSetResultSet还提供了对结果集进行滚动的方法:next():移动到下一行Previous():移动到前一行absolute(int row):移动到指定行row从1开始计算beforeFirst():移动resultSet的最前面afterLast():移动到resultSet的最后面ResultSet的说明:在默认情况下,rs的结果集,只能向前移动,这样rs结果集只能使用一次,不能复用。如果需要复用,则可以在
20、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 可写并发ResultSe
21、t的详细讲解示例代码:package com.oracle.jdbc.test;import java.sql.*;publicclass TestJdbcResultSet /使用jdbc去操作oracle数据库-ResultSet publicstaticvoid main(String args) Connection ct=null; Statement statement=null; ResultSet rs=null; String url=jdbc:oracle:thin:127.0.0.1:1521:orcl; String username=scott; String pas
22、sword=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.
23、CONCUR_READ_ONLY); /4、通过statement向数据库发出sql查询指令,并将返回结果集给ResultSet rs=statement.executeQuery(select * from emp); /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.
24、out.println(雇员编号:+rs.getInt(1)+姓名:+rs.getString(ename)+职位:+rs.getObject(job); catch (Exception e) e.printStackTrace(); finally /关闭资源先开后关,后开先关 if(rs!=null) try rs.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); rs=null; if(statement!=null) try statement.close();
25、 catch (SQLException e) e.printStackTrace(); statement=null; if(ct!=null) try ct.close(); catch (SQLException e) e.printStackTrace(); ct=null; 六、断开与数据库的连接,并释放相关资源。程序详解-释放资源jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet,Statement和Connection对象特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connectio
26、n不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。操作USER1表的java源代码package com.oracle.jdbc.test;import java.sql.*;publicclass TestJdbc /使用jdbc去操作oracle数据库 publicstaticvoid main(String args) Connection ct=null; Statement statement=null; String url=jdbc:oracle:thin:1
27、27.0.0.1:1521:orcl; String username=scott; String password=tiger; /1、加载驱动 try Class.forName(oracle.jdbc.driver.OracleDriver); /2、得到连接 ct=DriverManager.getConnection(url,username,password); /3、创建sql对象(Statement/PreparedStatement/CallableStatement) /Statement可以用来查询和操作数据库,缺点有注入漏洞。 /PreparedStatement预处理
28、sql对象,安全性和可用性较高。具有set方法可以有效防止sql注入漏洞。 /CallableStatement用来调用存储过程 statement=ct.createStatement(); /4、通过statement向数据库发出sql指令 /executeQuery用来执行DQL语句,查询操作 /executeUpdate用来执行DML语句,增删改操作 intn=statement.executeUpdate(insert into user1 values (user1_seq.nextval,alex,123,alex,sysdate,16); /可以通过n来判断sql操作是否成功! catch (Exception e) e.printStackTrace(); finally /关闭资源先开后关,后开先关 if(statement
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1