Mybatis篇

只谈情不闲聊 提交于 2019-12-26 02:39:01

                    


1.Mybatis比IBatis比较大的几个改进是什么
  1>接口绑定,包括注解绑定和xml绑定
  2>动态sql有原来的节点配置变成ONGL表达式(#{})
  3>在一对一(多对一),一对多的时候引进了associateion,在一对多的时候引入了collection节点,不过都是在resultMap里配置

2.什么是MyBatis的接口绑定,有什么好处
   接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以了
   比sqlSession提供的方法我们可以有更加灵活的选择和设置
       // 加载接口
  UserDao userDao = sqlSession.getMapper(UserDao.class);

3.接口绑定有几种实现方式,分别是怎么实现的?
  接口绑定有两种实现方式
  1>注解式---在接口上面加上@select-@update等注解里面包含Sql语句来绑定
  2>xml方式--SQL来绑定,xml文件里面是我namespace必须为接口的全限定名
 
4.什么情况下用注解绑定,什么情况下用xml绑定
  用SQL语句较简单时,用注解绑定
  用SQL语句比较复杂时,用xml ,一般用xml
5.MyBatis实现一对一有几种方式?具体怎么操作的
  有联合查询和嵌套查询
  联合查询时几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成
  嵌套查询时先查一个表,根据这个表里的id,去另一个表去查询数据,也是通过association配置,但另一个表的查询通过select配置
 
6.MyBatis实现一对多有几种方式,怎么操作的
    有联合查询和嵌套查询
  联合查询时几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对一的类就可以完成
  嵌套查询时先查一个表,根据这个表里的id,去另一个表去查询数据,也是通过collection配置,但另一个表的查询通过select配置

7.MyBatis里面的动态Sql是怎么设定的?用什么语法?
  动态节点是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整们就必须要配和where和trim节点
  where节点是用来判断节点有内容就插入where ,否则不插入
  trim---自动去除and或or

8.IBatis和MyBatis的核心处理类分别叫什么
  IBatis的核心处理类---sqlMapClient
  MyBatis的核心处理类叫--sqlSession

9.IBatis和MyBatis在细节上的不同有哪些
   在SQL语句变量命名
  #变量---#{变量}====$变量---${变量}
  sql节点的class都变为type
  queryForObject queryForList------selectOne  selectList
   原来的别名设置在映射文件中,而现在放在了核心配置文件中

10.讲下MyBatis的缓存
   MyBatis的缓存分为一级缓存和二级缓存
   一级缓存放在session中,默认就有
   二级缓存放在它的命名空间里,默认是打开的,使用二级缓存属性类欲要实现Serializable序列化接口(可用来保存对象的状态)
   可在他的配置文件中配置</cache>
11.MyBatis(IBatis)的好处是什么
   iBatis把sql语句从java源程序中独立出来,放在单独的xml文件中编写,给程序带来了很多便利
   iBatis封装了底层JDBC API的调用细节,并能自动把结果集转换成javaBean对象,大大简化了Java数据库编程的重复工作
   因为IBatis需要程序员自己编写sql语句,灵活性高,比Hibernate等ORM框架更高的查询效率,能够完成复杂查询

1.当实体类中的属性名和表中的字段名不一样,如果实现正确查询
   1>通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类中的属性名保持一致
   2>通过resultMap来映射字段名和实体类属性名的一一映射关系
   <reesultMap id=""  type="">
   <!--id主键来映射主键字段-->
   <id property="id" column="order_id">
   <!--用result来映射非主键字段-->
   <result property="username" column="pusername">
    </resultMap>
2、 要使用like语句该怎么写?
    <select id="selectlike" >
     select * from t_user where username  like '%${value}%'
    </select>
3、如何执行批量插入?
   接口里写public void insertBitch(List<user> userlist);
   配置文件
    <insert id="insert" paramType="java,util.list">
    insert into t_user(id,username,password)
      <foreach collection="list" index="index" item="item" seperator="union all">
        (
         select #{item.id},#{item.username},#{item.password} from dual

           )
      </foreach>
    </insert>
   
5、在mapper中如何传递多个参数?  
   <封装为一个map,作为单个参数传递给mapper>

6.mybatis基础: #{…} 和 ${…} 的区别?
   #{...}-----jdbc prepared statement的一个参数标记
   ${...}-----解释为字符串拼接
 

7.Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
   还有很多其他的标签,<resultMap>,<parameterMap>,<sql>,<include>,<selectkey>,还有动态sql的九个标签
   trim/where/set/foreach/if/choose/when/otherwise/bind等
   <sql>为片段标签,通过include标签引入sql片段,<selectkey>为主键生成策略标签

   
8.最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,
参数不同时,方法能重载吗?
     Dao接口,就是常说的Mapper接口,接口的全限定名就是就是映射文件中的namespace的值,接口的方法名就是映射文件中MapperStatementde
     id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口的全限定名+方法名拼接字符串
    作为key,可唯一定位一个MapperedStatement.
    Dao接口的方法时不能重载的,应为是全限定名+方法名的保存和寻找策略
   Dao接口的工作原理是jdk动态代理,MyBatis运行时使用JDK动态代理为Dao接口生成代理proxy对象,代理对象会拦截接口方法,转而执行
   MapperStaterment所代表的sql,然后将sql执行结果返回



















易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!