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执行结果返回
来源:https://www.cnblogs.com/everything-will-flowing/p/7681400.html