-
- 2.1. 加入maven依赖
- 2.2. 创建dao接口
- 2.3. 创建查询结果类
- 2.4. 创建mapper文件
- 2.5. 创建mybatis的主配置文件
- 2.6. 使用mybatis的对象SqlSession的方法
- 2.7. 使用mybatis的动态代理
-
- 8.1. where标签和if标签
- 8.2. foreach标签
mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1. j2ee三层架构
- 表现层(spring-mvc)
主要是JSP和HTML页面,用于接收du用户的zhi请求,以及返dao回操作数据,是应用专程序访问的入属口。 - 业务逻辑层service(spring)
主要是对数据层进行操作,对数据逻辑层进行处理,如果数据层是积木,那么逻辑层就是堆积木的搭建。 - 数据访问层dao(mybatis)
主要是对原始数据的操作层,具体为业务逻辑层或表现层提供数据服务。2. mybatis使用步骤
2.1. 加入maven依赖
在pom文件中加入mybatis的依赖
1 | <dependency> |
因为要mybatis是在dao层用来访问数据库的,所以也要加入mysql的依赖
1 | <dependency> |
2.2. 创建dao接口
创建一个dao包,在dao包中创建一个dao接口,例如在这里我创建了一个StudentDao接口,其中有两个方法,查询所有学生和插入学生
1 | public interface StudentDao { |
2.3. 创建查询结果类
查询结果学生类的属性应该和表中的列一一对应,类名推荐使用和表名一样的名称,每个对象相当于mysql表中的一行数据
1 | public class Student { |
mysql中的student表
2.4. 创建mapper文件
格式参考mybatis官网,mapper文件的名字要和dao接口的名字对应,一个接口对应一个mapper,将sql语句都定义在mapper文件当中。
1 |
|
其中命名空间namespace的属性为其所对应的dao接口的全限定名称,select这些标签的id要与dao接口中的方法名一致。
2.5. 创建mybatis的主配置文件
在resource目录下创建一个xml文件,在该文件中连接数据库和指定mapper文件的位置,格式如下:
1 |
|
其中mappers标签中可以直接指定mapper文件的位置,也可以指定包名,加载配置文件时会扫描包中的所有xml文件.使用package标签,name为 包名
1 | <mappers> |
注意:
- mysql的jar包版本不同,所对应的driver格式也不同,因为我使用的是最新版本的驱动,此处为com.mysql.cj.jdbc.Driver
- 如果运行时出现了如下错误:
java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
此时需要在url属性后添加如下字符串:?serverTimezone=UTC
2.6. 使用mybatis的对象SqlSession的方法
方法一,通过SqlSessionFactory对象来创建SqlSession对象,调用SqlSession对象的方法,指定要执行的语句的标识,格式为:sql映射文件(mapper)中的namespace+”.”+标签的id值
具体步骤如下
1 | public class MyApp { |
可以看见,方法一太过繁琐,而且dao接口似乎没用。因此大部分时间都是使用动态代理来访问数据库
2.7. 使用mybatis的动态代理
方法二是使用mybatis的动态代理,具体要求如下
通过一个例子来了解mybatis动态代理的使用,使用SqlSession对象的getMapper(dao.class)来获取dao接口的动态代理。
1 | public class AppTest |
MybatisUtils为我包装的工具类,因为前面大多数操作都相同,主要为获取SqlSession对象。下面为工具类的代码,通过一个静态块加载mybatis主配置文件。调用getSqlSession方法得到SqlSession对象,因此减少了重复的代码。
1 | /** |
mybatis的动态代理会生成到接口的代理类,其实现了dao接口的所有方法,通过使用得到的代理类来操作数据库。
注意:mybatis默认为不自动提交事务,因此在更新操作后需要调用sqlSession.commit()提交事务。如果需要mybatis自动提交事务,需要在创建SqlSession时将openSession()中的参数设为true
3. 两种占位符的使用
mybatis中有两种占位符,一个是’#’,一个是’$’。占位符可以用来表示参数或者对象的属性,在mybatis运行时会将其替代。
3.1. ‘#’占位符
1.当dao接口方法的参数为一个简单类型的参数时,#{任意字符}表示参数
dao接口
1 | public interface StudentDao { |
mapper文件,#{id}表示方法参数
1 | <select id="selectStudentById" resultType="com.hjznb.domain.Student" parameterType="int"> |
2.当方法参数为多个时,使用@Param(“参数的命名”)在方法参数前面指定参数的名称,在mapper文件中使用#{参数的命名}来获取指定参数。
1 | /* |
mapper文件
1 | <!--多个参数要使用@Param("名")来命名,mapper中用#{名}来指定参数--> |
3.参数为java对象时,在mapper文件中用 #{对象属性名} 来指定对象的属性
1 | /** |
mapper
1 | <!--多个参数,使用java对象属性值作为参数实际值 |
QueryParam类
1 | /** |
4.多个简单类型使用位置传参,从arg0开始
1 | /** |
mapper
1 | <!--多个简单类型位置传参,从arg0开始--> |
3.2. $ 占位符
$占位符使用的是字符串的拼接
1.和#{}类似,${}也可以用来指代方法中的参数
1 | /** |
1 | <select id="selectUse$" resultType="student"> |
需要注意:由于$使用的是字符串的拼接,因此要注意调用方法时传进去的字符串的格式,字符串需要写成”‘字符串’”的格式
1 |
|
2.$可以替换列名,因此可以用来替换诸如order by或者group by后面的语句,不会插入””
1 | /** |
1 | <!--返回值是一个对象,同名的列赋给同名的属性,使用resultMap--> |
如果此处使用#{}会报错
3.3. #和$的总结
4. 返回值的类型resultType
当sql语句的返回值为一行数据时,可以使用对应的java对象来代替返回结果
如Student类的一个对象代指为表中的一行数据,java对象的属性名要和表中的列名相对应,在mapper文件中sql标签中的resultType指定java对象的全限定名称,mybatis即可将查询出的数据变为java对象
1 | <!--此处返回值即为java对象--> |
当返回值为简单类型时,resultType属性值是什么呢?
mybatis给出了对应简单类型的别名,如int
1 | <!--返回值为简单类型int,int为Integer的别名--> |
具体参考mybatis官网,大多都有对应的别名,也可以使用全限定名称,如Integer的全限定名称。
如果返回类型为List<>,则resultType为List菱形括号内的属性类型
5. resultMap
resultMap,可以指定将查询结果赋值给哪个属性,并且可以复用
1 | <!-- |
然后就可以在sql标签中使用resultMap了,其中#{}中为resultMap中绑定的属性
当列名和属性名不一致时,可以使用resultMap,select标签中的resultMap的属性值是想要使用的resultMap所对应的id值
1 | <select id="selectMyStudents" resultMap="resultMap1"> |
或者可以通过将列名取别名来解决,将列名改为对应的属性名
1 | <select id="selectMyStudents" resultType="com.hjznb.domain.MyStudent"> |
6. useGeneratedKeys和keyProperty属性
在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名
1 | 对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。 |
1 | <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id"> |
Mybatis执行完插入语句后,自动将自增长值赋值给对象Payment的属性id。
7. LIKE模糊查询
在mybatis中使用like模糊查询,最好先将糊查询的语句提前写好,传进方法中
1 |
|
mapper文件
1 | <select id="selectLike" resultType="student"> |
8. 动态sql
常用的动态sql标签有< where > 、< if >、< foreach>
下面为测试的StudentDao
1 | public interface StudentDao { |
8.1. where标签和if标签
where标签经常和if标签搭配着使用
1 | <!--动态sql--> |
< if test = “” >< /if >该标签可以动态的插入sql语句,如果test中的表达式为真,就会插入标签中的语句
当test中使用java对象的属性值作为判断条件时,格式:属性=xxx值
if标签可能会出现一些语法错误,需要和where标签搭配着使用。
where标签可以检出where语句的最前面是否含有AND和一个空格 或者 or和一个空格 ,如果有的话删除。
在此处,如果第一个if标签的表达式为假,第二个表达式为真。此时如果没有使用where标签,而是使用where语句,那么就会变成如下sql
1 | select * from student where or age>#{age} |
如果使用了where标签,会对其进行优化,去掉where后的or
1 | select * from student where age>#{age} |
8.2. foreach标签
该标签可以用来遍历集合,会在sql语句中插入集合中元素指定的属性,下面的foreach标签将遍历结果的格式指定为以括号开头和结尾,集合中的元素用逗号分隔
1 | <!-- |
mybatis会将上面的语句翻译为如下sql语句,会将遍历出的元素插入到?中
1 | select * from student where id in ( ? , ? , ? ) |
例如下面这个例子
1 |
|
mybatis将1001,1002,1003替换掉语句中的‘?’,于是查询语句变为了
1 | select * from student where id in ( 1001 , 1002 , 1003 ) |
在foreach中也能访问java对象的属性,格式:item.属性名
foreach标签中的属性也可以不用指定,自己拼接
1 | <select id="selectForeachTwo" resultType="com.hjznb.domain.Student"> |
在这里没有指定查询结果以什么开始和结束,只是指定了元素之间用逗号分隔,括号由自己拼接。
其中的include标签为自己定义的sql片段sql1
1 | <!--定义sql片段,以后可以复用--> |
refid属性值为sql片段的id值,mybatis会用sql片段替换掉include标签,那么上面的语句会变成如下形式
1 | select * from student where id in ( |
9. springboot整合mybatis步骤
9.1. 注解版
- 导入pom依赖
1
2
3
4
5<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency> - 建表,创建实体类对象
- 创建dao接口,在类上面标@Mapper注解,表明这是一个mapper
1
2
3
4
5
6
public interface CityMapper {
City findByState(; String state)
} - 在接口中使用@Select注解(或其他),给其value属性赋值sql语句
1
2
3
4
City findByState(; String state) - 在配置文件application.yml中配置信息
1
2
3
4
5
6
7
8
9
10
11mybatis:
type-aliases-package: com.example.domain.model #使用别名
configuration:
map-underscore-to-camel-case: true #开启驼峰命名法
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源
driver-class-name: org.gjt.mm.mysql.Driver #驱动
url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456 - 在主配置类中使用MapperScan批量扫描所有的Mapper接口
1
2
3
4
5
6
7
8
public class SpringBoot06DataMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot06DataMybatisApplication.class, args);
}
}
*注意:如果想在mapper中使用其他属性,可使用@Options注解 *
1 |
|
9.2. 配置文件版
也可使用配置文件来配置mybatis
1 | mybatis: |
9.3. 混合开发
可使用配置文件和注解来开发: