本博客主要针对基于SpringBoot集成的jpetstore中的MyBatis进行分析。注意若没有使用SpringBoot集成的MyBatis将比这复杂一些。下面博客将就如何实现MyBatis进行叙述。
在 基于Spring Boot的jpetstore项目分析(一)_by_一把健
中曾经描述过,本项目中persistence包中的接口与mapper文件夹下的xml映射文件为一一对应关系。
一、准备工作
首先创建项目工程时就要选择Spring初始化工具,让IntelliJ为我们做好初始化工作。
要实现映射关系,首先要在application.properties配置文件中添加如下语句
1.数据库连接
#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/mypetstore?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2.MyBaits映射文件位置
#MyBatis
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
然后需要在启动文件中的类前添加如下注解
@MapperScan("org.csu.mypetstorespring.persistence") // 扫描映射器
该注解的功能是扫描persistence中的接口,与映射文件即映射器进行对接。
二、MyBatis分析
下面将对persistence接口和xml映射文件做详细描述。
例子:AccountMapper接口和AccountMapper.xml
如果把SQL语句完全展示出来篇幅会过长,在此我们暂不关注SQL语句和注释。
AccountMapper接口一目了然,主要是对用户的增删改查,我们重点关注下AccountMapper.xml映射文件里面的内容。注意博主这里的AccountMapper.xml没有附加解释文件,当然没有解释文件其实更好一点,故里面的属性值均是完整包名,千万不要写错。
首先xml文件有文件头和唯一的根标签。
xml文件头指明当前xml使用版本为1.0(version=”1.0”),编码格式为UTF-8(encoding=”UTF-8”)。
根标签必须以
下面看根标签内的内容,首先我们关注下接口内的两个方法:
// 通过用户名得到用户
Account getAccountByUsername(String username);
// 通过用户名和密码得到用户
Account getAccountByUsernameAndPassword(Account account);
第一个方法是传入一个用户名得到用户信息(注册的时候会用到,查看用户名是否可用),第二个方法是传入一个用户对象得到用户信息(登录的时候会用到)。相应的,xml映射文件中针对每个方法也需要有对应的操作标签。
对应于增删改查的基础SQL操作,MyBatis提供四种标签对。
属性介绍:
id :是标签唯一的标识符,通常与接口中的方法相对应。
parameterType:传给此语句的参数的完整包名或者别名例:com.test.poso.User或user。
resultType :语句返回值的完整包名或者别名。
对于select需要有返回值,故有resultType属性,对于其他操作一般不需要resultType属性。
标签中的parameterType属性值更是与接口方法中的参数类型相对应。对于保留字的写法,MyBatis使用#{username} 的写法替换掉传统保留字 ? 。
下面对于方法
Account getAccountByUsernameAndPassword(Account account);
和该方法对应的标签内的内容进行分析。
仔细看可以注意到保留字为 #{username} 和#{password},即需要用户的用户名和密码,可是 parameterType 的值为Account类。注意这里MyBatis使用了依赖注入的方式。传入的是Account类的对象没错,但是MyBatis通过account对象中的属性username 和password的值自动注入到保留字#{username}和#{password}中,前提是若传入的是domain对象,domain领域对象中的成员变量的命名要和xml中保留字的命名一致。
即在传入多个参数时,需要先将参数封装成一个领域对象,通过依赖注入的方式填充对应保留字。
再举个insert的例子:
INSERT INTO ACCOUNT
(EMAIL, FIRSTNAME, LASTNAME, STATUS, ADDR1, ADDR2, CITY, STATE, ZIP, COUNTRY, PHONE, USERID)
VALUES
(#{email}, #{firstName}, #{lastName}, #{status}, #{address1}, #{address2,jdbcType=VARCHAR}, #{city}, #{state}, #{zip}, #{country}, #{phone}, #{username})
这其中有多项保留字,其名字与Account类中的成员变量名一致。
以上,是对基于SpringBoot集成的jpetstore中的MyBaits的实现的相关说明。