Java面试之JDBC & Hibernate

2022-08-04 17:16:45 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

1、数据库,比如100 用户同时来访,要采取什么技术解决?【基础】 答:可采用连接池。 111、什么是ORM?【基础】 答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象与面向关系数据库存在的互不匹配的现象的技术;简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将java 程序中的对象自动持久化到关系数据库中;本质上就是将数据从一种形式转换到另外一种形式。 2、Hibernate 有哪5 个核心接口?【基础】 答: Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象; SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象, sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存; Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存; Transaction 接口:管理事务;Query 和Criteria 接口:执行数据库的查询。 3、关于hibernate: 【基础】 1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么;2)Hibernate 的二级缓存是什么;3)Hibernate 是如何处理事务的; 答:1)一对多的标签为 ;多对多的标签为; 2)sessionFactory 的缓存为hibernate 的二级缓存; 3)Hibernate 的事务实际上是底层的JDBC Transaction 的封装或者是JTA Transaction 的封装;默认情况下使用JDBCTransaction。

代码语言:javascript复制
State
No
State
Name
GD 广东
LN 辽宁
SD 山东
NMG 内蒙古

4、Hibernate 的应用(Hibernate 的结构)?【基础】 答:

代码语言:javascript复制
//首先获得SessionFactory 的对象
SessionFactory sessionFactory = new Configuration().configure().
buildSessionFactory();
//然后获得session 的对象
Session session = sessionFactory.openSession();
//其次获得Transaction 的对象
Transaction tx = session.beginTransaction();
//执行相关的数据库操作:增,删,改,查
session.save(user); //增加, user 是User 类的对象
session.delete(user); //删除
session.update(user); //更新
Query query = session.createQuery(“from User”); //查询
List list = query.list();
//提交事务
tx.commit();
//如果有异常,我们还要作事务的回滚,恢复到操作之前
tx.rollback();
//最后还要关闭session,释放资源
session.close();

5、什么是重量级?什么是轻量级?【基础】 答:轻量级是指它的创建和销毁不需要消耗太多的资源,意味着可以在程序中经常创建和销毁session 的对象;重量级意味不能随意的创建和销毁它的实例,会占用很多的资源。 6、数据库的连接字符串?【基础】 答:

代码语言:javascript复制
MS SQL Server
//第二种连接方式
Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).
newInstance();
conn = DriverManager.getConnection(“jdbc:Microsoft:sqlserver
://localhost:1433;DatabaseName=pubs”,”sa”,””);
//Oracle
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
conn = DriverManager.getConnection(“jdbc:oracle:thin:
@localhost:1521:sid”, uid, pwd);
//Mysql
Class.forName(“org.git.mm.mysql.Driver”).newInstance();
conn = DriverManager.getConnection(“jdbc:mysql
://localhost:3306/pubs”,”root”,””);
处理中文的问题:
jdbc:mysql://localhost:3306/pubs?useUnicode=true
&characterEncoding=GB2312

7、事务处理?【基础】 答:Connection 类中提供了3 个事务处理方法:setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交事务,即为true,通过设置false 禁止自动提交事务;commit():提交事务;rollback():回滚事务。 8、Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? 【基础】 答:Java 中访问数据库的步骤如下: 1)注册驱动; 2)建立连接; 3)创建Statement; 4)执行sql 语句; 5)处理结果集(若sql 语句为查询语句); 6)关闭连接。 PreparedStatement 被创建时即指定了SQL 语句,通常用于执行多次结构相同的SQL 语句。 9、用你熟悉的语言写一个连接ORACLE 数据库的程序,能够完成修改和查询工作。【基础】 答:JDBC 示例程序如下:

代码语言:javascript复制
public void testJdbc(){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//step1:注册驱动;
Class.forName("oracle.jdbc.driver.OracleDriver");
//step 2:获取数据库连接;
con=DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.39:1521:TARENADB",
"sd0605","sd0605");
/************************查询************************/
//step 3:创建Statement;
String sql = "SELECT id, fname, lname, age, FROM
Person_Tbl";
ps = con.prepareStatement(sql);
//step 4 :执行查询语句,获取结果集;
rs = ps.executeQuery();
//step 5:处理结果集—输出结果集中保存的查询结果;
while (rs.next()){
System.out.print("id = "   rs.getLong("id"));
System.out.print(" , fname = "  
第35 页共59 页
rs.getString("fname"));
System.out.print(" , lname = "  
rs.getString("lname"));
System.out.print(" , age = "   rs.getInt("age"));
}
/************************JDBC 修改*********************/
sql = "UPDATE Person_Tbl SET age=23 WHERE id = ?";
ps = con.prepareStatement(sql);
ps.setLong(1, 88);
int rows = ps.executeUpdate();
System.out.println(rows   " rows affected.");
} catch (Exception e){
e.printStackTrace();
} finally{
try{
con.close(); //关闭数据库连接,以释放资源。
} catch (Exception e1) {
}
}
}

10、JDBC,Hibernate 分页怎样实现?【中等难度】 答:方法分别为:

  1. Hibernate 的分页:
代码语言:javascript复制
    Query query = session.createQuery("from Student");
    query.setFirstResult(firstResult);//设置每页开始的记录号
    query.setMaxResults(resultNumber);//设置每页显示的记录数
    Collection students = query.list();
  1. JDBC 的分页:根据不同的数据库采用不同的sql 分页语句 例如: Oracle 中的sql 语句为: “SELECT * FROM (SELECT a.*, rownum r FROM TB_STUDENT) WHERE r between 2 and 10” 查询从记录号2 到记录号10 之间的所有记录 11、在ORACLE 大数据量下的分页解决方法。一般用截取ID 方法,还有是三层嵌套方法。【中等难度】 答:一种分页方法
代码语言:javascript复制
    <%
    int i=1;
    int numPages=14;
    String pages = request.getParameter("page") ;
    int currentPage = 1;
    currentPage = (pages==null)?(1):{ 
   Integer.parseInt(pages)}
    sql = "select count(*) from tables";
    ResultSet rs = DBLink.executeQuery(sql) ;
    while(rs.next()) i = rs.getInt(1) ;
    int intPageCount=1;
    intPageCount=(i%numPages==0)?(i/numPages):(i/numPages 1);
    int nextPage ;
    int upPage;
    nextPage = currentPage 1;
    if (nextPage>=intPageCount) nextPage=intPageCount;
    upPage = currentPage-1;
    if (upPage<=1) upPage=1;
    rs.close();
    sql="select * from tables";
    rs=DBLink.executeQuery(sql);
    i=0;
    while((i<numPages*(currentPage-1))&&rs.next()){ 
   i  ;}
    %>
    //输出内容
    //输出翻页连接
    合计:<%=currentPage%>/<%=intPageCount%>页
    <a href="List.jsp?page=1">第一页</a>
    <a href="List.jsp?page=<%=upPage%>">上一页</a>
    <%
    for(int j=1;j<=intPageCount;j  ){ 
   
    if(currentPage!=j){ 
   
    %>
    <a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
    <%
    }else{ 
   
    out.println(j);
    }
    }
    %>
    <a href="List.jsp?page=<%=nextPage%>">下一页</a>
    <a href="List.jsp?page=<%=intPageCount%>">最后页</a>

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106574.html原文链接:https://javaforall.cn

0 人点赞