什么是Mybatis?

1. mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需要关乎sql语句本身,不需要花费精力去处理驱动,创建连接,创建1statement等繁复过程。2. mybatis可以使用xml或注解来配置和映射原生信息。将pijo映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。3. 通过xm文件或注解的方式将要执行的各种statement配置起来,并通java对象和statement中sql的动态参数进行映射生成最终的sql语句,最后由mybatis框架执行sql并将结果映射java对象返回.

Mybatis的优缺点?

优点:

1. 基于sql语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,sql写在xml里,解除了sql与程序代码的耦合,2. 能够与spring很好的集成,3. 消除了JDBC的大量冗余代码,不需要手动开关连接,很好的与各种数据库兼容

缺点:

1. sql语句编写量偏多,2. sql'语句依赖于数据库,倒追数据库移植性差,不能随意更换数据库.

Mybatis使用场合?

专注于sql本身,是一个足够灵活的dao层解决方案.,对性能的要求很高,或者需求多变的项目,

#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。

当实体类的属性名和表种字段名不一致怎么办?

有两种解决方案:可以在sql语句给字段名取别名,别名于实体类属性名同名,也可以用<resultMap>来映射字段名和实体类属性名一一对应.

模糊查询like语句该怎么写?

第一种:在java代码添加sql通配符

    <select id=”selectlike”>
     select * from foo where bar like #{value}
    </select>

第二种:在sql语句中拼接通配符,会引起sql注入

    <select id=”selectlike”>
         select * from foo where bar like "%"#{value}"%"
    </select>

通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。

mapper接口里的方法是不能被重载的,因为是使用 全限名+方法名 的保存和寻找策略

Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

如何执行批量插入?

先创建一个简单的插入语句

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

然后在代码执行下面的

  list<string> names = new arraylist();
    names.add(“fred”);
    names.add(“barney”);
    names.add(“betty”);
    names.add(“wilma”);

    // 注意这里 executortype.batch
    sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
    try {
     namemapper mapper = sqlsession.getmapper(namemapper.class);
     for (string name : names) {
         mapper.insertname(name);
     }
     sqlsession.commit();
    }catch(Exception e){
     e.printStackTrace();
     sqlSession.rollback();
     throw e;
    }
     finally {
         sqlsession.close();
    }

如何获取自动生成的(主)键值?

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

在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 注解:
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>

(3)第三种:多个参数封装成map
try{
//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL
//由于我们的参数超过了两个,而方法中只有一个Object参数收集,因此我们使用Map集合来装载我们的参数
Map<String, Object> map = new HashMap();
     map.put("start", start);
     map.put("end", end);
     return sqlSession.selectList("StudentID.pagination", map);
 }catch(Exception e){
     e.printStackTrace();
     sqlSession.rollback();
    throw e; }
finally{
 MybatisUtil.closeSqlSession();
 }

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复

Mybatis的一级、二级缓存:

一级缓存事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。二级缓存进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。

什么是MyBatis的接口绑定?有哪些实现方式?

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同;② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;④ Mapper.xml文件中的namespace即是mapper接口的类路径。

05-28 23:02