概念:使用Java语言操作关系型数据库的一套API
全称:( Java DataBase Connectivity ) Java 数据库连接
用处:使用同一套Java代码,操作不同的关系型数据库。SUN公司定义了一套标准接口,各个想支持Java的数据库生产商只要按照此接口提供相应的实现,就可以使用JDBC进行操作。真正执行的代码是驱动jar包中的实现类
好处:各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发;可随时替换底层数据库,访问数据库的Java代码基本不变
Java操作数据库的流程:Java代码将SQL语句发送到MySQL服务端,MySQL服务端接收到并执行该SQL语句,将SQL语句执行的结果返回给Java代码
简单使用:
- 下载jar包。
- 在项目模块下建一个文件夹用来存放驱动jar包(一般取名为lib),并将该jar包Add as Library. 有三个选项:Global Library,全局有效、Project Library : 项目有效、Module Library : 模块有效。看情况选。
- 编写jdbc操作代码
public class demo { public static void main(String[] args) throws Exception { //1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 获取连接 String url = "jdbc:mysql://127.0.0.1:3306/mybatis_study"; String username = "你的mysql用户名"; String password = "你的密码"; Connection conn = DriverManager.getConnection(url, username, password); //3. 定义sql String sql = "根据你的数据库写sql语句"; //4. 获取执行sql的对象 Statement Statement stmt = conn.createStatement(); //5. 执行sql int count = stmt.executeUpdate(sql);//受影响的行数 //6. 处理结果 System.out.println(count); //7. 释放资源 stmt.close(); conn.close(); } }
DriverManager:两个作用,注册驱动、获取数据库连接
- 类中的静态方法registerDriver()用于注册驱动,但上面没有看到。
因为MySQL提供的Driver类中的静态代码块中已经执行了registerDriver()方法进行驱动的注册了,那么我们只需要加载 Driver类,该静态代码块就会执行MySQL 5之后可以省略注册驱动的步骤,自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
- url 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
本机IP:127.0.0.1
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为: jdbc:mysql:///数据库名称?参数键值对。比如useSSL=false参数,禁用安全连接方式,解决警告提示
Connection:获取执行 SQL 的对象、管理数据库事务
- 普通执行SQL对象,上面用的那种、预编译SQL的执行SQL对象,可以防止SQL注入。后面重点讲、执行存储过程的对象,不常用不讲
- MySQL中事务管理的操作:
开启事务 : BEGIN; 或者 START TRANSACTION;
提交事务 : COMMIT; 默认
回滚事务 : ROLLBACK;
Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(false); 即关闭默认的提交
提交事务:commit()
回滚事务:rollback();//使用try…catch来执行逻辑 try { //开启事务 conn.setAutoCommit(false);//5.执行sql int count1 = stmt.executeUpdate(sql1);//受影响的行数//6.处理结果 system.out.println(count1);int i = 3/0; //5.执行sql int count2 = stmt.executeUpdate(sql2);//受影响的行数//6.处理结果 system.out.println(count2); //提交事务 conn.commit(); }catch (Exception throwables) { //回滚事务 conn.rollback(O; throwables.printStackTrace(; }
Statement:对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。ResultSet后面讲
DML增删改数据、DDL增删改库表、DQL查
// 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 执行sql
int count = stmt.executeUpdate(sql);
ResultSet:执行了DQL语句后就会返回该对象,封装了SQL查询语句的结果。然后就需要从 ResultSet 对象中获取我们想要的数据。
ResultSet 对象如下图
方法:boolean next()、xxx getXxx(参数)
一开始光标指定于第一行前,如图红色箭头指向于表头行。调用next()方法后,光标就下移到第一行,并且方法返回true,此时就可以通过getint("id")获取当前行id字段的值,也可以通过getstring("name")获取当前行name字段的值。如果想获取下一行的数据,继续调用next()方法,以此类推。
PreparedStatement:预编译SQL语句并执行,预防SQL注入问题
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
PreparedStatement使用步骤:
原理:将敏感字符进行转义。
PreparedStatement可以开启预编译SQL,效率更高:在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译,执行时就不用再进行这些步骤了。
因为检查SQL和编译SQL花费的时间比执行SQL的时间长。如果检查和编译不需要重复执行,性能就提高了。
如果sql模板一样,则只需要进行一次检查、编译
开启方法:在代码中编写url时需要加上参数:useServerPrepStmts=true。