文章目录
JDBC
1.什么是jdbc?
1.1jdbc是什么
JDBC :java database connection
讲到什么是jdbc,我们就要追的根溯源到jdbc的应用场景
应用场景:在客户端和服务器通信的过程中
1.而客户端与服务器的通信本质上就行基于tcp/ip协议的连接,但是如果我们基于tcp/ip去编程就会显得很麻烦和繁琐。
而java就是把基于底层的tcp/ip封装起来,形成了一个新的协议这个协议就叫做jdbc,如果我们要写通信,就可以用jdbc封装好的功能,而不用去管用tcp了
2.有类和接口组成的一个API
本质上是有个底层封装了tcp/ip协议的javaAPI,由类和接口组成。
1.2 jdbc核心原理
那问题来了,jdbc是针对java语言和服务器来的,服务器可以简单理解为数据库
数据库有很多,比如Oracle、mysql、SQL serber…等,每个数据库的底层实现肯定不同,怎么样只用一个jdbc就能连接大多数数据库呢?
sun公司想编写一套jdk,能连接所有数据库------>但数据库众多,不可能更新到连接所有数据库;甚至很多数据库不开源,无法编写jdbc
那么,sun公司只提供一套接口,而具体实现是由不同数据库厂家自己提供的(java语言使用人数众多,可以做到让数据库厂商来对接它)
-------->而这个根据这一套接口土体实现的API,就叫做数据库驱动
这样只写一个jdbc接口,然后由底下分层实现,就达到了只关注最上层就能实现连接所有数据库的功能,有效的避免了差异化。(分层概念:具体实现下层完成,具体应用只用关注上层的思想)
1.3JDBC核心接口
jdbc有3个核心接口和一个类3
工厂到厂库的过程中
1.首先需要修路
2.需要有车子运送物资
3.从仓库拿到原材料
三个接口:
1.Connection:连接对象
形象的可以理解为道路
2.Statement:发送sql,通知数据库执行
可以理解为运送的车子
3.ResultSet:对应查询的结果集
可以理解为原材料,后续需要进行加工解析
一个类:
DriverManger:驱动管理器,管理项目
用于加载驱动,让用户知道是哪个驱动,并且可以用它与服务器建立Connection对象,即连接通路对象
2.搭建环境
3.1导入第三方jar包
使用idea导入第三方jar包,=
在idea中导入mysql的驱动jar: mysql-connector-java-5.1.47.jar
3.1.1创建lib目录
3.1.2.将驱动即jar包复制到lib文件下
(驱动需要单独去下载复制进lib目录下)
3.1.3将lib添加到项目中,作为第三方的库
3.jdbc入门程序
3.1 加载驱动类
Class.forName("com.mysql.jdbc.Connection");
加载mysqljdbc驱动
3.2. 获取链接Connection
Connection conn = DriverManager.getConnection(url,username,password)
通过驱动管理器创建连接对象;
url:访问数据库服务网址
username:用户名password:密码
3.3. 编写sql
String sql = "SELECT * FROM emp";
3.4. 创建Statment对象
smt = conn.createStatement();
由Connection连接对象创建Statment对象,用来发送sql语句,像车子
3.5. 发送sql,通知数据库执行,接收结果
//Statement对象有两个方法
int executeUpdate(sql) //执行增删该sql,返回受影响行数
ResultSet executeQuery(sql) //执行查询的sql 返回查询结果集
int executeUpdate(sql)
当们的sql语句是增、删、该操作是就是executeUpdate(sql),返回的是一个int类型的数据,表示的是此次受影响的行数,成功以后不需要解析
ResultSet executeQuery(sql)
当sql语句是查询语句的时候,就会返回一个ResultSet对象,表示一个结果集,就需要在第6部去把结果集解析出来
3.6 如果是查询,结果是ResultSet,解析ResultSet
ResultSet rs = smt.executeQuery(sql);
rs.next();
int i=1;
//循环,当rs.next()值为false就代表下一行没有值,遍历了整个行了
while(rs.next()){
System.out.println(rs.getInt(1)+"\t"+rs.getString(2).......);
}
ResultSet表示结果集对象
在ResulSet结果集里面可以想象是有一个指针指向当前行的,然后在根据当前的行去获取具体的字段信息
有一个next()方法为行指针,判断是否有下一行并把指针移到下一行,这样就实现了行遍历
获取对应行的每一列的值
Xxx getXxx(int i),根据索引获取列值
int getInt(1)
long getLong(2)
Xxx getXxx(String name )根据列名获取列值,这种方式可读性高
3.7.都是资源要关闭
//一定要注意,倒叙关(先开后关):Connection conn,Statment smt,ResultSet res
//要抛异常,全选然后快捷键ctrl+Alt+t+6
try {
if(res !=null) res.close();
if( smt !=null) smt.close();
if(conn != null) conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
完整代码示例:
public class Demo2 {
public static void main(String[] args) {
Connection conn = null;
Statement state = null;
ResultSet resultSet = null;
try {
//1、获取驱动
Class.forName("com.mysql.jdbc.Driver");
//2、建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "123456");
//3、创建Statement对象,像一个车一样用来运输sql语句到mysql服务器
state = conn.createStatement();
//4.编写sql语句
String sql = "SELECT * FROM emp";
//5.将sql语句运送到服务器,并接收服务器返回过来的值或数据集
resultSet = state.executeQuery(sql);
//6.读取返回的ResultSet类型的数据集
while (resultSet.next()){
System.out.println(resultSet.getInt("empno")+"\t\t"+resultSet.getString("ename")+"\t\t"+resultSet.getString("job")+"\t\t"+resultSet.getInt("mgr")+"\t\t"+resultSet.getDate("hiredate")+"\t\t"+resultSet.getDouble("sal")+"\t\t"+resultSet.getDouble("comm")+"\t\t"+resultSet.getInt("deptno"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//7、关闭流,先用后关
try {
resultSet.close();
state.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
4.JDBC核心API(未完成)
4.4创建Statement对象(车对象)
Statement:
sql语句只能拼接,
- 容易出错
- 可读性差
dbc有3个核心接口和一个类3
Connection:连接对象
- 创建Stament对象
- 创建PreparedStatement:执行sql
- 创建CallableStatement:执行数据库的存储过程
- 关于事物相关的方法
Statement:发送sql,通知数据库执行
两个子接口
- PreparedStatemaent:不需要拼接sql,以后使用它
- CallableStatement:调用存储过程
方法
int executeUpdate(sql) ,执行增删改sql
ResultSet executeQuery(sql) ,执行查询sql
boolean excute(sql) ,可执行增删改查
返回值表示是否有结果集
true,有:获取结果集
ResultSet getResultSet()
false,没有
int
getUpdateCount()
- 批处理相关的方法
ResultSet:对应查询的结果集