java简单面试题

 

1、#{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

2、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致 

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”> 
    select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; 
</select> 

第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系 

<select id="getOrder" parameterType="int" resultMap="orderresultmap">
    select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”> 
    <!–用id属性来映射主键字段–> 
    <id property=”id” column=”order_id”>
    <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>
    <result property = “orderno” column =”order_no”/>
    <result property=”price” column=”order_price” /> 
</reslutMap>

3、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答:第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。 
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

4、如何获取自动生成的(主)键值?
insert 方法总是返回一个int值 - 这个值代表的是插入的行数。 而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。 示例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”> 
    insert into names (name) values (#{name}) 
</insert> 

name name = new name(); 
name.setname(“fred”); 
int rows = mapper.insertname(name); // 完成后,id已经被设置到对象中 
system.out.println(“rows inserted = ” + rows); 
system.out.println(“generated key value = ” + name.getid());

5、在mapper中如何传递多个参数?
第1种:
//DAO层的函数

Public UserselectUser(String name,String area); 

 //对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">  
    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  
</select>

第2种:使用 @param 注解:

import org.apache.ibatis.annotations.param;
public interface usermapper { 
    user selectuser(@param(“username”) string username, 
    @param(“hashedpassword”) string hashedpassword); 

}

然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper): 

<select id=”selectuser” resulttype=”user”>
    select id, username, hashedpassword from some_table 
    where username = #{username} and hashedpassword = #{hashedpassword} 
</select>

6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。
原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。
7、 一对一、一对多的关联查询 ?

<mapper namespace="com.lcb.mapping.userMapper">  
    <!--association  一对一关联查询 -->  
    <select id="getClass" parameterType="int" resultMap="ClassesResultMap">  
        select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}  
    </select>  
    <resultMap type="com.lcb.user.Classes" id="ClassesResultMap">  
        <!-- 实体类的字段名和数据表的字段名映射 -->  
        <id property="id" column="c_id"/>  
        <result property="name" column="c_name"/>  
        <association property="teacher" javaType="com.lcb.user.Teacher">  
            <id property="id" column="t_id"/>  
            <result property="name" column="t_name"/>  
        </association>  
    </resultMap>  

    <!--collection  一对多关联查询 -->  
    <select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">  
        select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}  
    </select>  
    <resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">  
        <id property="id" column="c_id"/>  
        <result property="name" column="c_name"/>  
        <association property="teacher" javaType="com.lcb.user.Teacher">  
            <id property="id" column="t_id"/>  
            <result property="name" column="t_name"/>  
        </association>  
        <collection property="student" ofType="com.lcb.user.Student">  
            <id property="id" column="s_id"/>  
            <result property="name" column="s_name"/>  
        </collection>  
    </resultMap>  
</mapper> 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是30道不同的Java简单面试: 1. 什么是Java?它与其他编程语言的区别是什么? 2. 什么是变量?Java中有哪些不同类型的变量? 3. 什么是方法?Java中有哪些不同类型的方法? 4. 什么是循环结构?Java中有哪些不同类型的循环结构? 5. 什么是分支结构?Java中有哪些不同类型的分支结构? 6. 什么是数组?Java中有哪些不同类型的数组? 7. 什么是字符串?Java中有哪些不同类型的字符串? 8. 什么是面向对象编程?Java中有哪些不同的面向对象编程特性? 9. 什么是封装?它有什么作用? 10. 什么是继承?它有什么作用? 11. 什么是多态?它有什么作用? 12. 什么是接口?它有什么作用? 13. 什么是抽象类?它有什么作用? 14. 什么是包?Java中有哪些不同类型的包? 15. 什么是访问修饰符?Java中有哪些不同类型的访问修饰符? 16. 什么是构造方法?它有什么作用? 17. 什么是静态方法和静态变量?它们有什么作用? 18. 什么是final关键字?它有什么作用? 19. 什么是异常?Java中有哪些不同类型的异常? 20. 什么是try-catch语句?它有什么作用? 21. 什么是throw关键字?它有什么作用? 22. 什么是finally块?它有什么作用? 23. 什么是Scanner类?它有什么作用? 24. 什么是Random类?它有什么作用? 25. 什么是Math类?它有什么作用? 26. 什么是Date类和Calendar类?它们有什么作用? 27. 什么是集合框架?Java中有哪些不同类型的集合框架? 28. 什么是List接口?它有什么作用? 29. 什么是Set接口?它有什么作用? 30. 什么是Map接口?它有什么作用?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值