1.#{}和${}的区别是什么?
#{} 使用预编译 ,防止sql注入
${} 通过字符串替换, 一般用于参数是表名、列名时
2.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
① sql中给字段设置别名
②通过中设置别名
3.如何获取自动生成的(主)键值?
插入后标签返回 LAST_INSERT_ID
4 在mapper中如何传递多个参数?
①通过#{0}, #{1} 或者 @Params作为占位符
②通过map集合作为参数
5.动态sql是什么?有哪些动态sql?动态sql的原理?
①动态sql就是可以在xml配置文件中使用动态sql标签来实现逻辑判断和动态拼装sql
②
foreach
<select id="queryDataByIds" resultType="com.wang.test.demo.entity.User">
select * from user where id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
if
<select id="queryDataBySearch" resultType="com.wang.test.demo.entity.User">
select * from user
where stage = 'A'
<if test="age != null and age != ''">
and age =#{age}
</if>
<if test="name != null and name != ''">
and name =#{name}
</if>
</select>
where
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu WHERE
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
AND class = #{class}
</if>
</select>
choose、when、otherwise
<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu WHERE age = #{age}
<choose>
<when test="name != null">
AND name like #{name}
</when>
<when test="class != null">
AND class like #{class}
</when>
<otherwise>
AND class = 1
</otherwise>
</choose>
</select>
set
用于解决动态更新语句存在的符号问题
<update id="updateStu">
Update tab_stu
<set>
<if test="name != null"> name=#{name},</if>
<if test="age != null"> age=#{age},</if>
<if test="class != null"> class=#{class},</if>
<if test="subject != null"> subject=#{subject}</if>
</set>
</update>
trim:
trim标签可实现where/set标签的功能;
Trim标签有4个属性,分别为prefix、suffix、prefixOverrides、suffixOverrides
prefix:表示在trim标签包裹的SQL前添加指定内容,在trim标签内sql语句加上前缀
suffix:表示在trim标签包裹的SQL末尾添加指定内容,在trim标签内sql语句加上后缀
prefixOverrides:指定去除多余的前缀内容,如:prefixOverrides=“AND”,去除trim标签内sql语句多余的前缀"AND"。
suffixOverrides:指定去除多余的后缀内容,suffixOverrides=“OR”,去除trim标签内sql语句多余的前缀"OR"
<update id="updateById" parameterType="com.wang.test.demo.entity.User">
update user
<set>
<trim suffixOverrides=",">
<if test="name != null and age != ''">
name=#{name},
</if>
<if test="age != null and name != ''">
age=#{age},
</if>
</trim>
</set>
where id=#{id}
</update>
<update id="updateById1" parameterType="com.wang.test.demo.entity.User">
update user
<trim suffixOverrides="," prefix="set">
<if test="name != null and age != ''">
name=#{name},
</if>
<if test="age != null and name != ''">
age=#{age},
</if>
</trim>
where id=#{id}
</update>
6. Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
可以重复,只要namespace指定了不同的mapper
7 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
使用查询关联对象或者关联集合对象时,
Hibernate作为全自动ORM映射工具可以根据对象关系模型直接获取
mybatis需要手动写sql
1. synchronized 和 lock 的区别是什么?
①synchronized 是关键字 ,Lock是一个接口
②synchronized会自动释放锁,不会产生死锁。Lock需要手动释放锁,可能产生死锁
2. sleep和wait的区别
①sleep是Thread中的方法, wait是Object的方法。
②sleep不会释放锁, wait会释放锁
3. 如何判断对象是否是垃圾
①没有实例 ② 没有引用 (可达性分析算法) ③没有ClassLoader
4. java中如何保证多线程的运行安全
①使用手动锁Lock
②使用线程安全的类
③使用synchronized关键字
④使用volatile关键字
5. ArrayList 的优缺点
底层以数组实现,尾部插入和中间查询快
但是在中间插入慢、删除慢
6. ArrayList与LinkedList有什么区别
①数据结构不同: ArraryList数组实现, LinkedList是链表
②效率不同: ArrayList适合顺序插入、随机读取, LinkedList适合随机插入删除,但是随机访问效率低
③自由性不同:ArrayList自由性低,需要手动设置固定大小的容量。
④主要开销的地方不同: ArrayList在于预留一定空间。LinkedList在于存储节点和指针信息
7. CAS
自旋锁,比较并交换、保证原子操作;通过volatile实现数据的可见性
CAS是非阻塞的、轻量级的乐观锁,利用 CPU 指令保证操作的原子性,以达到锁的效果,并且性能还很高;适合简单对象操作,比如布尔值、整型值;涉及多个共享变量时失效
8. servlet生命周期及方法调用过程
9 如何判断一个对象是否存活
GC 中一般通过可达性分析算法,判断GC Roots 下面的引用链中没有该对象的引用时,说明该对象不可用
可以作为GC Roots的有:①虚拟机栈中引用的对象 ②方法区类静态属性引用的对象 ③方法区常量池引用的对象
④本地方法栈JNI引用的对象
10 jvm内存模型
提示:这里可以添加计划学习的时间
例如:
提示:这里统计学习计划的总量
例如: