1.同步、异步的区别?
同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
异步,与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。
2.mybatis是什么?有什么特点?
它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低
什么是ORM?
Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。Student类就对应student表,一个Student对象就对应student表中的一行数据
为什么mybatis是半自动的ORM框架?
用mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。用hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作了。由于mybatis需要手写SQL语句,所以它有较高的灵活性,可以根据需要,自由地对SQL进行定制,也因为要手写SQL,当要切换数据库时,SQL语句可能就要重写,因为不同的数据库有不同的方言(Dialect),所以mybatis的数据库无关性低。虽然mybatis需要手写SQL,但相比JDBC,它提供了输入映射和输出映射,可以很方便地进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提升了开发的效率。并且它的学习成本也比hibernate低很多
3.mybatis如何实现多对一和一对多?
查询所有学生的信息包括对应的老师名(多对一) association
<select id="getStudent2" resultMap="studentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<resultMap id="studentTeacher2" type="pojo.Student">
<result column="sid" property="id"/>
<result column="sname" property="name"/>
<association property="teacher" javaType="pojo.Teacher">
<result column="tname" property="name"/>
</association>
</resultMap>
查询所有老师的信息包括对应的所有学生(一对多) collection
<!--结果嵌套映射-->
<select id="getTeacher" resultMap="teacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
from student s,teacher t
where s.tid=t.id and t.id=#{tid}
</select>
<resultMap id="teacherStudent" type="pojo.Teacher">
<result column="tid" property="id"/>
<result column="tname" property="name"/>
<!--
javaType:指定属性的类型
集合中的泛型信息,用oftype获取
-->
<collection property="students" ofType="pojo.Student">
<result column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="tid" property="tid"/>
</collection>
</resultMap>
4.mybatis的动态SQL
if 和 where 标签
<!--动态Sql : where / if-->
<select id="dynamicSql" resultType="com.lks.domain.User">
select <include refid="tableAllkey"/> from users
<where>
<if test="id != null and id != 0">
AND id = #{id}
</if>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="county != null and county != ''">
AND county = #{county}
</if>
</where>
</select>
一般开发列表业务的查询条件时,如果有多个查询条件,通常会使用 标签来进行控制。 标签可以自动的将第一个条件前面的逻辑运算符 (or ,and) 去掉,正如代码中写的,id 查询条件前面是有“and”关键字的,但是在打印出来的 SQL 中却没有,这就是它的作用。
choose、when、otherwise 标签
这三个标签需要组合在一起使用,类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件。
<!--动态Sql: choose、when、otherwise 标签-->
<select id="dynamicSql2" resultType="com.lks.domain.User">
select * from users
<where>
<choose>
<when test="name != null and name != ''">
AND name = #{name}
</when>
<when test="county != null and county != ''">
AND county = #{county}
</when>
<otherwise>
AND id = #{id}
</otherwise>
</choose>
</where>
</select>
set 标签
使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,在进行表单更新的操作中,哪个字段中有值才去更新,如果某项为 null 则不进行更新,而是保持数据库原值。
<!--动态Sql: set 标签-->
<update id="updateSet" parameterType="com.lks.domain.User">
update users
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="county != null and county != ''">
county = #{county},
</if>
</set>
where id = #{id}
</update>
trim 标签
trim 是一个格式化标签,可以完成< set > 或者是 < where > 标记的功能。主要有4个参数:
① prefix:前缀
② prefixOverrides:去掉第一个and或者是or
③ suffix:后缀
④ suffixOverrides:去掉最后一个逗号,也可以是其他的标记
<!--动态Sql: trim 标签-->
<select id="dynamicSqlTrim" resultType="com.lks.domain.User">
select * from users
<trim prefix="where" suffix="order by age" prefixOverrides="and | or" suffixOverrides=",">
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="county != null and county != ''">
AND county = #{county}
</if>
</trim>
</select>
5.mybatis的延迟加载和缓存等特性?
mybatis的延迟加载是指在一次联表查询的过程中,如果开启了延迟加载,mybatis就会把我们的联表查询语句拆成一个个的单表查询语句分开进行查询。举个例子,在学生和老师多对一的关系中,查询所有学生以及他们对应的老师。经过延迟加载处理,就会拆成先select * from student;从学生表查询学生信息拿到tid之后再进行select * from teacher where id = ?查询到老师的信息。这样做的好处是推迟对关联对象的select查询,可以有效的减少数据库压力。
mybatis是如何进行延迟加载的呢,一个操作分成了两次会不会产生数据安全问题。答案是不会,这就牵扯到mybatis的缓存问题。mybatis中有两级缓存,默认开启一级缓存,二级缓存需要在settings中进行配置。
一级缓存:Mybatis一级缓存的作用于是同一个SqlSession,当使用同一个SqlSession来执行多次相同的sql语句时,会在第一次从数据库查询到数据存到缓存(内存),后面的再次查询会直接读取内存中的数据,从而提高查询效率。
二级缓存:Mybatis二级缓存是多个SqlSession共享,其作用域是mapper的同一个namespace,多个SqlSession执行相同的sql,会在第一个执行完后,将数据存入缓存(内存),其余的直接读取缓存,二级缓存默认没有开启,需要在setting全局参数配置中开启二级缓存。
6.delete、trancate、drop删表的区别
delete删表实际是一行一行的删,并且是可以回退的,相当于给数据标记了一下已被删除,但实际还存在,如果有自增的字段,delete表后新增数据,自增字段的值不会从0开始;
trancate删表实际上是删掉了表再新建了一个一模一样的空表,可以直接往里添加数据;
drop删表就是真的删掉了,这个表没了。