基于ssm框架的数据库层具体操作流程、解析及相关知识扩展

1)首先实体类entity对应数据库表,包括表名、列名及其类型和在程序对象中对应的变量名,如下基于注解:

RootCert.java

这里写图片描述

2)Mapper操作接口,定义操作数据库方法包括传参,事例如下:

RootCertMapper.java

这里写图片描述

3)具体操作数据库的sql定义的Mapper.xml操作,事例如下:

RootCertMapper.xml

这里写图片描述

这里需要注意的东西比较多,如上标记处:包括对应的Mapper空间路径、对应的实体entity、表名、表的列名及Mapper类传进的参数形式source;

4)此时service层即可调用Mapper类的方法进行数据库操作,到这里基本的数据库层操作流程及处理基本完成;

扩展及解析:

标签:
id:resultMap标签的标识。
type:返回值的全限定类名,或类型别名。
autoMapping:值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法。

可以设置的子标签映射:
1).id标签 :ID 结果,将结果集标记为ID,以方便全局调用(适用于指定主键)
column 数据库的列名
Property需要装配的属性名
2).result标签:将查询到的列的值,反射到指定的JavaBean的 属性上
column 数据库的列名
Property 需要装配的属性名
3).association标签:复杂类型 , 多表查询(一对一)时,将根据外键或某列信息查询出的对象,直接装配给某个resultMap指定的属性。
column 数据库的列名
Property 需要装配的属性名
select 指定用来多表查询的sqlmapper

  4).collection标签:复杂类型,多表查询(一对多),将查询出的结果集合直接装配给某个对应的集合
        column 数据库的列名
        Property 需要装配的属性名
        javaType 指定用什么类型接受返回的值(必要)
        select  指定用来多表查询的sqlmapper
  5).constructor– 用来将结果反射给一个实例化好的类的构造器
        idArg –ID 参数;将结果集标记为ID,以方便全局调用
        arg –反射到构造器的通常结果

多表查询实例Mapper.xml:获取用户订单及商品详情
这里写图片描述

(
count(1):如果数据量较大的话,也可以提高速度,因为写count(*)的话会所有列扫描,这里用1的话或者用字段名的话,只扫描你写的那个列;
count()和count(字段名) 基本结果是一样的,但是一种情况例外,就是当某字段名下边的数据有null值的时候,不计入这个count中,则全部列入count中;
)

    Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

    向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
     Mybatis自动将java对象映射至sql语句。

    对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
    Mybatis自动将sql执行结果映射至java对象。

MyBatis与Hibernate:

        Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,
不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。 

    Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,
例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。
但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。 

    Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)
 如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,
 在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

MyBatis的一级缓存和二级缓存:

缓存:先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,
下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。

**一级缓存**是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。
不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

   用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取;
    如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。
    但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。

**二级缓存**是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

    UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。
    每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。

猜你喜欢

转载自blog.csdn.net/enjoy_endless/article/details/79033642
今日推荐