Mybatis容易遇到的问题
1.MyBatis中#和$的区别?
1.使用#的原理是?占位符,而$的原理为直接字符串拼接方式
2.$方式一般使用在写数据库中的固定字段时候才会使用例如表名或者列名(select * from user order by xxx)这个中的xxx可以使用$
3.#可以防止注入,$不能防止sql注入
4.一般情况下能使用#就不适用$.
2.MyBatis的编程步骤是什么样的?
1.创建SqlSessionFactory
2.通过sqlSessionFactory创建SqlSession
3.通过sqlSession执行数据库操作.
4.调用session.commit()提交事务
5.调用sessioin.close()关闭会话
3.JDBC编程有那些不足之处,NyBatis是如何解决的?
1.数据库的创建,释放频繁造成系统资源浪费从而影响性能,如果使用数据库连接池可解决此问题.
解决:在Sqlmapconfig.xml中配置数据连接池,使用连接池管理数据库连接
2.sql语句写在代码中造成代码不易维护,实际用sql变化大,sql变动需要改变java代码
解决:将sql语句配置在xxxmapper.xml文件中与java代码分离.
3.向sql语句传参麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应.
解决:mybatis自动将java对象映射至sql语句.
4.对结果即解析麻烦,sql变化导致解析代码变化,且解析前需要进行遍历,如果能将数据库记录封装成pojo对象解析还比较方便.
解决:mybatis自动将sql执行结果映射至java对象
4.使用mybatis的mapper接口调用时有那些要求?
1.Mapper.xml文件中的namespace即是mapper接口的类路径
2.Mapper接口方法名和mapper.xml中定义的每个sql的id相同
3.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同.
4.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同.
MyBatis中一级缓存和二级缓存?
1.一级缓存:基于perpetualCache的HashMap本地缓存,其存储作用域为session,当session flush或者close()之后,该session中的所有cache将清空.
2.二级缓存和一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(NameSpace),并且可自定义存储源,如Ehcache.作用域为namespace是指该namespace对应的配置文件中所有的select操作结果都缓存,这样不同于线程之间就可以共用二级缓存,启动二级缓存:在mapper配置文件中<cache/>
二级缓存可以设置返回的缓存对象策略:<cache readOnly="true">.当readOnly="true"时,表示二级缓存返回给所有调用者同一个缓存对象实例,调用者可以update获取的缓存实例,但是这样可能造成其他调用者出现数据不一致的情况(因为所有调用的是同一个实例).当readOnly=false时,返回给调用者的是二级缓存总缓存对象的拷贝,即不同调用者获取的是缓存对象的不同实例,这样调用者对各自的缓存对象的修改不会影响到其他的调用者,即是安全的,所以默认是readOnly="false"
3.对于缓存数据更新机制,当某一个作用域(一级缓存session/二级缓存namespaces)的进行了cud操作后,默认该作用域下所有select中的缓存将被clear'
6.Mybstis在insert插入数据操作时返回主键ID?
数据库为mysql时:
<insert id="insertUser" parameterType="com.qingmu.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!--<selectKey keyProperty="id" order="AFTER" resultType="int">-->
<!--select LAST_INSERT_ID()-->
<!--</selectKey>-->
insert into USER VALUES (#{id},#{username},#{sex},#{birthday},#{address})
</insert>
keyproperty表示返回的id要保存到对象的那个属性中,useGeneratedKeys表示主键id为自增长模式.Mysql中做上配置就可以了.
数据库为Oracle时"
"
由于Oracle没有自增长这一说,只有序列这种模仿自增的形式,所以不能再使用UserGeneratedKeys属性,而是使用selectKey将Id获取并赋值到对象的属性中,insert插入操作时正常插入id
Mybatis容易遇到的问题的更多相关文章
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- mybatis plugins实现项目【全局】读写分离
在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...
- MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- MyBatis源码分析(一)开篇
源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...
- (整理)MyBatis入门教程(一)
本文转载: http://www.cnblogs.com/hellokitty1/p/5216025.html#3591383 本人文笔不行,根据上面博客内容引导,自己整理了一些东西 首先给大家推荐几 ...
- MyBatis6:MyBatis集成Spring事物管理(下篇)
前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...
随机推荐
- java HttpClientHelper
1 首先配置pom.xml,具体参考我的这篇文章:使用httpclient需要的maven依赖 2 上代码 import java.io.IOException; import java.io.Inp ...
- day04——列表、元组、range
day04 列表 列表--list 有序,可变,支持索引 列表:存储数据,支持的数据类型很多:字符串,数字,布尔值,列表,集合,元组,字典,用逗号分割的是一个元素 id() :获取对象的内存地址 ...
- ZYNQ笔记(0):C语言基础知识复习
ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能.我本科学C语言时就是对付考试而已,导致现在学ZYNQ是一脸懵逼.现在特开一帖,整理一下C语言的基础知识. 一.定义 1. ...
- python之Ai测试Applitools使用
一:Appltools下载: pip install eyes-selenium==3.16.2 二:注册:Appltools账号:https://applitools.com/sign-up 三.获 ...
- DISPLAY FORMAT 語法
- MySQL学习一:建表
目标:创建三张表,学生表student(sid,name,gender), 课程表course(cid,name), 分数mark(mid, sid, cid, gender); 要求sid, cid ...
- 个人Wiki搭建(Gitbook + GitHub Pages)
工具选择:Gitbook + GitHub Pages 大概流程: 首先在本地编写md文件,然后生成对应的html文件,最后将这些html文件推送到github对应的gitbook仓库. 具体步骤: ...
- NMS的实现代码详解
NMS代码说明(来自Fast-RCNN) 个人觉得NMS包含很多框,其坐标为(x1,y1,x2,y2),每个框对应了一个score,我们将按照score得分降序,并将第一个最高的score的框(我们叫 ...
- django.db.utils.InternalError: (1060, "Duplicate column name 'user_id'")迁移报错解决方法
django.db.utils.InternalError: (1060, "Duplicate column name 'user_id'")迁移报错解决方法 django.db ...
- Git for Windows. 国内镜像
感谢https://github.com/waylau/git-for-win Git for Windows. 国内直接从官网(http://git-scm.com/download/win)下载比 ...