🙎🏻个人账户
程序员小王个人博客:https://www.wolai.com/ahNwvAUPG2Hb1Sy7Z8waaF
程序员小王Gitee: https://gitee.com/wanghengjie563135
程序员小王java : https://blog.csdn.net/weixin_44385486
gitHub: https://github.com/wanghengjie563135
1、什么是JDBC?
JDBC是由SUN公司提出的一组规范,提供了对多种关系型数据库的统一访问。
2、JDBC的组成有哪些?
JDBC由SUN公司提出的一组接口以及各个数据库厂商提供的实现类(驱动jar)组成。
3、JDBC规范的核心API有哪些?
4、JDBC核心步骤如何实现? 1.加载驱动。
Class.forName(com.mysql.cj.jdbc.Driver);
2.创建数据库连接对象Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc/数据库?useUnicode=true&characterEncoding=UTF-8 & useSSL=false & serverTimezone=Asia/Shanghai",username="root",password="root)";
3.创建Statement对象
String sql="insert into user values(username=?,password=?) "; PreparedStatement pstm=conn.Preparstatement(sql);
4.执行Sql
pstm.setUsername(1,"王恒杰"); pstm.setPassword(2,"123456"); pstm.executeUpdate();
5.处理结果集
ResultSet rs=pstm.executeQuery(); 如果是查询 while(rs.next){ String username=rs.getString("username"); String password=rs.getString("password"); }
6.释放资源
rs.close(); pstm.close(); conn.close();
5、PreparedStatement对象如何使用?
1.创建: PreparedStatement pstm = conn.prepareStatement(sql);
2.给Sql命令中的占位符赋值: pstm.setXXX(index,value);
3.执行Sql:
3.1 执行查询语句:pstm.executeQuery();
3.2 执行增删改语句:pstm.executeUpdate();
6、Statement与PreparedStatement区别是什么?
1.父子关系:Statement是PreparedStatement的父接口。
2.执行Sql上的区别:
2.1 Statement执行Sql存在Sql注入的风险。
2.2 PreparedStatement可以执行参数化Sql,有效的避免了Sql注入的风险。
7、结果集ResultSet如何处理?
while循环 rs.next() boolean类型的返回值,判断下一行数据是否存在
如果存在返回true,返回这一行数据并且指针下移一位。如果只有一行数据 可以使用if条件判断。
获取数据具体内容 rs.getXXX();
8、为什么封装JDBC工具类?
1.对于程序中可以独立完成功能的代码,并会有超过两次使用的时候,需要对其进行封装。
2.对于程序中涉及到经常改变的字符串,需要将其提取到配置文件中定义。
package com.tjcu.JDBCUtils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * @author 王恒杰 * @version 1.0 * @date 2021/9/8 20:43 * @email 1078993387@qq.com * @Address 天津 * @Description: JDBCUtils(性能优化版) */ public class JdbcUtils3 { //静态属性,便于其他静态方法使用 // 创建Properties对象,用于加载配置文件 private static Properties p = new Properties(); //静态代码块 static { //获取字节流,用该方法获取的字节流,默认路径为JDBCUtils所在位置 InputStream is = JdbcUtils3.class.getResourceAsStream("com/tjcu/config/jdbc.properties"); //加载配置文件,处理异常 try { p.load(is); } catch (IOException e) { e.printStackTrace(); } } public static Connection getConnection() { Connection conn = null; try { // 加载驱动 Class.forName(p.getProperty("driverClassName")); conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password")); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void close(Connection conn, PreparedStatement pstm) { if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (pstm != null) { try { pstm.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
9、什么是ORM封装?
1.ORM-Object Relational Mapping ,称为对象关系映射;简单的说,ORM相当于中继数据,是将数据库表中查询出的数据封装成JAVA对象,便于后续的处理操作。
10、如何封装实体类?
1.数据库中一张表对应Java中一个实体类
2.实体类需要实现序列化接口
3.实体类的属性与表的字段(列)相对应
4.提供对应属性公开的getter/setter方法
5.提供有参构造方法和无参构造方法
11、什么是DAO?
DAO层称为数据访问对象,主要封装针对于数据库表的CRUD操作。
12、DAO层开发步骤有哪些?
1.创建表
2.封装实体类
3.定义DAO接口
4.编写DAO实现类
13、什么是Service?
Service层也称为业务层,用于封装业务功能操作。
14、什么是事务控制?
事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
1.JDBC中默认事务是一条Sql语句自成一个事务,即一条Sql语句执行完毕会自动提交事务;无法保证业务功能的完整。
需要程序员手动控制事务:
1.1 设置手动控制事务: conn.setAutoCommit(false);
1.2 手动提交事务:conn.rollback();
1.3 手动回滚事务:conn.rollback();
15、ThreadLocal有什么作用?
ThreadLocal是一个线程绑定对象,主要用于将一个对象绑定到当前线程。
保证通过线程绑定的对象,一个线程中获得的是相同的对象,不同的线程中获得不同的对象。
package com.tjcu.utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * @author 王恒杰 * @version 1.0 * @date 2021/9/11 12:38 * @email 1078993387@qq.com * @Address 天津 * @Description: */ public class JdbcUtils { // 静态的Properties集合,相当于属性 private static Properties p = new Properties(); // 静态的ThreadLocal输性 线程绑定对象 private static final ThreadLocal<Connection> t = new ThreadLocal(); static { InputStream is = JdbcUtils.class.getResourceAsStream("/com/tjcu/config/jdbc.properties"); try { p.load(is); } catch (IOException e) { e.printStackTrace(); } } public static Connection getConnection() { //从ThreadLocal中获取Connection Connection conn = t.get(); try { if (conn == null) { Class.forName(p.getProperty("driver")); conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password")); t.set(conn); } } catch (Exception e) { e.printStackTrace(); } return t.get(); } public static void close(ResultSet rs, PreparedStatement pstm, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (pstm != null) { try { pstm.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); t.remove(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } public static void close(ResultSet rs, PreparedStatement pstm) { if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (pstm != null) { try { pstm.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } public static void close(PreparedStatement pstm, Connection conn) { if (pstm != null) { try { pstm.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象 t.remove(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } //关闭资源 用于关闭连接 public static void close(Connection conn) { if (conn != null) { try { conn.close(); //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象 t.remove(); } catch (Exception e) { } } } }
16、三层架构
1.三层架构是一种编程思想,在逻辑上将应用程序划分为三层,本着各司其职的思想划分。
2.三层架构包含哪几层
2.1 DAO层 : 数据模型层
- 主要负责与数据库交互,完成CRUD操作
- 接收Service层传递的数据
2.2 Service(BIZ)层: 业务逻辑层
- 主要完成业务功能操作
- 会一到多次调用DAO层
- 需要做事务控制
- 接收视图层传递的数据,并做相应的运算处理
2.3 View层 : 视图层 (表显层)
- 主要与用户进行交互
- 接收用户的信息
- 将Service完成的功能,返回数据展示给用户