MyBatis学习总结-2

8.  什么是自增主键返回,说出使用场景? mybatis中如何使用?
因为数据库提供自动生成主键功能,所以在插入操作时不需要设置主键信息,但是又需要拿到主键来对关联表进行数据更新。
·使用场景: 当插入新用户时,需要更新子表的信息(需要用到用户主键)。
oracle没有自增主键,mysql用函数:SELECT LAST_INSERT_ID()
·   mysql非自增主键返回(使用uuid())
注意:mysql调用UUID函数自动计算出唯一主键,再将主键输入到sql语句中。所以返回UUID主键时order为before。而自增主键是先插入时自增生成主键,所以selectKey的order为after.
SELECT UUID()
· oracle的序列返回主键:  SELECT 序列名.nextval()


9. mybatis和hibernate的区别
· hibernate是一个标准的ORM框架,不需要写sql;但对sql语句进行修改优化较为困难。
· mybatis 专注sql本身,程序员自己写sql,sql修改优化方便。
应用场景不同,hibernate适合需求变化不多的中小型项目,比如后台管理系统,ERP,CRM,OA 。而mybatis使用需求变化较多的项目如互联网项目。


10. SqlSession为什么是线程不安全的?该如何解决?
线程不安全就是对 公共变量 进行读写操作 并且没有加同步的,所以SqlSession线程不安全。解决方法是在同步方法内使用。




11. 原始Dao开发方法及问题(需写dao接口和dao实现类)
· dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,减轻工作量
· 调用sqlsession方法时将statement的id硬编码了。
· 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。


12. mapper代理方法(只需写mapper接口)
程序员只需要编写mapper接口(相当于dao接口),mybatis可以自动生成mapper接口实现类代理对象。


因为mapper接口的方法必须与XxxMapper.xml的statementId一致,用来统一生成 sqlSession.insert("namespa.methodId",user);
节省了工作量。


通过:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
生成代理对象。


13. mybatis 核心配置文件 元素作用
·properties 引入properties配置文件
·setting 全局参数配置
·typeAliases 别名,mybatis默认存在一些别名,如int是Integer的typeAliases。别名作用是 简化书写。
·批量定义别名:package别名后mybatis自动扫描包中的po类,自动定义别名--就是类名,首字母大小写都可以。
除此之外,还有:
·typeHandlers :类型处理器
·objectFactory :对象工厂
·plugins :插件
·environments
environment
transactionManager
dataSource
·mappers :映射器配置


14. Mybatis加载属性顺序:
先加载 SqlMapConfig.xml中 <properties>元素体内的属性;其次是读取<properties>元素中resource或url加载的.properties文件中配置的属性。注意:配置statementId 方法中拼接参数 ${}会读取覆盖的同名属性。所以不能乱起名。


15. Mabatis配置文件 配置mapper映射有几种方法?
· <mapper resource=""/>
· <mapper url=""/>
· <mapper class="xx.xx.mapper.XxxMapper" /> (必须将mapper类和mapper.xml写在同一包下)
· 批量加载配置mapper (同一包下)
<package name="xx.xx.mapper"/>




16. resultMap的作用?
mybatis中使用resultMap完成高级输出结果映射。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系。
1.定义resultMap
2.使用resultMap作为statement的输出映射类型


resultMap的id可以带上namespace跨文件调用




17. Mybatis中的动态sql?
通过表达式进行判断,对sql进行灵活拼接、组装。
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustomer.sex!=''">
and user.sex=#{userCustom.sex}
</if>
<if test="userCustomer.username!=null and userCustomer.username!='' ">
and user.username LIKE '%${userCustom.username}%'
</if>
</if>
</where>


//<where>可自动去掉 第一个条件的and


动态sql 片段抽取有什么注意的?
· <where>不能抽取
· 片段都是 单表 条件


引用sql片段: <include refid="sqlId"></include>


sql片段中,如果向sql传递的参数是数组或List,mybatis使用foreach解析。
模拟场景: SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
                                    id IN(1,10,16)
public class UserQueryVo {
private List<Integer> ids;
}


<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR"> 
id=${user_id}
</foreach>
</if>
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND id IN(" close=")" separator=","> 
${user_id}
</foreach>
</if>






  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值