版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb编程技术本章首先介绍MyBaits框架及其工作原理、核心组件和运行机制,接下来介绍MyBaits应用的开发步骤,最后介绍MyBatis核心对象与日志管理。MyBatis概述MyBatis的开发实例MyBatis核心对象的使用MyBatis的日志管理第14章MyBatis快速入门MyBatis是一款轻量级的、开放源代码的数据持久层框架。它支持普通SQL查询、存储过程和高级映射,用来实现应用程序的持久化功能。MyBatis概述MyBatis是一个对象-关系映射框架,它可以实现Java对象与SQL数据库表的自动映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJO映射成数据库中的记录。有些持久层框架使用框架本身提供的查询语言,比如,Hibernate提供的HQL(HibernateQueryLanguage)或者JPA提供的EJBQL(EnterpriseJavaBeanQueryLanguage)。MyBatis与其他的持久层框架(如Hibernate)最大的不同是它强调SQL的使用,即使用原生SQL操作数据库。14.1MyBatis的使用14.1.1如果使用Maven构建工具创建项目,可以在pom.xml文件中添加MyBatis的有关依赖,如下所示。<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency>MyBatis的工作原理14.1.2MyBaits的执行流程,如图所示。(1)读取mybatis-config.xml配置文件。(2)加载映射文件,即SQL映射文件。(3)构建会话工厂。(4)创建SqlSession会话对象。(5)动态地生成需要执行的SQL语句。(6)执行SQL语句。(7)输出结果映射。案例学习:简单的MyBatis应用14.2
使用MyBatis操作数据库,用一个对Student对象保存和读取的例子说明MyBatis的基本配置和使用。使用MyBatis进行持久化操作,通常操作步骤如下。在应用程序中,首先获取SqlSessionFactory会话工厂对象,这需要加载MyBatis的配置文件,配置文件中配置了有关数据库连接信息以及其他信息。使用SqlSessionFactory获取SqlSession会话对象。调用SqlSession会话对象的getMapper()方法返回Mapper代理对象。开发POJO类和编写映射文件,在其中定义要执行的SQL语句。编写Mapper接口,其中定义数据库操作方法。执行Mapper代理对象的方法操作数据库。最后结束事务,关闭SqlSession。创建项目与环境14.2.1
(1)在IntelliJIDEA中,创建名为chapter14的JakartaEE项目,在pom.xml中添加下面依赖项,如清单14.1所示。
pom.xml清单14.1<dependency><groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version><scope>runtime</scope></dependency><dependency><groupId>com.weicoder</groupId><artifactId>log4j</artifactId><version>3.5.1-jdk11</version></dependency>(2)MyBatis默认使用Log4j输出日志信息,所以要查看控制台的输出SQL语句,需要配置日志文件。在项目的src/main/resources目录下创建perties文件,内容如清单14.2所示。perties清单14.2log4j.rootLogger=ERROR,stdout
log4j.logger.com.boda.mapper=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%n创建配置文件14.2.2MyBatis使用配置文件配置有关环境信息,其中关于数据库的连接信息就应该定义在配置文件中。
假设我们使用JDBC连接MySQL数据库elearning,MySQL数据库驱动程序名为com.mysql.cj.jdbc.Driver,数据库连接的URL为jdbc:mysql://localhost:3306/elearning,用户名为root,口令为123456。配置文件存放在类路径中(项目的src/main/resources目录)。
配置文件mybatis-config.xml的具体内容如下。mybatis-config.xml清单14.3@Controller<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfiguration
PUBLIC"-////DTDConfig3.0//EN"
"/dtd/mybatis-3-config.dtd"><configuration>
<!--配置日志实现--><settings>
<settingname="logImpl"value="LOG4J"/>
</settings><!--配置MyBatis运行环境--><environmentsdefault="development"><environmentid="development"><!--type="JDBC"代表使用JDBC的提交和回滚来管理事务--><transactionManagertype="JDBC"/><!--POOLED表示支持JDBC数据源连接池-->
<dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/elearning?useSSL=false&serverTimezone=UTC"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></dataSource></environment></environments><!--mapper告诉MyBatis到哪里去找POJO类的映射文件--><mappers><mapperresource="com/boda/mapper/StudentMapper.xml"/></mappers>定义POJO类14.2.3POJO类用来存储要与数据库交互的数据,它实际是一个JavaBean类。本案例使用Student类存储与数据库表students交互的数据。该类的定义与清单5.1的Student类完全相同,这里不再重复定义。Student类的定义符合JavaBean规范,为每个属性定义了setter和getter方法,并且属性的访问权限都是private。所有的POJO类都需要一个默认的构造方法,因为MyBatis将使用Java的反射机制创建对象。如果没有定义默认构造方法,编译器将自动创建一个默认构造方法。定义映射文件14.2.4要实现POJO类Student与数据表students之间的对应关系,也就是实现POJO类的的属性与数据表的各个列之间的对应关系。MyBatis使用映射文件实现这种对应关系的。映射文件是XML文件,应存放在指定包中。例如,为Student类定义的映射文件名为StudentMapper.xml,保存在com.boda.mapper包中,内容如下。StudentMapper.xml清单14.4<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.boda.mapper.StudentMapper"><selectid="findAllStudents"resultType="com.boda.domain.Student">
SELECTstud_idASstudId,name,gender,birthday,phoneFROMstudents</select></mapper>Mapper代理接口14.2.5
要对数据库操作,还必须为映射文件定义Mapper映射器接口,然后通过SqlSession的getMapper()方法得到一个Mapper代理对象,通过这个代理对象调用数据库操作方法。
需要为每个映射文件定义一个接口,接口名应该与映射文件中的<mapper>元素的namespace属性值的名称相同。接口中的方法名和参数名必须要与映射文件中的<select>元素的id属性和parameterType属性一致。
例如,要为StudentMapper.xml文件定义一个Mapper接口,在Mapper接口通常为映射文件中每个SQL操作定义一个抽象方法。例如,假设在StudentMapper.xml文件中定义了一个SQL语句,这里就要在Mapper接口中定义一个抽象方法,方法名与SQL语句的id属性值相同,它映射到SQL语句。Mapper接口必须与映射文件保存在相同的包中。清单14.5是StudentMapper接口的定义。StudentMapper.java清单14.5packagecom.boda.mapper;importjava.util.List;importcom.boda.domain.Student;publicinterfaceStudentMapper{
List<Student>findAllStudents();//查询所有学生}
这里只需要程序员编写接口(相当于DAO接口),然后由MyBatis框架根据接口的定义创建接口的动态代理对象,这个代理对象的方法体等同于DAO接口的实现类,从而不需要定义实现类。
虽然使用Mapper接口的编程方式很简单,但使用时需遵循下面规范。Mapper接口的名称必须与对应的映射文件名一致,如映射文件名StudentMapper.xml,则接口名应为StudentMapper。Mapper.xml文件中的namespace与Mapper接口的类路径相同(即接口文件与映射文件放在同一个包中)。Mapper接口的方法名与Mapper.xml中定义的某个执行语句的id相同。Mapper接口的方法的参数类型和Mapper.xml中定义的SQL语句的parameterType类型相同。Mapper接口的方法的返回值类型和Mapper.xml中定义的SQL语句的returnType类型相同。编写测试类14.2.6使用MyBatis可以开发独立的Java应用程序,也可以开发Web应用程序。本例只编写一个应用程序,在main()中完成启动MyBatis,创建各种对象并完成持久化操作。MyBatisTest.java清单14.6Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
SqlSessionsession=sqlSessionFactory.openSession();//返回Mapper对象StudentMappermapper=session.getMapper(StudentMapper.class);//执行查询,返回List<Student>对象List<Student>lists=mapper.findAllStudents();for(Studentstudent:lists){System.out.println(student);}mit();//提交事务
session.close();//关闭会话对象MyBatisUtil工具类14.2.7
在上节例子中,如果要编写多个方法测试数据库操作,需要在每个方法中编写相同的代码读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象,然后创建SqlSession对象,这将导致大量的重复代码。
为了简化开发,可以将重复的代码封装到一个工具类中,然后通过工具类来创建SqlSession,如清单14.7所示。MyBatisUtil.java清单14.7publicstaticSqlSessionFactorysqlSessionFactory=null;
static{try{ //使用MyBatis提供的Resources类加载MyBatis的配置文件 InputStreaminputStream= Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory= newSqlSessionFactoryBuilder().build(inputStream); }catch(Exceptione){e.printStackTrace(); } }publicstaticSqlSessiongetSession(){ returnsqlSessionFactory.openSession();}MyBatis核心对象14.3在使用MyBatis框架时,主要涉及两个核心对象:SqlSessionFactory和SqlSession,它们在MyBatis框架中起着至关重要的作用。本节将对这两个对象进行详细讲解。SqlSessionFactory14.3.1SqlSessionFactory是MyBatis框架十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession对象。每个基于MyBatis的应用都是以一个SqlSessionFactory实例为中心。
可以通过SqlSessionFactoryBuilder获得SqlSessionFactory实例。而SqlSessionFactoryBuilder则可从XML配置文件或一个预先定制的Configuration类实例获得。从配置文件中构建SqlSessionFactory实例非常简单,建议使用类路径下的配置文件。MyBatis提供一个Resources工具类,它包含一些实用方法,可从类路径或其他位置加载配置文件。Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=
newSqlSessionFactoryBuilder().build(inputStream);上述代码使用Resources类的getResourceAsStream()方法加载配置文件。MyBatis配置文件mybatis-config.xml中包含了对MyBatis系统的核心设置,包含获取数据库连接实例的数据源(DataSource)。接下来使用SqlSessionFactoryBuilder的build()方法创建一个
SqlSessionFactory对象。SqlSession14.3.2SqlSession称为SQL会话,它是应用程序与持久存储层之间执行交互操作的一个对象。SqlSession对象提供了数据库中所有执行SQL操作的方法,它的底层封装了JDBC连接。
创建SqlSession对象很容易,用SqlSessionFactory对象的openSession()方法即可创建一个SqlSession对象。关闭操作很重要,应该把这个关闭操作放到finally块中以确保每次都能执行关闭。下面代码能确保SqlSession使用后被关闭。
SqlSessionsqlSession=sqlSessionFactory.openSession();try{//执行某种操作}finally{
mit();//提交事务
session.close();//关闭会话对象}SqlSession常用方法14.3.2
通过执行SqlSession对象的方法可以实现各种对象持久化操作,常用方法如下:intinsert(Stringstatement)intdelete(Stringstatement)intupdate(Stringstatement)<T>TselectOne(Stringstatement)<E>List<E>selectList(Stringstatement)<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey)
publicvoidcommit()publicvoidrollback()publicvoidclose()<T>TgetMapper(Class<T>type):返回Mapper接口的代理对象,参数type是Mapper的接口类型,该对象关联了SqlSession对象,直接调用它的方法操作数据库。
定义了Mapper接口之后,在应用程序中就可以使用SqlSession的getMapper()方法得到一个代理对象,如下所示。得到映射器代理对象后,就可以调用Mapper接口中定义的方法操作数据库,下面代码执行selectAllStudent()方法查询所有学生。SqlSessionsession=MyBatisUtil.getSession();StudentMappermapper=session.getMapper(StudentMapper.class);List<Student>lists=mapper.selectAllStudent();Studentstudent=newStudent(103,"张明宇","女",LocalDate.of(1998,5,2),"55555555");mapper.insertStudent(student);日志管理14.4Mybatis内置的日志工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 矿山开采扩建爆破作业协议
- 国际连锁酒店外籍客户经理协议
- 科技创新房产按揭合同模板
- 船舶检测探伤施工合同
- 园林绿化场地平整施工合同
- 供电管道弱电系统维护合同模板
- 化学事故消防班组施工合同
- 建筑智能化工程材料购销合同模板
- 农业市场拓展竞争性磋商细则
- 养猪场建筑施工环保合同
- DIN-EN-ISO-2409-CN国际标准文档
- 职业卫生检测考试真题十五
- Unit+3+Celebrations+Topic+Talk 高中英语北师大版(2019)必修第一册
- 2023建设工程智慧消防系统技术规程
- 安全教育培训记录表-(大全)
- 教育技术与数字化转型
- 大象版科学四年级上册全册教案(含反思)
- 黑龙江裕盛源再生资源利用有限公司年处理10万吨废旧轮胎资源综合利用科技示范项目环境影响报告
- 古扎拉蒂《计量经济学基础》(第5版)笔记和课后习题详解
- 设计更改通知书
- 古建筑修缮工程文明施工措施
评论
0/150
提交评论