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&characterEncoding=utf-8&useSSL=true&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就能定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点。
通知
-
通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。
目标对象
-
目标对象是指被插入切面的方法,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。