zoukankan      html  css  js  c++  java
  • Java面试题总结之JDBC 和Hibernate

    全文字数: 1202

    阅读时间: 大约4 分钟

    1、100 用户同时来访数据库,要采取什么技术?

    答:采用数据库连接池。

    2、什么是ORM?

    答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象与面向关系数据库存在的互不匹配的现象的技术;简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将java 程序中的对象自动持久化到关系数据库中;本质上就是将数据从一种形式转换到另外一种形式。

    3、Hibernate 有哪5 个核心接口?

    答:Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象;SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存;Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存;Transaction 接口:管理事务;Query 和Criteria 接口:执行数据库的查询。

    4、关于hibernate:

    1)在hibernate 中,在配置文件中一对多,多对多的标签是什么;

    2)Hibernate 的二级缓存是什么;

    3)Hibernate 是如何处理事务的;

    答:1)一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;

    2)sessionFactory 的缓存为hibernate 的二级缓存;

    3)Hibernate 的事务实际上是底层的JDBC Transaction 的封装或者是JTA

    Transaction 的封装;默认情况下使用JDBCTransaction。

    5、Hibernate 的应用(Hibernate 的结构)?

    答://首先获得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();

    6、什么是重量级?什么是轻量级?

    答:轻量级是指它的创建和销毁不需要消耗太多的资源,意味着可以在程序中经常创建和销毁session 的对象;重量级意味不能随意的创建和销毁它的实例,会占用很多的资源。

    7、数据库的连接字符串?

    答:
     // MS SQL Server
    Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”).
    newInstance();
    conn = DriverManager.getConnection(“jdbc: 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(“com.mysql.jdbc.Driver”).newInstance();
    conn = DriverManager.getConnection(“jdbc:mysql
    ://localhost:3306/pubs”,”root”,””);
    处理中文的问题:
    jdbc:mysql://localhost:3306/pubs?useUnicode=true
    &characterEncoding=UTF-8
    

    8、事务处理?

    答:Connection 类中提供了3 个事务处理方法:setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交事务,即为true,通过设置false 禁止自动提交事务;commit():提交事务;rollback():回滚事务。

    9、Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    答:Java 中访问数据库的步骤如下:

    1)注册驱动;

    2)建立连接;

    3)创建Statement;

    4)执行sql 语句;

    5)处理结果集(若sql 语句为查询语句);

    6)关闭连接。

    PreparedStatement 被创建时即指定了SQL 语句,通常用于执行多次结构相同的SQL 语句。

    10、用你熟悉的语言写一个连接ORACLE 数据库的程序,能够完成修改和查询工作。

    答:JDBC 示例程序如下:

    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) {
    }
    }
    }
     

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/yangxianyang/p/13675595.html
Copyright © 2011-2022 走看看