Mybatis的使用(4)
1:解决实体类成员变量和数据库表中字段名称不一致的问题:
方法1:在写sql语句时,给表中的列名起别名,名字和实体类名称一样
方法2:使用resultMap来解决:
例如:实体类中成员变量为id,name,数据库表中的列名叫bookid,bookname,两者不一致则使用resultmap:
List<Book> getall();
<resultMap id="bookmap" type="book">
<!-- 主键绑定-->
<id property="id" column="bookid"></id>
<!-- 非主键绑定-->
<result property="name" column="bookname"></result>
</resultMap>
<select id="getall" resultMap="bookmap">
select bookid,bookname from book
</select>
表的关联关系:一对多,多对一,一对一,多对多等关联关系
数据库中有两张表,分别为student和teacher
一对多关系:(一个老师对应多个学生)
Teacher getById(Integer id);
<resultMap id="teachermap" type="teacher">
<!-- 主键绑定-->
<id property="id" column="teid"></id>
<!-- 非主键绑定-->
<result property="name" column="tname"></result>
<!-- student实体类绑定,由于为List类型,所以-->
<collection property="students" ofType="student">
<!-- student中主键绑定-->
<id property="id" column="sid"></id>
<!-- stduent中非主键绑定-->
<result property="name" column="sname"></result>
<result property="tid" column="tid"></result>
</collection>
</resultMap>
<select id="getById" parameterType="int" resultMap="teachermap">
SELECT s.id sid, s.name sname, tid, t.id teid,t.name tname
FROM teacher t left JOIN student s ON s.tid=t.id
WHERE t.id=1
</select>
Teacher byId = teacherMapper.getById(1);
System.out.println(byId);
多对一关系:
Student getbyid(Integer id);
<mapper namespace="com.ztb.dao.StudentMapper">
<resultMap id="studentmap" type="student">
<!-- 主键绑定-->
<id property="id" column="sid"></id>
<!-- 非主键绑定-->
<result property="name" column="sname"></result>
<result property="tid" column="tid"></result>
<association property="teacher" javaType="teacher">
<id property="id" column="teid"></id>
<result property="name" column="tname"></result>
</association>
</resultMap>
<select id="getbyid" parameterType="int" resultMap="studentmap">
SELECT s.id sid, s.name sname, tid, t.id teid,t.name tname
FROM teacher t LEFT JOIN student s ON s.tid=t.id
WHERE s.id=#{id}
</select>
Student byId = studentMapper.getbyid(1);
System.out.println(byId);
一对一与上两个类似
多对多关系需要有个第三张表来表示两表之间的关系。
总之无论是什么关联关系,如果某方持有另一方的集合,则使用<collection>标签完成映射,如果某方持有另一方的对象,则使用<association>标签完成映射。
2:事务:多个操作同时完成,或同时失败称为事务处理
四个特性:原子性,一致性,隔离性,持久性
在mybatis中设置事务:
<transactionManager type="JDBC"/>:程序员自己控制处理的提交和回滚
可以设置为自动提交:
sqlsession=factory.openSession():默认是手动提交,设置为false也是手动提交
sqlsession=factory.openSession(true):自动提交,不必再写sqlsession.commit().
3:缓存:mybatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存
缓存的目的就是为了提高查询效率
流程:先到缓存里查,查不到的就去数据库查,查完放缓存里,下次在查询的时候直接从缓存里取,不在访问数据库。如果数据库发生commit操作,则清空缓存
一级缓存使用的是sqlsession的作用域,同一个sqlsession共享一级缓存的数据
二级缓存使用的是mapper的作用域,不同的sqlsession只要访问的是同一个mapper.xml文件,则共享二级缓存作用域
二级缓存步骤:
3.1在核心配置文件中加入
<setting name="cacheEnabled" value="true"/>
3.2.在mapper.xml中开启二级缓存
<cache></cache>
3.3实体类必须实现java.io.serializable,保证实体可序列化
Mybatis的使用(4)的更多相关文章
- 【分享】标准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的事物的做法,本文的目的是在这个的基 ...
随机推荐
- Python技法:浮点数取整、格式化和NaN处理
1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...
- [C++STL] vector 容器的入门
vector容器的入门 #include<vector> 创建vector容器的几种方式 数据类型可以是结构体,也能是另外一个容器 vector 的初始化: (1) 创建并声明大小 vec ...
- 题解 CF1095F 【Make It Connected】
题意简述 \(n\)( \(1≤n≤2×10^5\) )个点,每个点 \(i\) 有一个点权 \(a_i\) ( \(1≤a_i≤2×10^{12}\) ),将两个点 \(i\),\(j\) 直接相连 ...
- HYPERMESH-NASTRAN梁的方向与偏置
Nastran关于梁的定义 我们知道,在定义梁单元时,一般需要定义单元的方向,或者说是单元的局部坐标系.对于Nastran内CBAR单元来说,梁轴向为X方向,我们需要给出向量\(\overrighta ...
- Kubernetes client-go Informer 源码分析
概述ControllerController 的初始化Controller 的启动processLoopHandleDeltas()SharedIndexInformersharedIndexerIn ...
- Windows环境下安装RabbitMQ
本地安装RabbitMQ安装注意事项: Erlang与RabbitMQ,安装路径都应不含空格符. Erlang使用了环境变量HOMEDRIVE与HOMEPATH来访问配置文件.erlang.cooki ...
- Python3 collections模块
https://www.cnblogs.com/zhangxinqi/p/7921941.html http://www.wjhsh.net/meng-wei-zhi-p-8259022.html h ...
- 基于camunda开源流程引擎如何实现会签及会签原理解析
一.背景 市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.由于jbpm.activiti.flowable这几个流程引擎出现的比较早, ...
- php 二维数组转换一维数组
$result = array_reduce($res, function ($result, $value) { return array_merge($result, array_values($ ...
- 基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制
字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见.可编辑性等处理.本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍. 在设计字段权限的时候,我们 ...