JDBC、Mybatis、Hibernate持久层框架常见面试题

本文详细对比了JDBC、Hibernate和Mybatis三种Java持久层技术的特点,介绍了Mybatis中自动生成主键的方法、#与$的区别、动态SQL标签等核心概念,并探讨了一对一和一对多关联查询的实现。
摘要由CSDN通过智能技术生成

1.JDBC/Hibernate/Mybatis 的区别?
1).JDBC:全手动 手动创建连接 手动书写sql语句 手动执行sql语句 手动返回结果 
2).Hibernate: 全自动 自动创建链接 自动书写sql语句 自动执行sql语句 自动返回结果
3).Mybatis:半自动 自动创建连接 手动书写sql语句 自动执行sql语句 自动返回结果 
2.在mybatis中,如何返回自动生成的主键?
在实体类与表结构的映射关系xml文件中,通过<selectKey>元素查询返回
1).mysql:
a.主键为int类型,int auto_increment
<insert>
<selectKey keyProperty='id' resultType='int'>
select @@last_insert_id as id
</selectKey>
</insert>
b.主键为varchar类型,
<insert>
<selectKey keyProperty='id' resultType='string' oreder="BEFORE">
select replace(uuid(),'-','') as id
</selectKey>
</insert>
2).oracle:
a.主键为number类型
<insert>
<selectKey keyProperty='id' resultType='int' order="BEFORE">
select XX_seq.nextVal from dual
</selectKey>
</insert>
b.主键为varchar类型,
<insert>
<selectKey keyProperty='id' resultType='string' order="BEFORE">
select sys_guid as id
</selectKey>
</insert>
3.在mybatis中,#和$的区别?
a.#相当于preparedStatement 可以设置占位符?,传入参数的时候可以自动根据数据类型添加""
 $相当于Statement 不支持占位符?,参数通过拼接的形式进行添加
b.能使用#,就不使用$
c.like/truncate table XXX/select * from XXX/  必须使用$
4.在mybatis中,动态查询标签有哪些?
<if><where><foreach><choose><sql><include>
5.Mybatis中一对一和一对多的关联查询是如何实现的?
1).手动查询
2).association 一对一情况 和 collection一对多情况
6.Struts中在Action中如何向返回客户端JSON数据?
两种方式
1).从Action中获得response,直接写回到客户端
2).使用struts-json-plugin插件,并提供getter方法


7.请说明文件上传的原理,以及在Servlet、和Struts中分别是如何处理文件上传的?
在前端表单提交中设置上传方法post,字节流上传enctype="multipart/form-data",一般使用第三方组件对前端的上传请求进行解析处理,
在服务器端构造输入流,读取文件名字、内容,构造输出流写入到服务器
a)、在servlet中,
前端页面:<form method="post" enctype="multipart/form-data"></form>
服务器端:HttpServletRequest.getInputStream
第三方组件:SmartUpload接管解析request获得其中的文件和普通参数
我们:构造第三方的组件,从中获得文件和参数
b)、在struts中,
前端页面:<form method="post" enctype="multipart/form-data"></form>
服务器端:HttpServletRequest.getInputStream
第三方组件:Commons-FileUpload接管解析request获得其中的文件和普通参数
我们:像使用普通表单一样,处理文件的上传操作


8.反射的作用?
通过反射,
a、我们可以在运行期动态获得类中属性和方法
b、我们可以在运行期动态获得的执行类的方法
c、我们可以在运行期动态获得构造类的对象
d、我们可以在运行期动态的判断对象类型
9.通过反射获得如下方法:并且如何让A类中的show方法执行
public class A{
public String show(String name){
System.out.println(name);
}
}
获得show方法的核心代码如下:
Class cls = A.class;
Method m = cls.getDeclaredMethod("show",String.class); //获得方法
String mName = m.getName(); //获得方法名
String mMod = Modifier.toString(m.getModifiers()); //获得修饰符
String mReturn = m.getReturnType().getName(); //获得返回类型的名字
System.out.pritn(mMod+"\t"+mReturn+"\t"+mName+"(");
Class[] cs = m.getParameterTypes(); //获得方法参数类型
for(Class c:cs){
System.out.print(c;
}
让A类中的方法执行,
A a = new A();  
Method m = cls.getDeclaredMethod("show",String.class); //获得方法
String mName = m.getName();
m.invoke(a,"name");
10.Struts的Action和Servlet的区别?
a、Servlet单实例的,Action是多实例的【每次请求都会创建Action】
b、Servlet必须实现Servlet接口,Action只是普通类
c、Servlet必须和容器耦合(request,response),Action不需要


11.过滤器Filter和Servlet的区别?
a、Filter是容器启动时构造对象并且初始化的,而Servlet是请求到达时才构造对象并且初始化的
b、从客户端发送的请求先进Filter再进Servlet
12.oracle的分页和mysql的分页分别如何实现?
mysql:limit start,pageSize
oracle:使用伪列rownum进行分页 以emp为例:
select * from (select rownum rn,a* from (select ename,empno,sal from emp order by sal)a where rownum<=5) where rn>=2  
13.http://210.11.145.137:8080/prodemo/index.jsp?username=etoak&pwd=111,
1 2   3 4 5
该URL对应的5部分可以通过HttpServletRequest中的那些方法一一获得?
1.getProtocol() 2.getRemoteAddr() 3.getServletPort 4.getContextPath() 
5.getParameterNames()
14.自定义注解Etoak,并且设置属性value,默认值是“et123”,注解适用于方法上,保留到运行前?
@Rentension(RentensionPolicy.CLASS) 
public @interface Etoak(){
String value() default "et123";
}
15.Hibernate常用的注解有哪些?
类级别:@Entity映射实体类 @Table映射数据库表
属性级别:@Id映射生成主键   @Column映射表的列   @GeratedValue定义主键生成策略
16.Hibernate支持的查询方式有哪些?
OID HQL QBC SQL
17.Hibernate如何限定只查询第50-100条记录?
query.setFirstResult(49)
query.setMaxResults(50)
18.已知母鸡3元一只,公鸡5元一只,小鸡1元三只,现有100元钱需要买100只鸡,【钱不能多页不能少,鸡不能多也不能少】请问有多少种买法?(请用java程序去实现)
x+y+z=100;   3x+5y+z/3=100;
public class TestXJ{
public static void main(String args[]){
int count=0;
for(int z = 0;z<=99;z+=3){
for(int x=0;x<=99;x++){
if((3*x+5*(100-x-z)+z/3==100)&&z%3==0&&100-x-z>0){
System.out.println("x="+x+"\ty="+(100-x-z)+"\tz="+z);
count++;
}
}
}
System.out.println(count);
}
}
19.如果有一个实体类,叫User,则它对应Hibernate的映射文件应该叫?其中的根元素是?
User.hbm.xml 根元素叫hibernate-mapping
20.请写出唯一的一个结果Student(name,age,gender)实体的hql语句,要求学生的名字以'王'开头 年龄在20-30岁 性别是男。
如果需要唯一的一个结果,则应该调用什么方法?
如果结果不是唯一,而是一组结果 应该调用什么方法?返回的是什么?
String hql1="select stu from Student stu where stu.name startWith('王') and stu.age between 20 and 30 and stu.gender='男'"
Query query = session.createQuery(hql1);
Student stu = query.uniqueResult(); //返回一个结果
List<Student> list = query.list();//返回一组结果,是一个List<Stduent>


21.写出你所了解的获得ServletContext的方式?
ServletConfig.      
FilterConfig.  
HttpSession.
ServletContextEvent.

ServletActionContext.
HttpServletRequest.
22.请问什么样的数据放在application范围?

23.手动实现一段ajax发送请求的代码,请求名字:/xxmanager/stu,请求类型是post,请求参数:

24.$("#button")、$(":button")、$(".button")、$("input [type=button]")分别表示什么意思?
以上均为jquery的选择器,
第一个表示选择元素id为button的元素,第二个表示选择所有type为button按钮的元素,
第三个表示选择class为button的元素,第四个表示选择input元素里type类型为button的元素
25.Struts默认的请求的后缀是什么?如何修改struts默认的请求后缀?
action,或者没有后缀; 在struts.xml文件中,
<constant name="struts.action.extension" value="action,xiucai,etoak,,"></constant>
26.你平常用的jar包都从哪获得的?你平常都浏览哪些技术网站?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值