Java中对数据库的操作要使用的接口【对于数据库的操作支持Java只提供了接口】全部都在java.sql 包中
操作步骤
一:获取连接
Interface Connection:
是与数据库之间的通道
获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1?serverTimezone=GMT%2B8","*","**");
获取连接: 传入的参数 数据库的URL 数据库用户名和密码
这也是数据库的驱动程序
java语言提供了一组接口,没有提供实现类,这些实现类由各个数据库厂商提供实现,这些实现类就是驱动程序。有了数据库驱动程序,高级语言才有对相应数据库操作的支持,即数据库驱动程序负责将高级语言对数据库的操作解释为对数据库的相应操作,将数据库的返回结果映射给高级语言
高级语言对数据库的操作---------------------------数据库驱动程序-------------------------------------数据库
二:编写sql 语句
String sql = "select * from emp";
定义为字符串
三,执行语句
Interface PreparedStatement:语句执行者
表示预编译的SQL语句的对象。 SQL语句已预编译并存储在PreparedStatement对象中。 然后可以使用该对象多次有效地执行此语句。
作用:
1. 执行不同的语句:使用不同的方法
2. 设置在sql 语句中需要存入数据库的数据(语句不存入数据,就没有参数设置)
获取对象:通过连接对象
PreparedStatement st = conn.prepareStatement(sql); sql 表示sql 语句
将sql 语句封装成对象
通过PrepareStatment 的不同方法执行不同的sql 语句
不同方法
1. ResultSet executeQuery(){}
查询的sql 语句,并返回查询 PreparedStatement的 ResultSet对象。
2. int executeUpdate(){}
执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT , UPDATE或DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。 返回值:SQL数据操作语言(DML)语句的行计数或(2)0不返回的SQL语句
3.default long executeLargeUpdate()**
执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT , UPDATE或DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。
设置参数:
调用语句执行者的方法
Interface ResultSet:
结果集封装
结果是什么取决于你的数据,取决于你使用执行者方法时,方法返回的是什么
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
String getString(String columnLabel)
这个检索的当前行中指定列的值 ResultSet对象为 String的Java编程语言。
传入的参数是列名,这个列存储的数据应该是字符串型
jdbc -api 详解:
所有的包都是java.sql 或者是 javax.sql 所以导包很重要
Class DriverManager:
用于管理一组JDBC驱动程序的基本服务
常用方法:
1.注册驱动(了解):
DriverManager.registerDriver(Driver driver) 但是为什么在注册驱动时我们没有用这种方式?
2.获取连接:
public static Connection getConnection(String url ,String user, String password)
Connection conn = DriverManager.getConnection(url,user,password); 字符串参数
数据库的url: 协议:数据库类型:// 参数
jdbc:mysql://localhost:接口/数据库名称 不同的数据库的写法是不一样的,如果使用的是orecla 那参数的写法就不是这样的
数据库的用户名;
数据库的密码;
Driver: 驱动(接口)
每个驱动程序类必须实现的接口(驱动程序就要实现驱动-接口)。
为什么注册驱动时没有使用DriverManager.registerDriver(new Driver())
//能使用new Driver() 表名这个Driver 是接口的实现子类
查看API Driver 类的源码,在类中有一个静态代码块:
在源码中也有:DriverManager.registerDriver(Driver driver)这一句代码,这样驱动就被注册了两次。静态代码块只有在类加载的时候执行一次,并且只执行一次。
所以要正确的注册驱动,将类加载进内存就可以了。
类加载进内存:
- Class.forName(“类的全限定名”) “com.mysql.cj.jdbc.Driver”包名+类名
- 类名.class
- 对象.getClass();
Connection :
接口 驱动,和特定数据库的连接
常用方法:
1.获取语句执行者
//获取普通语句执行者
Statement createStatement() //会出现sql注入的问题(了解就好)
创建一个 Statement对象,用于将SQL语句发送到数据库。
//获取预编译语句执行者
PreparedStatement prepareStatement(String sql) //**使用**
创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
2.了解(关于事务)
set AutoCommit(false):手动开启事务
Commit():提交事务
rollback():事务回滚
事务:就是一件完整的事务,要么全部成功要么全部失败
/
Statement: 接口 语句执行者
在获取语句对象的时候我们没有使用Statement 而是使用了 PreparedStatement。原因是:前者会有sql注入的问题。同时PreparedStatement 继承了Statement
PreparedStatement
: 预编译语句执行者, 接口
会先将sql语句进行编译,这样就能防止sql 语句注入
常用方法:
1.设置参数:setxxx(int 语句中的第几个参数, Object 实际参数)
xxxx: 包含所有的基本数据类型,和Object,根据你所要传入的参数的类型
2.执行sql 语句:curd
//1. int executeLargeUpdate() //返回值是:执行完sql 所影响的行数
执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT
//2. ResultSet executeQuery() //返回的是结果集
执行此 PreparedStatement对象中的SQL**查询**,并返回查询 PreparedStatement的 ResultSet对象。
ResultSet
:结果集,接口
执行查询语句之后返回的结果
常用方法:
1.boolean next() :判断是否有下一条记录,若有则返回true 并且将光标移动到下一行,若没有则返回false
注意: 光标一开始处于第一条记录的上面(光标的移动,判断和迭代器相似)
2.获取光标所指的一行的具体数据:
1.getxxx(int|String )
若参数为:int :第几列
若参数为: String:列名(字段名)
例如:获取name 的内容
getString(“name”) 或者是 getString(2)
常用的方法:
getInt(): 获取数字
getString() : 获取字符串,其实可以获取任何的数据,因为在数据库中所有的数 据都是存储为字符串(除了数字,都加了引号)
getObject : 也是可以获取任意值的