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,保证实体可序列化

最新文章

  1. Python中MySQLdb模块的安装
  2. 特性Atrribute和枚举
  3. 大数计算_BigNum优化_加减乘除乘方取余_带注释_数组
  4. ucgui
  5. HDU2955 背包DP
  6. 解决iphone填写表单时,表单项获取焦点时往下拉屏,导致顶部标题栏下滑错位
  7. Surface Shader
  8. Piggy-Bank[HDU1114]
  9. Python学习总结6:字符串格式化操作及方法总结
  10. Mac下的eclipse按住ctrl点击无法查看类文件
  11. [转] shell字符串操作方法,以及实例
  12. Hibernate4.x之入门篇
  13. Linux编程简介
  14. org.springframework.web.bind.ServletRequestDataBinde
  15. BZOJ 1072 [SCOI2007]排列perm
  16. [转]解决get方法传递URL参数中文乱码问题
  17. C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
  18. Hibernate在自由状态和持久的状态转变
  19. 模拟SPI协议时序
  20. [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

热门文章

  1. JWT 访问令牌
  2. 运维:OAAS
  3. django请求生命周期流程与路由层相关知识
  4. python之三元表达式与生成式与匿名与内置函数(部分)
  5. Camunda如何配置和使用mysql数据库
  6. mysql调优学习笔记
  7. # 【由浅入深_打牢基础】WEB缓存投毒(上)
  8. 获取mybatis注解方式新增数据时非自增插入的主键
  9. 在VMware Workstation 16上安装Windows7虚拟机以及VMware tools安装失败解决方法
  10. jenkins结合ansible发布