JDBC入门
- 导jar包:驱动!
- 加载驱动类:Class.froName(“类名”);
- 给出url、username、password,其中url背下来
- 使用DriverManager类来得到Connection对象!
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import static java.lang.Class.forName;
public class Demo1 {
/**
* @throws ClassNotFoundException
* >没有导驱动包
*
* @throws SQLException
*>检查3个参数:url、username、password是否正常
*>检查是否开启了mysql服务器
* >使用最新版本的mysql驱动,在url之后加上?serverTimezone=UTC
*/
@Test
public void fun1() throws ClassNotFoundException,SQLException {
/**
* jdbc四大配置参数
* >driverClassName:com.mysql.jdbc.Driver
* >url: jdbc:mysql://localhost:3306/mydb3
* >username:root
* >password:*******************
*/
/**
* 所有的java.sql.Driver实现类,都提供了static块,块内的代码就是把自己注册到
* DriverManager中
*/
/**
* jdbc4.0之后,每个驱动jar包中,在META-INF目录下提供一个名为java.sql.Driver的文件。
* 文件的内容就是该接口的实现类的名称
*/
Class.forName("com.mysql.jdbc.Driver");
//com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver();
//DriverManager.registerDriver(driver);
//使用url、username、password,得到连接对象
Connection con=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test1?serverTimezone=UTC","root","zheshiwodeMYSQL555.");
System.out.println(con);
}
}
1. 什么是jdbc
jdbc(Java DataBase Connectivity)就是java数据库连接,就是用java语言来操作数据库。
2. JDBC对象介绍
1. DriverManager
-
只需要会使用DriverManager的getConnection()方法即可;
- Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
- String url=“jdbc:mysql://localhost:3306/test1?serverTimeZone=UTC”;
- String username=“root”;
- String password=“123”;
- Connection con = DriverManager.getConnection(url,username,password);
-
注意,上面代码可能出现两种异常:
- ClassNotFoundException:这个异常是在第一句上出现的,出现这个异常有两个可能:
- 没有给出mysql的jar包;
- 把类名称打错了,查看类名是不是com.mysql.jdbc.Driver。
- SQLException:这个异常出现在第五句,出现这个异常就是三个参数的问题,往往username和password一般不会出错,所以需要认真查看url是否出错。(新版本的需要在数据库名后加上“?serverTimeZone=UTC)
- ClassNotFoundException:这个异常是在第一句上出现的,出现这个异常有两个可能:
2. Connection
- connection最重要的方法就是获取statement
Statement stmt=con.createStatement(); - 后面学习resuleSet方法时,还要学习一下这个方法:
Statement stmt = con.createStatement(int , int);
3. Statement
-
Statement最为重要的方法是:
- int executeUpdate(String sql):执行更新操作,即执行insert、update、delete语句,其实这个方法可以执行create table 、alter table,以及drop table等语句,但我们很少会使用JDBC来执行这些语句;
- ResultSet executeQuery(String sql):执行查询操作,执行查询操作会返回ResultSet,即结果集。
-
boolean(execute)
statement还有一个boolean execute()方法,这个方法可以用来执行增、删、改、查所有SQL语句。该方法返回的是boolean类型,表示SQL语句是否执行成功。- 如果使用execute()方法执行的是更新语句,那么还要调用int getUpdateCount()来获取 insert、update、delete语句所影响的行数。
- 如果使用execute()方法执行的是查询语句,那么还要调用ResultSet() 来获取select语句的查询结果。
4. resultSet之滚动结果集
resultSet表示结果集,它是一个二维的表格!resultSet内部维护一个行光标(游标),resultSet提供了一系列的方法来移动光标
- void beforeFirst(): 把光标放到第一行的前面,这也是光标默认的位置;
- void afterLast(): 把光标放到最后一行的后面;
- boolean first():把光标放到第一行的位置上,返回值表示控制光标是否成功;
- boolean last():把光标放到最后一行的位置上;
- boolean isBeforeFirst():当前光标位置是否在第一行前面;
- boolean isAfterLast():当前光标位置是否在最后一行的后面;
- boolean isFirst():当前光标位置是否在第一行上;
- boolean isLast():当前光标位置是否在最后一行上;
- boolean previous():把光标向上挪一行;
- boolean next():把光标向下挪一行;
- boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
- boolean absolute(int row):绝对位移,把光标移动到指定的行上;
- int getRow():返回当前光标所有行。
获取结果集元数据!
- 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;
- 获取结果集列数:int getColumnCount();
- 获取指定列的列名:String getColumnName(int colindex);
结果集的特性:当使用Connection时,已经确定了Statement生成的结果集是什么特性
- 是否可滚动
- 是否敏感
- 是否可更新
- con.createStatement():生成的结果集:不敏感、不滚动、不可更新!
- con.createStatement(int ,int):
-
-
第一个参数:
- ResultSet.TYPE_FORWARD)ONLY:不滚动结果集;
- ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会跟随数据库而变化;
- ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会跟随数据库而变化;
-
-
第二个参数:
- CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
- CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。
- 上面方法分为两类,一类用来判断游标位置的,另一类是用来移动游标的。如果结果集是不可滚动的,那么只能使用next()方法来移动光标,而beforeFirst()、afterLast()、first()、last()、prevoius()、relative()方法都不能使用!!!
- 结果集是否支持滚动,要从Connection类的createStatement()方法说起。也就是说创建的statement决定了使用statement创建的resultSet是否支持滚动。
- Statement createStatement(int resultSetType , int resultSetConcurrency)
-
-
resultSetType的可选值:
- ResultSet.TYPE_FORWARD)ONLY:不滚动结果集;
- ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会跟随数据库而变化;
- ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会跟随数据库而变化;
- 可以看出,如果想使用滚动的结果集,我们应该选择TYPE_SCROLL_INSENSITIVE!其实很少有数据库驱动会支持TYPE_SCROLL_SENSITIVE的特性!通常我们也不需要查询到的结果集再受到数据库变化的影响。
-
-
resultSetConcurrency的可选值:
- CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
- CONCUR_UPDATABLE:结果集是可更新的,对结果集可以反向影响数据库。
- 通常可更新结果集这一“高级特性”我们也是不需要的!
- 获取滚动结果集的代码如下:
Connection con=........
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY);
String sql =.......//查询语句
ResultSet rs=stmt.executeQuery(sql);//这个结果集是可滚动的
5. ResultSet之获取列数据
-
可以通过next() 方法使ResultSet的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet提供了一系列的获取列数据的方法:
- String getString(int columnindex): 获取指定列的int类型数据;
- int getInt(int columnindex): 获取指定列的int类型数据;
- double getDouble(int columnindex): 获取指定列的double类型数据;
- boolean getBoolean(int columnindex) : 获取指定列的boolean类型数据;
- Object getObject(int columnindex):获取指定列的Object类型的数据。
- 上面方法中,参数columnindex表示列的索引,列索引从1开始,而不是0,这第一点与数组不同。如果你清楚当前列的数据类型,那么可以使用getint()之类的方法来获取,如果你不清楚列的类型,那么你应该使用getObject()方法来获取。 ResultSet还提供了一套通过列名称来获取列数据的方法:
- String getString(String columnName):获取名称为columnName的列的String数据;
- int getint(String columnName):获取名称为columnName的列的int数据;
- double getDouble(String columnName):获取名称为columnName的列的double数据;
- boolean getBoolean(String columnName):获取名称为columnName的列的boolean数据;
- Object getObject(String columnName):获取名称为columnName的列的Object数据;