MyBatis问答自测
姓名:🌕
学号:🌻
文章目录
a) 简述 MyBatis 的工作原理。
答:如图1所示。
①读取MyBatis的全局配置文件mybatis-config.xml,解析MyBatis的运行环境、数据库连接等信息。
②加载SQL映射文件,mybatis-config.xml文件可以加载多个映射文件。
③通过MyBatis的环境等配置信息,构造会话工厂SqlSessionFactory。
④创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含执行SQL语句的所有方法。
⑤MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的 SQL语句,同时负责查询缓存的维护。
⑥在 Executor接口的执行方法中,MappedStatement类型的参数对映射信息进行封装,用于存储要映射的SQL语句的id、参数等信息。
⑦输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
⑧输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
图1 MyBatis框架工作流程
b)简述 MyBatis 和 Spring 的整合过程。
答:①导入相关JAR包。包括MyBatis和Spring框架所需的JAR包、MyBatis与Spring整合的中间JAR包、数据库驱动JAR包、数据源所需的JAR包等。
②在Spring中配置MyBatis工厂。将MyBatis的 SessionFactory交由Spring来构建,添加如下代码。
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- configLocation的属性值为MyBatis的核心配置文件 -->
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml"/>
</bean>
③使用Spring管理MyBatis的数据操作接口。
④对于整合后的框架,开发者不再需要编写 SqlSession对象的创建、数据库事务的处理等繁琐代码,提高了开发效率。
c)除 MyBatis 持久化框架外,您还知道哪些持久化框架?并说明他们的特点。
①Hibernate: 开源的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。优点:非常优秀、成熟的 ORM 框架;完成对象的持久化操作;Hibernate 允许开发者采用面向对象的方式来操作关系数据库;消除那些针对特定数据库厂商的 SQL 代码。
②JPA:JPA本身只是一种ORM规范,并不是ORM 产品。JPA实体与Hibernate的POJO十分相似,最大优势在于是官方公布的Java EE规范标准,具有通用性。
③JDBCTemplate:优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务。缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存。
④iBatis:一个轻量级的框架和持久性API适合持久化的POJO。优点:简便、轻量级、支持存储过程、支持内嵌的SQL、支持动态SQL、支持O/RM。
⑤MyBatis:优点: 高效、支持动态、复杂的SQL构建, 支持与Spring整合和AOP事务、结果集做了轻量级Mapper封装、支持缓存。缺点:不支持数据库跨平台, 需要写SQL语句。
d) MyBatis 实现查询时,返回的结果集有几种常见的存储方式?请举例说明。
-
使用Map存储结果集。
任何select语句都可以用Map存储。
<select id="selectAllUser" resultType="map"> select * from user </select>
UserMapper接口中有方法,其中Map的key是select语句查询的字段名,value是查询返回结果的字段值,一条记录映射到一个Map对象中。
public List<Map<String, Object>> selectAllUser();
-
使用List存储结果集。
//返回一条记录map,key就是列名,值就是表中的值 Map<String,Object> getEmpByIdReturnMap(Integer id);
<!--如果返回的是map,resultType需要写map,mybatis为常用类起了别名--> <select id="getEmpByIdReturnMap" resultType="map"> SELECT id,last_name name,email,gender FROM tbl_employee WHERE id = #{id} </select>
-
使用POJO存储结果集。
User类
public class User{ private Long id; private String email; private String password; private String uname; public String getName() { return name; } public void setName(String name) { this.name = name; } private String gender; private LocalDate birthday; private LocalDateTime createTime; private String profilePhoto; }
UserMapper.xml
<resultMap type="com.buaa.po.User" id="myResult"> <!--子元素 <id> 用于表示哪个列是主键 --> <id property="id" column="id"/> <!--子元素 <result> 用于表示 POJO属性 和 SQL 列名的映射关系。 --> <result property="uname" column="name"/> </resultMap> <select id="selectAllUser" resultMap="myResult"> select id,name,url from User </select>
e) 在 MyBatis 中针对不同的数据库软件,元素如何将主键回填?
MySQL、SQL Server,自增主键 在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性
<!-- 添加一个用户,成功后将主键值回填给id(po类的属性)-->
<insert id="addUser" parameterType="com.buaa.po.User" keyProperty="id" useGeneratedKeys="true">
insert into user (uname,gender) values(#{uname},#{gender})
</insert>
Oracle,非自增主键,或者其他数据库取消了主键自增规则,则可以使用MyBatis的<selectKey>
标签自定义生成主键
<insert id="insertUser" parameterType="com.com.po.User">
<!-- 先使用selectKey元素定义主键,
如果主键为空,主键赋值为1,如果不为空,max(uid)+1(最大主键加1)
然后再定义SQL语句 -->
<selectKey keyProperty="id" resultType="Long" order="BEFORE">
select if(max(id) is null, 1 , max(id)+1) as newUid from user
</selectKey>
insert into user (id,uname,gender) values(#{id},#{uname},#{gender})
</insert>
f) 在 MyBatis 中,如何给 SQL 语句传递参数?
-
参数的传递使用#{参数名}
-
使用Map传递参数(使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,实际应用中我们应该果断废弃该方式。)
<!-- 根据name和url模糊查询网站信息 --> <select id="selectWebsiteByMap" resultType="net.biancheng.po.Website" parameterType="map"> SELECT id,NAME,url FROM website WHERE name LIKE CONCAT ('%',#{name},'%') AND url LIKE CONCAT ('%',#{url},'%') </select>
WebsiteMapper接口中
public List<Website> selectWebsiteByMap(Map<String, String> params);
-
使用注解传递参数(直观,参数个数小于5时是最佳的传参方式)
<!-- 根据name和url模糊查询网站信息 --> <select id="selectWebsiteByMap" resultType="net.biancheng.po.Website"> SELECT id,NAME,url FROM website WHERE name LIKE CONCAT ('%',#{name},'%') AND url LIKE CONCAT ('%',#{url},'%') </select>
WebsiteMapper接口中
public List<Website> selectWebsiteByMap(@Param("name") String name, @Param("url") String url);
-
使用JavaBean传递参数(当参数个数大于 5 个时,建议使用 JavaBean 方式)
<!-- 根据name和url模糊查询网站信息 --> <select id="selectWebsiteByAn" resultType="net.biancheng.po.Website" parameterType="net.biancheng.po.Website"> SELECT id,NAME,url FROM website WHERE name LIKE CONCAT ('%',#{name},'%') AND url LIKE CONCAT ('%',#{url},'%') </select>
WebsiteMapper 接口中方法如下
public List<Website> selectWebsiteByAn(Website website);
g) Maven 和 ANT 的区别
- Ant和Maven都是基于Java的构建(build)工具。
- Ant可以集成到开发环境中:由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
- 没有一个约定的目录结构
- 必须明确让ant做什么,什么时候做,然后编译,打包
- 没有生命周期,必须定义目标及其实现的任务序列
- Maven的除了以程序构建能力为特色之外,还提供高级项目管理工具。
- 使用Project Object Model来对软件项目管理;
- 内置了更多的隐式规则,使得构建文件更加简单;
- 内置依赖管理和Repository来实现依赖的管理和统一存储;
- 内置了软件构建的生命周期;
- 优点:
- 拥有约定,知道你的代码在哪里,放到哪里去
- 拥有一个生命周期,例如执行 mvn install就可以自动执行编译,测试,打包等构建过程
- 只需要定义一个pom.xml,把源码放到默认的目录,Maven帮忙处理其他事情;
- 拥有依赖管理,仓库管理 ;
h) 什么是 Spring Boot Stater ?
- Spring Boot Stater是springboot开发出的一系列启动器,在应用启动时,被加载,可以快速的处理应用所需要的一些基础环境配置。
- Spring Boot Starter的工作原理是:
- Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包
- 根据spring.factories配置加载AutoConfigure类
- 根据@Conditional注解的条件,进行自动配置并将Bean注入Spring Context
- 不同的starter作用不一致,在spring社区的维护下,演变出来很多作用的starter。
- spring-boot-starter:核心 starter,包括自动化配置支持,日志以及 YAML。
- spring-boot-starter-aop:Spring AOP 和 AspectJ 相关的切面编程 starter。
- spring-boot-starter-web:构建 restful、springMVC 的 web应用程序的 starter 等。
i) Springboot 如何集成 MyBatis?
-
pom.xml文件中引入mybatis依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency>
-
在application.yml配置文件中写入mybatis相关配置
mybatis: mapper-locations: classpath:/mapper/*.xml #注意:一定要对应mapper映射xml文件的所在路径 type-aliases-package: com.buaa.weblog.entity # 注意:对应实体类的路径
-
在resources的mapper文件夹下写相应的xml文件