1具体内容
1.1 概念
JDBC(Java DataBase Connectivity)就是 Java 数据库连接,说白了就是用 Java 语言来操作数据库。原来我们操作数据库是在控制台使用 SQL 语句来操作数据库,JDBC 是用 Java 语言向数据库发送 SQL 语句。JDBC(Java Data Base Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。同时,JDBC也是个商标名。 JDBC 屏蔽了底层不同数据库的操作差异,从而使开发者可以通过统一的 Java API 来进行操作不同的数据库,而不必考虑底层具体数据库实现的差异。 所以尽管底层数据库及其驱动有很多种,但 JDBC 是不变的
1.2 JDBC API
由 sun 公司提供,内容为供程序员调用的接口与类,集成在 java.sql 和 javax.sql 包中。JDBC API 可做三件事:与数据库建立连接、执行 SQL 语句、处理结果。
-
DriverManager 类
JDBC 驱动程序管理器 ,是一工厂实现类,用了工厂方法模式。是JDBC的管理层,作用于用户和驱动程序之间。DriverMangerm可以注册和删除加载的驱动程序,可以根据给定的 url 获取符合 url 协议的驱动 Driver 或者是建立 Conenction 连接,进行数据库交互。有两个作用:1)注册驱动:让 JDBC 知道要使用的是哪个驱动所有的驱动程序类必须包含一个静态部分。这个静态部分在加载该实例时由 DriverManager 类进行注册。用户在正常情况下将不会直接调用 DriverManager.regiserDriver 方法,而是在加载驱动程序时由驱动程序自动调用。注册驱动程序:
Class.forName(“com.mysql.jdbc.Driver”);DriverManager.registerDriver(new com.mysql.jdbc.Driver())System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);2)获取 Connection:它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。 -
Dirver 接口
是驱动程序对象的接口,指向具体数据库驱动程序对象
-
connection接口
-
Statement 接口
-
ResultSet接口(结果集)
-
ResultSetMetaData对象
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
获得ResultSetMetaData对象:
ResultSet对象的getMetaData()方法;
ResultSetMetaData对象的常用方法:
int getColumnCount() : 获得本次查询中的列数
String getColumnName(int column) :获得本次查询中指定列的列名。
String getColumnTypeName(int column) :检索指定列的数据库特定的类型名称。
int getColumnDisplaySize(int column) :指示指定列的最大标准宽度,以字符为单位。
String getTableName(int column) :获取指定列的表名称
存储结果集的结构的:表头列名 数据类型 列数量,没有数据。
// 4获取Statment对象,并执行sql
Statement stm=conn.createStatement();
ResultSet rs=stm.executeQuery(sql);//ResultSetMetaData:存储结果ResultSetMetaData metaData=rs.getMetaData();// 5.处理结果:
while(rs.next()){//判断有没有下一行,有就指向——便利行
for(int i=1;i<=metaData.getColumnCount();i++){//遍历 System.out.print(metaData.getColumnName(i)+":"+rs.getObject(i)+"\t");
}
System.out.println();
}
- PreparedStatement
PreparedStatement 接口继承 Statement接口 PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率 。解决SQL注入(登陆千万不要用statement)。使用PrepareStatement对象 与 Statement对象的区别
1.Statement 可以先行创建, 然后将sql语句写入.执行时传入sql
2.PreparedStatement 在创建时一定要传入 sql语句, 因为它要先运送到数据库执行预编译
3.PreparedStatement 在执行之前 先要设置 语句中的参数. (预处理的sql语句有占位? 执行前需要给?指定参数值,执行时可以直接执行不需要传入sql) PrepareStatement 在执行之前已经 设置好了 sql语句 以及对应参数. 执行方法不需要参数
2 JDBC驱动
Java DataBase Connection:使用java使用连接数据库。 由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动不同的数据库都得下载不懂jar包,相同的数据库也需要不同的jar(版本不同) 版本不兼容
2.1 JDBC 访问数据库的步骤
(1)加载数据库的驱动:DriverManager.registerDriver(Driver)_Jar DriveManager里面的registerDriver(Driver driver)Class.forName(包名.类名)_驱动类中书写一个静态代码,只要加载这个 (2)创建与数据库的连接 DriverManager里面getConnection(String url, String user, String password) (3)获取Statemnt对象:stm=conn
(4)编写sql语句:Navicat写好
(5)执行sql语句 Statement里面executeQuery(String sql)
(6)处理结果
(7)释放资源(关闭连接):数据库的连接个数是有限。
public static void main(String[] args){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?
useUnicode=true&characterEncoding=utf-8&useSSL=false","root","数据库密码");
Statement statement = connection.createStatement();
int i = statement.executeUpdate("insert sc value(2008,2,3)");
System.out.println(i);
statement.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
执行查询:
public static void main(String[] args){
try {
Class.forName("com.mysql.jdbc.Driver");
//2连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码");
//3statement
Statement statement = conn.createStatement();
//4sql
String sql = "select * from sc";
//5执行sql
ResultSet resultSet = statement.executeQuery(sql);
//返回受影响的行数
//6返回结果
//获取查询的总列数
ResultSetMetaData metaData = resultSet.getMetaData(); //获取对象
int columnCount = metaData.getColumnCount();//总列数
System.out.println(metaData.getCatalogName(1)+"\n"); // 获取数据库名
while(resultSet.next()){
// int anInt = resultSet.getInt(1); //第一列数据
for (int i = 1; i <= columnCount; i++) {
System.out.print(metaData.getColumnName(i)+ ":"); // 查询这列的列名
System.out.print("\t" + resultSet.getObject(i)+ "\t\t\t");
}
System.out.println("");
}
//7释放连接
statement.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
PreparedStatement解决sql注入
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?
useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码");
PreparedStatement prepared = conn.prepareStatement("select * from sc where s_no = ?");
prepared.setInt(1,2002);
ResultSet resultSet = prepared.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();//创建对象
int columnCount = metaData.getColumnCount();
while (resultSet.next()){
for (int i = 1; i <= columnCount ; i++) {
System.out.print(resultSet.getObject(i)+"\t");
}
System.out.println("");
}
}
返回主键
public static void main(String[] args){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root", "1214521");
PreparedStatement prepared = connection.prepareStatement("insert stu(name) value (?)",Statement.RETURN_GENERATED_KEYS);
prepared.setString(1,"张飞");
int i1 = prepared.executeUpdate();
System.out.println("受影响的行数"+i1); //返回受影响的行数
ResultSet resultSet = prepared.getGeneratedKeys();
while (resultSet.next()){
System.out.print("新增主键"+resultSet.getObject(1)+"\t");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}