JDBC入门
导jar包,驱动
加载驱动类:Class:forName("类名")
给出url、username、password 其中url很重要
使用DriverManager类来得到Connection对象
mysql-connector-java-5.1.45\src\com\mysql\jdbc 查看驱动源码
1、JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用java语言来操作数据库,原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句
2、JDBC原理
早期SUN公司想编写连接任何数据库的API,但是开始编就发现不可能,因为各个厂商的数据库服务器差异太大了,后来讨论后,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动
找百度就完了
#mysql
#url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8.....
#driverClassName=com.mysql.jdbc.Driver
#mssql
#driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mydb
#mssql jtds
#driverClassName=net.sourceforge.jtds.jdbc.Driver
#url=jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=mydb
#oracle
#driverClassName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:mydb
#access
#driverClassName=sun.dbc.odbc.JdbcOdbcDriver
#url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=mdb\\mydb.mdb
2、DriverManager
其实今后只需要会用DriverManager的getConnection()方法即可
1、Class.forName("com.mysql.jdbc.Driver");
2、String url ="jdbc:mysql://localhost:3306/db1";
3、String username = "root";
4、String password = "123";
5、Connection con = DriverManager.getConnection(url,username,password);
上面的代码可能会出现两种异常
1、ClassNotFoundException 这个异常在第一句上出现的,出现这个异常有两个可能
没有给出mysql的jar包
把类名称打错了,查看类名是否为com.mysql.jdbc.Driver
2、SQLException 这个异常出现在第5句,出现这个异常就是第三个参数的问题,往往username和password一般不会出错,所以需要认真看url是否打错
对于DriverManager.registerDriver()了解,今后注册驱动一般都会用Class.forName()
3、Connection
Connection最为重要的方法就是获取Statement
Statement stmt = con.createStatement();
后面在学习ResultSet()方法时,还要学习一下下面的语法
Statement stmt = con.createStatement(int,int); 这两个参数是用来确定创建的statement能生成什么样的结果集
4、Statement
Statement最为重要的方法是
int executeUpdate(String sql) -->create、alter、drop、insert、update、delete执行更新操作,即执行insert、update、delete语句,其实这个方法也可以执行create table、alter table以及drop table等语句,但我们很少会使用JDBC来执行这些语句
ResultSet executeQuery(String sql)-->select执行查询操作,执行查询操作会返回ResultSet即结果集
boolean execute()
Statement还有一个boolean execute()-->(可以执行executeUpdate()和executeQuery()两个方法能执行的sql语句),这个方法可以用来执行增、删、改、查所有SQL语句。该方法返回的是boolean类型,表示SQL语句是否有结果集
如果使用execute()方法执行的更新语句,那么还要调用int getUpdateCount()来获取insert()、update、delete语句所影响的行数
如果使用execute()方法执行的是查询语句,那么还要调用ResultSet getResultSet()来获取select语句的查询结果
5、ResultSet之滚蛋结果集
下一行默认只能使用它,其他的方法存在,但不能使用。默认的结果集不可滚动
上一行
下N行
上N行
ResultSet表示结果集,是一个二维的表格。ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标
void beforeFist():把光标放到第一行的前面,也就是光标默认的位置
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():返回当前光标所有行
一般数据库就next MySQL previous、relative、absolute普通创建就能用
获取结果集元数据
得到元数据 rs.getMetaDate() 返回值为ResultSetMetaData;
获取结果集列数: int getColumnCount();
获取指定列的列名:String getColumnNames(int colindex)
结果集特性:当使用Connection的createStatement时,已经确定了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()、previous()、relative()都不能用
结果集是否支持滚动,要从Connection类的creteStatement()方法说起,也就是说创建的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:结果集是可更新的,对结果集的更新可以反向影响数据库
通常可更新结果集也是不需要的
6、ResultSet之获取列数据
可以通过next()方法使ResultSet的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet提供了一系列的获取列数据的方法
String getString(int columnIndex):获取指定列的String类型数据
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): 获取指定列的int类型数据
double getDouble(String columnName):获取指定列的double类型数据
boolean getBoolean(String columnName):获取指定列的boolean类型数据
Object getObject(String columnName):获取指定列的Object类型的数据

public class Demo1 {
/**
* ClassNotFoundException
* 没导驱动包
* SQLException
* 检查3个参数:url、username、password是否正确
* 检查是否开启了mysql服务器
*/
@Test
public void fun1() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/db1","root","123");
System.out.println(con);
}
}
public class Demo2 {
@Test
public void fun1() throws ClassNotFoundException, SQLException{
String driverClassName="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db1";
String username="root";
String password="123";
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url,username,password);
System.out.println(con);
Statement stmt = con.createStatement();
String sql = "DELETE FROM stu";
int r = stmt.executeUpdate(sql);
System.out.println(r);
}
@Test
public void fun2() throws ClassNotFoundException, SQLException{
String driverClassName="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db1";
String username = "root";
String password = "123";
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url,username,password);
Statement stmt = con.createStatement();
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int empno = rs.getInt(1);
String ename = rs.getString("sanme");
System.out.println(empno+","+ename);
}
rs.close();
stmt.close();
con.close();
}
@Test
public void fun3() throws Exception{
Connection con =null;
Statement stmt = null;
ResultSet rs=null;
try{
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db1";
String username = "root";
String password = "123";
Class.forName(driverClassName);
con = DriverManager.getConnection(url,username,password);
stmt = con.createStatement();
String sql ="select * from student";
rs = stmt.executeQuery(sql);
rs.last();
System.out.println(rs.getRow());
rs.beforeFirst();
int count = rs.getMetaData().getColumnCount();
while(rs.next()){
for(int i=1;i<=count;i++){
System.out.print(rs.getString(i));
if(i < count){
System.out.print(",");
}
}
System.out.println();
}
} catch(Exception e){
throw new RuntimeException(e);
} finally {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(con!=null) con.close();
}
}
@Test
public void query(){
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = getConnection();
stmt = con.createStatement();
String sql = "select * from student";
rs = stmt.executeQuery(sql);
while(rs.next()){
String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username+","+password);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private Connection getConnection() throws ClassNotFoundException, SQLException {
String driverClassName="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db1";
String username = "root";
String password = "123";
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url,username,password);
return con;
}
}