Mybatis基础

mybatis概述

什么是持久层

  • javaEE三层机构:表现层、业务层、持久层,而持久层就是负责将数据保存到数据库的那一层代码

什么是框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型

  • 在框架的基础构建软件编写更加高效、规范、通用、可扩展

mybatis介绍

  • mybatis是一款优秀的持久性框架,用于简化JDBC开发。它可以在实体类和sql语句之间建立映射关系,是一种半自动化的对象关系映射实现

  • mybatis的封装性要低于hibernate,但他性能优越、简单易学,在互联网的开发中被广泛使用

使用mybatis的好处

  • 实现了java代码和sql语句的分离

  • 自动将结构映射到java对象

  • 自动将java对象映射至sql语句

引入mybatis

1.引入依赖包

 <!-- MyBatis核心Jar包 -->
 <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.5.2</version>
 </dependency>
 <!-- MySql驱动 -->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.47</version>
 </dependency>

2.编写核心配置文件

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!--引入外部配置文件        -->
     <properties resource="db.properties"/>
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="${driver}"/>
                 <property name="url" value="${url}"/>
                 <property name="username" value="${username}"/>
                 <property name="password" value="${password}"/>
             </dataSource>
         </environment>
     </environments>
 ​
     <!-- 注册UserMapper.xml  -->
     <mappers>
         <mapper resource="cn/gbl/dao/UserMapper.xml"/>
     </mappers>
 </configuration>

3.连接测试

mybatis核心配置文件

介绍
  • 核心配置文件,主要配置了mybatis的运行环境等信息

  • 可以加载多个映射文件,每个映射文件对应了数据库的一张表

配置步骤

编写java属性文件
  • 文件里面编写mybatis的一些核心信息,包括用户名、密码等,文件名为db.properties

 driver = com.mysql.jdbc.Driver
 url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
 username = root
 password = 123456
编写mybatis-config.xml文件
  • 要在文件中引入编写properties文件

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!--引入外部配置文件        -->
     <properties resource="db.properties"/>
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="${driver}"/>
                 <property name="url" value="${url}"/>
                 <property name="username" value="${username}"/>
                 <property name="password" value="${password}"/>
             </dataSource>
         </environment>
     </environments>
 ​
     <!-- 加载sql映射文件,也就是写sql语句的文件 -->
     <mappers>
         <mapper resource="cn/gbl/dao/UserMapper.xml"/>
     </mappers>
 </configuration>

同时也可以在properties标签的子元素中编写核心信息

 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!-- 在properties的子元素property中配置-->
     <properties>
         <property name="driver" value="com.mysql.jdbc.Driver"/>
         <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=true&amp;serverTimezone=UTC"/>
         <property name="username" value="root"/>
         <property name="password" value="1234"/>
     </properties>
 ​
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="${driver}"/>
                 <property name="url" value="${url}"/>
                 <property name="username" value="${username}"/>
                 <property name="password" value="${password}"/>
             </dataSource>
         </environment>
     </environments>
 ​
     <!-- 加载sql映射文件,也就是写sql语句的文件 -->
     <mappers>
         <mapper resource="cn/gbl/dao/UserMapper.xml"/>
     </mappers>
 </configuration>
 ​

typeAliases元素

介绍
  • 类型别名是为Java类型设置一个短的名字。它只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余

语法

给实体类取别名,方便在mapper配置文件中使用

 <typeAliases>
         <typeAlias alias="user" type="cn.my.pojo.User" />
         <typeAlias alias="provider" type="cn.my.pojo.Provider" />
 </typeAliases>

这种写法的弊端在于如果一个项目中有多个POJO的时候,需要一一配置

通过package的name属性直接指定包名

 <typeAliases>
         <package name="com.study.pojo" />
 </typeAliases>

MyBatis会自动扫描指定包下的JavaBean,并默认设置一个别名,默认名称为JavaBean的非限定类名(首字母小写User --> user)

SQL映射文件

介绍
  • 编写具体的sql语句的文件

  • 一般都是命名为xxx.xml,与mapper层中xml文件名称相同,只不过文件位置不同,映射文件放置在resource目录下的同名的包下

语法
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.study.mapper.UserMapper">
     <select id="getStudent" parameterType="long" resultType="student">
         SELECT id,name,address FROM Student WHERE id =#{id}
     </select>
 </mapper>

其中namespace属性的值为这个映射文件的全限定名,也就是所在目录的全称。而select语句的id与mapper层中的方法名一样

如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配:

 <select id="selectUsers" resultType="User">
   select
     user_id             as "id",
     user_name           as "userName",
     hashed_password     as "hashedPassword"
   from some_table
   where id = #{id}
 </select>

改进,使用resultMap来显示的映射:

 <resultMap id="userResultMap" type="User">
   <id property="id" column="user_id" />
   <result property="username" column="user_name"/>
   <result property="password" column="hashed_password"/>
 </resultMap>

然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

 <select id="selectUsers" resultMap="userResultMap">
   select user_id, user_name, hashed_password
   from some_table
   where id = #{id}
 </select>

重要元素
resultType
介绍
  • resultType是MyBatis中的一个属性,用于指定单个简单类型(如基本数据类型、字符串等)或Java对象类型,以便将查询结果直接映射到相应的类型。resultType适用于简单的映射场景,当查询只返回一个基本类型或单个实体对象时使用

  • 只能在实体类和表字段对应一致的情况下才能使用

语法
 <select id="getUserCount" resultType="int">
     SELECT COUNT(*) FROM users
 </select>

resultType 和 resultMap 之间只能同时使用一个

resultMap
介绍
  • resultMap是MyBatis中的一个重要元素,用于定义如何将数据库查询结果的列映射到Java对象的属性上。通过resultMap,你可以精确地控制查询结果的映射逻辑,包括关联关系、嵌套查询等。

  • 一个resultMap通常由一系列result子元素组成,每个result元素定义了一个数据库列到Java属性的映射关系

  • 也就是在对应的字段不一致时使用

语法
 <resultMap id="userResultMap" type="User">
     <id property="id" column="user_id"/> <!--id专门设置主键的-->
     <result property="username" column="username"/> <!--前者是实体类的属性,后者对应的是数据表的字段,最好是将所有的对应关系都写出来-->
     <result property="email" column="email"/>
 </resultMap>

resultType 和 resultMap 之间只能同时使用一个

子元素

association

  • 用于定义关联对象的子元素,通常用于处理一对一关系

  • 子元素有:

    • property:映射Java对象的属性名,指定该属性将被映射到关联对象

    • javaType:指定关联对象的Java数据类型

    • slect:指定一个用于查询关联对象的<select>语句的ID

    • resultMap:指定另一个resultMap的ID,用于映射关联对象的查询结果

collection

  • 用于定义集合属性的子元素,通常用于处理一对多关系,它的属性和子元素与association类似,但可以包含一个额外的属性:

    • ofType:指定集合中元素的Java数据类型

  • 说白了就是一个对象里面再嵌套一个对象,这些元素是用来设置映射关系的

语法

 <resultMap id="authorResultMap" type="Author">
   <id property="id" column="author_id" />
   <result property="name" column="author_name" />
   <collection property="books" ofType="Book">
     <id property="id" column="book_id" />
     <result property="title" column="book_title" />
   </collection>
 </resultMap>

动态SQL

概念

  • 动态拼接SQL语句的功能,存在的意义是为了解决拼接SQL语句字符串时的痛点问题

类别

  • if

  • choose (when, otherwise)

  • trim (where, set)

  • foreach

if

作用
  • if标签可以通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之则不执行

语法
 <select id="findActiveBlogLike"
      resultType="Blog">
   SELECT * FROM BLOG WHERE state = ‘ACTIVE’
   <if test="title != null">
     AND title like #{title}
   </if>
   <if test="author != null and author.name != null">
     AND author_name like #{author.name}
   </if>
 </select>

Where

作用
  • 如果where标签中没有内容,那么sql语句中就不会生成where关键字,并且将内容前的and或or都消除

  • 但是不会去除where标签内and或or

语法
 <select id="findActiveBlogLike"
      resultType="Blog">
   SELECT * FROM BLOG
   <where>
     <if test="state != null">
          state = #{state}
     </if>
     <if test="title != null">
         AND title like #{title}
     </if>
     <if test="author != null and author.name != null">
         AND author_name like #{author.name}
     </if>
   </where>
 </select>

trim

作用
  • 如果where标签与你所想的不一致。那么可以使用trim标签来自定义where元素的功能

语法
 <trim prefix="WHERE" prefixOverrides="AND |OR ">
   ...
 </trim>
  • prefixOverrides属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的).

  • 上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。

属性
  • prifix/suffix:将trim标签中内容前面或后面添加指定内容

  • suffixOverrides/prefixOverrides:将trim标签中内容前面或后面去掉指定内

Set

作用
  • set 元素可以用于动态包含需要更新的列,忽略其它不更新的列

  • 动态的插入set关键字,并且删除额外的逗号

语法
 <update id="updateAuthorIfNecessary">
   update Author
     <set>
       <if test="username != null">username=#{username},</if>
       <if test="password != null">password=#{password},</if>
       <if test="email != null">email=#{email},</if>
       <if test="bio != null">bio=#{bio}</if>
     </set>
   where id=#{id}
 </update>

choose、when、otherwise

作用
  • 有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用

  • 这种情况我们可以使用choose元素,类似于switch语句。

语法
 <select id="findActiveBlogLike"
      resultType="Blog">
   SELECT * FROM BLOG WHERE state = ‘ACTIVE’
   <choose>
     <when test="title != null">
       AND title like #{title}
     </when>
     <when test="author != null and author.name != null">
       AND author_name like #{author.name}
     </when>
     <otherwise>
       AND featured = 1
     </otherwise>
   </choose>
 </select>

foreach

作用
  • 循环遍历

属性
collection
  • 要遍历的集合

item
  • 遍历出来的元素

separator
  • 分隔符,也就是遍历出来的元素中间用什么分隔

open
  • 遍历开始前拼接的sql片段

close
  • 遍历结束后拼接的sql片段

语法
     <delete id="test">
         delete from emp where id in
         <foreach collection="ids" item="id" separator="," open="(" close=")">
             #{id}
         </foreach>
     </delete>

mapper元素如何区分不同的xml文件

  • 在不同的映射文件中,mapper元素的id可以相同,mybatis可以根据namespace和子元素的id联合区分不同的xml文件

sqlSession对象

  • sqlsession是mybatis的另一个重要对象,起主要作用是执行持久化操作

  • 每一个线程都应该有一个自己的sqlsession实例,并且该实例不能被共享

  • sqlsession实例也是线程不安全的,因此其适用范围最好在一次请求或一个方法中

  • 使用完sqlsession对象之后,要及时关闭它,通常可以将其放在finally块中

mybatis关联映射

关联映射关系
  • 关系型数据库中,存在三种关联映射关系,分别是一对一、一对多、多对多关系

一对一查询
  • 关键元素:associatio元素

  • 属性

    property:用于指定映射到的实体类对象的属性,与表字段一一对应

    column:用于指定表中对应的字段

    fetchType:是否延迟加载,lazy和eager两个属性,默认值为lazy

一对多查询
  • 关键元素:collection元素

Spring框架

初识:
  • spring是一款轻量级的开源框架。核心理念是ioc(控制反转)和AOP(面向切面编程),其中,Ioc是spring的基础,支撑对javabean的管理。

优点:
  • spring是一种非入侵式框架

  • 降低组件之间的耦合性

  • 提供了AOP支持,可以将一些任务进行集中处理,如安全、事务和日志等,以减少传统的oop方法带来的代冗余和繁琐

  • 直接通过spring配置文件管理数据库,省去手动编程的繁琐,提高了开发效率

  • spring可以和struts、hibernate等框架契合

  • 降低了java EE API的使用难度

控制反转:
  • 取消了原有的通过了new关键字创建对象

依赖注入:
  • Ioc容器在运行期间动态的将某种依赖资源注入对象之中

  • 两种注入方式:构造方法注入,setter方法注入

容器管理

BeanFactory
  • 常用接口方法:

getBean(string name):根据参数获取Bean

Bean的配置
  • spring容器支持xml和properties两种格式的配置文件,常用的是xml格式的配置文件

  • xml配置文件的根元素为beans,包含了bean子元素,每一个bean元素可以定义一个Bean,通过bean元素注册到spring容器中

bean元素的属性
  • id:唯一标识

  • name:可以指定多个,每个之间用逗号或分号隔开

  • class:只当bean的具体实现路径,属性值为对象所属类的全路径

  • scope:用于指定作用范围,有singleton、prototype(原型)、request、seesion和global seesion

Spring AOP

概念:
  • 和oop不同,AOP主张将程序中相同的业务逻辑进行横向隔离,并将重复的业务逻辑抽取到一个独立的模块中,以达到提高程序可重用性和开发效率的目的

优势
  • 可以是开发人员在编写业务逻辑时可以专心于核心业务,而不用过多地关注其他业务逻辑的实现,不但提高了开发效率,又增强了代码的可维护性

切面(Aspect)
  • 切面是指关注点形成的类(关注点是指类中重复的代码)也就是将可重复的代码单独拿出来进行封装后形成的类

连接点
  • 在Spring AOP中,一个连接点通常是一个方法的执行。

切入点(Pointcut)
  • 当某个连接点满足预先指定的条件时,AOP就能定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点。

通知
  • 通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。

目标对象
  • 目标对象是指被插入切面的方法,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值