MyBatis问答自测

8 篇文章 0 订阅

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对结果集的解析过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubWL5rVE-1657338056686)(img/2.问答题(15 分)_img/wps1.jpg)]

图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文件

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值