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的事物的做法,本文的目的是在这个的基 ...
随机推荐
- C#.NET XML 与 实体 MODEL 互转,非序列化
只能处理简单结构XML 和 实体. using System.Text; using System.Xml; namespace A.Util { public static class MyXmlU ...
- Zabbix 3.0 配置企业微信报警(配置zabbix-web)
一.添加报警媒体类型 Name:自定义 Type:选择script Scripts name:填写脚本名称 Script parameters:脚本参数 --corpid=XXX --corpsecr ...
- 微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh
微服务, 架构, 服务治理, 链路跟踪, 服务发现, 流量控制, Service Mesh 微服务架构 本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧 ...
- 安卓、IOS端AEC密钥加密 Java端密钥解密通用实现(16进制表现形式)
由于业务需求,需要实现在客户端对重要信息进行加密,在服务端进行解密.客户端包括IOS和安卓的 服务端位Java. 注意密钥 需要保持一致,可以自己定义 . 安卓端加密代码: ============= ...
- maven将Jar安装进仓库
mvn install:install-file -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.4 -Dpac ...
- Java开发笔记(一百五十)C3P0连接池的用法
JDBC既制定统一标准兼容了多种数据库,又利用预报告堵上了SQL注入漏洞,照理说已经很完善了,可是人算不如天算,它在性能方面不尽如人意.问题出在数据库连接的管理上,按照正常流程,每次操作完数据库,都要 ...
- c++项目经验分享
1.C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有类型检查功能. 其次,可以使用C++的作用域规则将定义限制在特定的函数[常函数]或文件中. 第三,可以将const ...
- 关于nslookup以及dig命令的研究报告
我们在日常上网时都是用域名访问网路,如www.baidu.com,而在实际寻址过程中,是使用IP地址,如180.101.49.11,域名到IP地址的解析是通过DNS服务器来实现的,系统中我们可以用一些 ...
- Ambari调整日志级别:How to enable debug logging in Ambari Server and Ambari Agent ?
PURPOSE When troubleshooting Ambari issues, it may be necessary to enable debug logging in the Ambar ...
- java基础 Math
package cn.mantishell.day08.demo04; /** * java.util.Math类是数学相关的工具类,里面提供类大量的静态方法,完成与数学运算相关的操作 * * pub ...