1。1ORM概览 在了解ORM之前我们先了解什么是持久化,因为所有的ORM框架所做的事情无非就是将对象映射成数据库中的数据,以及将数据库中的数据映射成对象。1。1。1什么是持久化 所谓持久化就是把数据(内存中的对象)保存到可永久存储的存储设备中(例如:硬盘),持久化的主要应用是将内存中的数据存储在关系型数据库中。当然也可以保存在磁盘文件中,XML数据文件,JSON文件中等的。1。1。2什么是ORM ORM(ObjectRelationalMapping),对象关系映射,它的作用是在关系型数据库和对象之间做一个映射,这样,我们在具体的操作数据库时,就不需要和复杂的SQL语句打交道,像平时操作对象操作数据即可。 在目前的企业应用系统设计中,MVC,即Model(模型)View(视图)Control(控制)为主要的系统架构模式。MVC中的Model包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。 将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。 而ORM作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。 简单来说,按通常的系统设计,使用JDBC操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。 一般基本都是如下几个步骤:建立数据库连接,获得Connection对象。根据用户的输入组装查询SQL语句。根据SQL语句建立Statement对象或者PreparedStatement对象。用Connection对象执行SQL语句,获得结果集ResultSet对象。然后一条一条读取结果集ResultSet对象中的数据。根据读取到的数据,按特定的业务逻辑进行计算。根据计算得到的结果再组装更新SQL语句。再使用Connection对象执行更新SQL语句,以更新数据库中的数据。最后依次关闭各个Statement对象和Connection对象。 由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。 而一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。 另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。 所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO。NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。 所以为解决这一困难,就出现ORM这一个对象和数据之间映射技术。常用的ORM框架有Hibernate、Mybatis、Mybatisplus等,接下来我们以Mybatis为例深入学习。2。Mybatis概览 MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和JavaPOJO(PlainOldJavaObjects,普通老式Java对象)为数据库中的记录。 下面我们先了解一下Mybatis架构: Mybatis简略架构图mybatisconfig。xml:Mybatis全局配置文件,用于配置数据库、数据库连接池、POJO别名、映射文件等信息mapper。xml:该文件中用于编写处理数据的SQL语句。并且通过此文件可以将SQL语句与Java代码完全分离SqlSessionFactory:用于创建Java和数据库会话的Session对象Session:与数据库建立会话对象Executor:真正执行Sql语句的对象Statement:mapper文件对应的Statement,因为mapper文件是相互隔离的,可以理解为一个mapper文件就对应一个Statement对象。2。1Mybatis入门 在本小节内,将使用Mybatis框架搭建开发环境,并使用Mybatis进行单表的增删改查,其中涉及到的一些概念会在后续章节中陆续讲解。2。1。1新建Mybaits项目 在前面的课程中,已经学习了Maven的基础知识,使用Maven可以更好的管理和构建项目,因此使用Maven构建项目。项目结构如下: Mybatis项目图示 首先准数据库:CREATEDATABASEMYBATISDEMO;USEMYBATISDEMO;CREATETABLESTUDENT(STUDENTIDINTPRIMARYKEYAUTOINCREMENT,STUDENTNAMEVARCHAR(20),STUDENTAGEINT,STUDENTGENDERCHAR(2));INSERTINTOSTUDENT(STUDENTNAME,STUDENTAGE,STUDENTGENDER)VALUES(张无忌,18,男);INSERTINTOSTUDENT(STUDENTNAME,STUDENTAGE,STUDENTGENDER)VALUES(张翠山,43,男);INSERTINTOSTUDENT(STUDENTNAME,STUDENTAGE,STUDENTGENDER)VALUES(殷素素,40,男);INSERTINTOSTUDENT(STUDENTNAME,STUDENTAGE,STUDENTGENDER)VALUES(谢逊,50,男); 第一步:在pom。xml中导入依赖dependencygroupIdorg。mybatisgroupIdmybatisartifactIdversion3。5。6versiondependency 第二步:在resource目录下新建mybatisconfig。xml全局配置文件?xmlversion1。0encodingUTF8?!DOCTYPEconfigurationPUBLICmybatis。orgDTDConfig3。0ENhttp:mybatis。orgdtdmybatis3config。dtdconfiguration!配置数据库连接文件propertiesresourcedata。propertiesproperties!开启驼峰命名映射settingssettingnamemapUnderscoreToCamelCasevaluetruesettingsenvironmentsdefaultdevelopmentenvironmentiddevelopment!配置数据库事务管理器transactionManagertypeJDBCtransactionManagerdataSourcetypePOOLEDpropertynamedrivervalue{driver}propertynameurlvalue{url}propertynameusernamevalue{username}propertynamepasswordvalue{password}dataSourceenvironmentenvironments!配置SQL映射文件mappersmapperresourcemapperStudentMapper。xmlmappermappersconfiguration 第三步:创建SQL语句映射文件StudentMapper。xml!DOCTYPEmapperPUBLICmybatis。orgDTDMapper3。0ENhttp:mybatis。orgdtdmybatis3mapper。dtd!1。namespace和接口的全限定名一致!2。接口方法名和xml中sql语句ID一致!3。sql语句resultType返回值类型和方法返回值类型一致!4。输入参数类型与方法中一致mappernamespacecn。bytecollege。mapper。StudentMapperselectidfindAllresultTypecn。bytecollege。entity。StudentSELECTSTUDENTID,STUDENTNAME,STUDENTAGE,STUDENTGENDERFROMSTUDENTselectmapper 第四步:在java目录下,新建包cn。bytecollege。entity,并在包中新建实体类Studentpackagecn。bytecollege。importjava。util。OpublicclassStudent{privateIntegerstudentId;privateStringstudentNprivateIntegerstudentAprivateStringstudentGpublicIntegergetStudentId(){returnstudentId;}publicvoidsetStudentId(IntegerstudentId){this。studentIdstudentId;}publicStringgetStudentName(){returnstudentN}publicvoidsetStudentName(StringstudentName){this。studentNamestudentN}publicIntegergetStudentAge(){returnstudentA}publicvoidsetStudentAge(IntegerstudentAge){this。studentAgestudentA}publicStringgetStudentGender(){returnstudentG}publicvoidsetStudentGender(StringstudentGender){this。studentGenderstudentG}OverridepublicStringtoString(){returnStudent{studentIdstudentId,studentNamestudentName,studentAgestudentAge,studentGenderstudentGender};}} 第五步:在java目录下新建cn。bytecollege。mapper包,并在包中新建接口StudentMapperpackagecn。bytecollege。importcn。bytecollege。entity。Simportjava。util。LpublicinterfaceStudentMapper{ListStudentfindAll();} 第六步:新建测试类查询所有信息packagecn。importcn。bytecollege。entity。Simportcn。bytecollege。mapper。StudentMimportorg。apache。ibatis。annotations。Mimportorg。apache。ibatis。session。SqlSimportorg。apache。ibatis。session。SqlSessionFimportorg。apache。ibatis。session。SqlSessionFactoryBimportjava。io。InputSimportjava。util。LpublicclassApp{publicstaticvoidmain(String〔〕args){读取Mybatis配置文件InputStreamisApp。class。getClassLoader()。getResourceAsStream(mybatisconfig。xml);创建SqlSessionFactorySqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(is);获取SqlSessionSqlSessionsessionsqlSessionFactory。openSession();ListStudentlistsession。selectList(cn。bytecollege。mapper。StudentMapper。findAll);StudentMappermappersession。getMapper(StudentMapper。class);ListStudentlistmapper。findAll();list。forEach(System。out::println);}} 运行上面的程序结果如下图: 从上面的代码可以看出使用Mybatis的整个过程可以分为以下步:读取Mybatis全局配置文件构建SqlSessionFactory对象创建SqlSession对象获取自定义Mapper执行SQL语句获取执行结果2。2Mybatis对象简介 在上面步骤中出现了SqlSessionFactory、SqlSession等对象,下面就这些对象进行简单的介绍。SqlSessionFactory:每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为核心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的Configuration实例来构建出SqlSessionFactory实例。需要注意SqlSessionFactory是一个工厂接口而不是现实类,它的任务是创建SqlSession。SqlSession:SqlSession类似于一个JDBC的Connection对象。MyBatis提供了两种模式去创建SqlSessionFactory:一种是XML配置的方式,另一种是代码的方式。为了避免硬编码以及利于项目维护,通常推荐使用第一种方式,将配置和代码进行分离。Mapper(映射器):映射器是由Java接口和XML文件(或注解)共同组成的,它的作用有:定义参数类型、描述缓存、描述SQL语句、定义查询结果和POJO的映射关系。