Java开发技术面试考点--JDBC编程

JDBC编程

❤1、SQL基础

1、写SQL:找出每个城市的最新一条记录。
select city, max(time) from table group by city
2、一个学生表,一个课程成绩表,怎么找出学生课程的最高分数
两个表根据学生id进行连接,然后对学生进行分组,找出每一组成绩最高的学生信息
3、有一组合索引(A,B,C),会出现哪几种查询方式?tag:sql语句
组合索引最左原则,有A,AB,ABC三种组合

❤2、JDBC基础

1、数据库水平切分,垂直切分
Java开发技术面试考点--JDBC编程_第1张图片
2、数据库索引介绍一下。介绍一下什么时候用Innodb什么时候用MyISAM。
选择哪种搜索引擎,应视具体应用而定
①如果是读多写少的项目,可以考虑使用MyISAM,MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。
②如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎
③如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
3、数据库两种引擎
简单介绍区别: 1、MyISAM是非事务安全的,而InnoDB是事务安全的 2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁 3、MyISAM支持全文类型索引,而InnoDB不支持全文索引 4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM 5、MyISAM表保存成文件形式,跨平台使用更加方便
4、索引了解嘛,底层怎么实现的,什么时候会失效
1.where子句的查询条件里有where(column!=XXX),MySQL将无法使用索引;
2.where子句的查询条件中使用了函数,MySQL将无法使用索引;
3.如果条件有or,即使其中有条件带索引也不会使用(这也是为什么建议少使用or的原因),如果想使用or,又想索引有效,只能将or条件中的每个列加上索引;
4.对于多列索引,不是使用的第一部分,则不会使用索引;
5.like查询以%开头;
6.如果列类型是字符串,那一定要在条件中数据使用引号,否则不使用索引;
7.如果MySQL估计使用全表扫描要比索引快,则不使用索引。
5、问了数据库的隔离级别
1.READ UNCIMMITTED(未提交读) 发生脏读
2.READ COMMITTED(提交读) 发生重复读
3.REPEATABLE READ(可重复读) 发生幻读
4.SERIALIZABLE(可串行化) 能够解决所有,但是有点慢
6、数据库乐观锁和悲观锁
乐观锁: 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 可以提高吞吐率
悲观锁: 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。
7、数据库的三范式?
第一范式:每一列不能再拆分原子数据项
第二范式:在第一范式的基础上属性完全依赖于主键
第三范式:要求一个关系中不包含已在其他关系已包含的非主关键字信息
8、讲一下数据库ACID的特性?
1.原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2.一致性(Consistency):在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功完成,那么系统中所有变化将正确应用。如果事务出错,那么系统中的所有变化自动回滚。
3.隔离性(Isolation):在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完成数据空间。数据更新时,数据所处的状态要么是更新前的状态,要么是更新后的状态。
4.持久性(Durability):只要事务成功结束,它对数据库所做的更新就必须永久保存下来
9、mysql主从复制?
主从复制是指 从数据从一个数据库服务器的主节点上复制到其他一个或多个从节点的数据库服务器。MySql数据库默认采用异步复制方式。从节点数据库不用一直访问主服务器也可以实现更新数据。
主从复制 主要用于读写分离。
分为:一主一从,一主多从,多主一从,双主复制,级联复制。
原理:主从复制涉及三个线程:log dump thread ,i/o thread ,SQL thread .
当从节点连接到主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
l 从节点I/O线程
当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
l 从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
10、leftjoin和rightjoin的区别?
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
11、数据库优化方法
1,设计方面,考虑最优字段,尽量设置非空数据,使用数值型数据,字段的宽度设得尽可能小
2,查询方面,尽量使用子查询完成多个逻辑的SQL操作,多使用JOIN,对于临时表,多使用联合查询来解决,这样能够保证数据库整齐性
3,使用事务或锁定表,来保证数据库数据完整性
4,使用索引,索引能够更有效率的查询数据
5,查询时最好不要使用 * 号进行查询概括,在有索引的字段尽量不要使用函数操作,尽量不要使用like进行模糊查询,因为影响系统性能
12、谈一下你对继承映射的理解。
在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反映到数据中,Hibernate为我们提供了3中方案:
第一种方案:一个子类对应一张表。
第二种方案:使用一张表表示所有继承体系下的类的属性的并集。
第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。
13、说出数据连接池的工作机制是什么?
同时创建多个链接,等待使用,使用时候从连接池取出链接,不用创建。使用结束,链接释放回连接池
14、事务的ACID是指什么?
1.原子性:要么都发生,要么都不发生
2.一致性,事务从一个状态改变到另外一个状态举例:银行转账,A增加200块B减少200块
3.隔离性,事物之间互不干扰
4.持久性,数据一旦提交则会保存到硬盘中进行持久化
15、JDBC中如何进行事务处理?
1、创建jdbc连接connection对象,
2、通过调用setAutoCommit(false)可以设置手动提交事务,默认是true自动提交,
3、事物执行完使用commit()提交,
4、如果事物处理过程中发生异常调用rollback()回滚事物,
5、jdbc3.0引入了savepoint保存点,可以设置回滚到指定保存点

❤3、JDBC进阶

1、JDBC的反射,反射都是什么?
反射极大的提升了程序的扩展性,用到反射大多都要使用到xml配置文件,因为通过一定的规范性,也就是说一定的规则才能加载所需要的类,不能想写什么写什么,在jsp的Serverlet中,就需要使用到配置文件进行加载写的继承Serverlet的类,其中覆盖了两个重要的方法,方便了这种模式的运作,在jdbc中也是用到了反射,来通过反射加载类驱动。
2、Jdo是什么?
JDO 是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
3、Statement和PreparedStatement有什么区别?哪个性能更好?
PreparedStatement代码可读性更好,防止SQL注入攻击
PreparedStatement的语句执行一次后,会被缓存(缓存针对整个DB,而不是一个Connection),下次调用相同的预编译语句就不用再次编译
4、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
要提升读取数据的性能,可以通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);要提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。

你可能感兴趣的:(Java开发技术面试考点--JDBC编程)