JDBC面试核心必考知识点

简介: JDBC核心知识点

JDBC核心知识点

1、什么是JDBC?

JDBC是由SUN公司提出的一组规范,提供了对多种关系型数据库的统一访问。


2、JDBC的组成有哪些?

JDBC由SUN公司提出的一组接口以及各个数据库厂商提供的实现类(驱动jar)组成。


3、JDBC规范的核心API有哪些?


image.png

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.对于程序中涉及到经常改变的字符串,需要将其提取到配置文件中定义。


image.png


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是一个线程绑定对象,主要用于将一个对象绑定到当前线程。


保证通过线程绑定的对象,一个线程中获得的是相同的对象,不同的线程中获得不同的对象。


image.png


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完成的功能,返回数据展示给用户



相关文章
|
3月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
3月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
3月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
37 3
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
32 2
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
84 4
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
122 2

热门文章

最新文章