JDBC
-
概述
- JDBC是Java Data Base Connectivity(java连接数据库)
- JDBC接口的实现类——实现各大数据库厂商的java程序员负责编写sun公司制定的jdbc街口的实现类
- JDBC接口规范解决了java程序员与不同数据库用不同方法的难题
- 连接数据库的驱动,各大数据库厂商白镍车的jdbc接口
-
原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3UuIPmJ-1582712096189)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111144423.png)]
-
核心对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0glmvIV-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111544754.png)]
-
JDBC的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6e9slwN-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225111959761.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILnEccMZ-1582712067731)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225112126154.png)]
-
步骤
1. 导入驱动jar包 1. 复制jar到项目的lib目录下 2. 右键-->add as Library 2. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); 3. 获取数据库连接对象 Connection conn = **DriverManager.getConnection(**"jdbc:mysql://localhost:3306/xinzhi","root","root"); 4. 定义sql String sql = "SELECT gb.gb_name , gb.fk_jt_id , gb.pk_gb_id from gb"; 5. 获取执行sql语句的对象 Statement sta = conn.createStatement(); 6. 执行sql,接收返回结果 rs = sta.executeQuery(sql); 7. 处理结果 8. 释放资源 rs.close(); sta.close(); conn.close();
-
获取连接
默认格式 Connection conn = null; Statement sta = null; ResultSet rs = null; 加载驱动类 Class.forName("com.mysql.jdbc.Driver"); 连接某个数据库 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xinzhi","root","root"); 新建一个SQL对象 sta = conn.createStatement(); SQL的执行语句 String sql = "SELECT gb.gb_name , gb.fk_jt_id , gb.pk_gb_id from gb"; 执行SQL的结果并赋值给rs rs = sta.executeQuery(sql); 循坏全部数据 while (rs.next()){ Gb gb = new Gb(); gb.setPkGbId(rs.getInt("pk_gb_id")); gb.setGbName(rs.getString("gb_name")); gb.setFkJtId(rs.getInt("fk_jt_id")); gbs.add(gb); } 关闭流 try{ /* 先开的后关 */ rs.close(); sta.close(); conn.close(); }catch (SQLException e) { e.printStackTrace(); }
-
详解
-
DriverManager:驱动管理对象
注册驱动:告诉程序该使用哪个驱动包 Class.forName("com.mysql.jdbc.Driver"); 通过查看源码发现:在com.mysql.jdbc.Driver中存在静态代码块 获取数据库连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xinzhi","root","root"); 参数: * url:指定连接的路径、 * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 * 例子:jdbc:mysql://localhost:3306/xinzhi * user:用户名 * password:密码
-
Connection:数据库连接对象
获取sql的对象: * Statement CreateStatement() * PreparedStatement preparedStatement(String sql) 管理事务: * 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为flase,即开启事务 * 提交事务:commit() * 回滚事务:rollback()
-
Statement:执行sql的对象
boolean execute(String sql):可以执行任意的sql 了解 int executeUpdate(String sql):执行DML(inser、update、delete)语句、DDL(create、alter、drop)语句 sta = conn.createStatement(); sta.executeUpdate(sql);
-
ResultSet:结果集对象
* rs.next()方法:游标向下移动一行,判断当前行是否是最后一行(是否有数据)如果是,返回true,不是返回false * rs.getInt(参数):获取数据类型 * getInt()、getString() * 参数: 1. int:整数类型:getInt(1); 2. String:字符串类型:getString("name") * 使用步骤: 1. 游标向下移动一行 2. 判断是否有数据 3. 获取数据 * 练习 *定义一个方法,查询user表的数据将其封装为对象,然后装载集合,返回 1. 定义user类 2. 定义方法 public List<user> findAll(){} 3. 实现方法 select * from user;
-
PreparedStatement:执行sql的对象
-
sql注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接,会造成安全问题
- 输入用户随便,输入密码:a’or’a’='a
- sql:select * from user where username = ‘asdasd’ and userpwd = ‘a’or’a’=‘a’
-
解决sql注入问题:使用PrepareStatement对象来解决
-
预编译的SQL:参数使用占位符
-
步骤:
conn = JDBC_Utils.getConnection(); // 2. 定义SQL String sql = "select * from user where username = ? and userpwd = ?"; // 3. 获取执行sql的对象 pstm = conn.prepareStatement(sql); // 4. 给?赋值 pstm.setString(1,username); pstm.setString(2,userpwd); // 5. 执行sql语句,不需要传递sql rs = pstm.executeQuery(); // 6. 判断 如果有下一行返回true return rs.next(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBC_Utils.close(rs,pstm,conn); }
-
-
-
dao层:
- 为数据交互层,只负责和数据库链接,执行sql,得到结果,返回结果。
-
service层:
- 只负责业务逻辑的处理,业务逻辑为,功能模块的一些数据处理,或者是一些错误的排查判断。
-
抽取JDBC工具类
** 目的:简化书写
** 分析:
-
注册驱动
-
抽取一个方法获取连接对象
配置文件 jdbc.properties url= user= passwprd=
-
抽取一个方法释放资源
-
-
概念
Java DataBase Connectivity Java数据库连接,Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类 * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功,返回值>0执行成功,反之失败 * ResultSet executeQuery(sql):执行sql
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvUuiprU-1582712067732)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200225183020626.png)]
-
dao模式:分层开发
-
JDBC控制事务
-
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
-
操作:
- 开启事务
- 提交事务
- 回滚事务
-
使用Connection对象管理事务
-
开启事务:在执行sql之前开启事务
setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务 conn.setAutoCommit(false);
-
提交事务:操作完毕提交事务
conn.commit();
-
回滚事务:在catch中回滚事务
if (conn != null) { conn.rollback(); }
-
-
-
练习
-
需求
通过键盘录入用户名密码 判断用户是否登录成功
-
-
内容
-
数据连接池
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziCDVNdJ-1582712067733)(C:/Users/nan/AppData/Roaming/Typora/typora-user-images/image-20200226173608419.png)]
概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将对象归还给容器。 好处: 1. 节约资源 2. 用户访问高效 实现: 1. 标准接口:DataSource javax.sql包下的 1. 方法: * 获取连接:getConnection() * 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接 2. 一般不去实现它,由数据库厂商来实现 1. C3P0:数据库连接池技术 2. Druid:数据库连接池实现技术,由阿里巴巴提供的
-
Spring JDBC:JDBC Template
-