Java Mybatis 框架 II
1.Mybatis的基本使用
● 当使用Mybatis实现数据访问时,主要:
– 编写数据访问的抽象方法
– 配置抽象方法对应的SQL语
● 关于抽象方法:
– 必须定义在某个接口中,这样的接口通常使用Mapper作为名称的后缀,例如
AdminMapper – Mybatis框架底层将通过接口代理模式来实现 – 方法的返回值类型:
– 如果要执行的数据操作是增、删、改类型的,统一使用int作为返回值类型,表示“受影响的行数”,也可以使用void,但是不推荐
– 如果要执行的是查询操作,返回值类型只需要能够装载所需的数据即可
● 关于抽象方法:
– 方法的名称:自定义,不要重载,建议风格如下:
– 插入数据使用insert
作为方法名称中的前缀或关键字
– 删除数据使用delete
作为方法名称中的前缀或关键字
– 更新数据使用update
作为方法名称中的前缀或关键字
– 查询数据时:
如果是统计,使用count
作为方法名称中的前缀或关键字
如果是单个数据,使用get
或find
作为方法名称中的前缀或关键字
如果是列表,使用list
作为方法名称中的前缀或关键字
如果操作数据时有条件,可在以上前缀或关键字右侧添加by字段名
,例如deleteById
● 关于抽象方法:
– 方法的参数列表:取决于需要执行的SQL语句中有哪些参数,如果有多个参数,可将这些参数封装到同一个类型中,使用封装的类型作为方法的参数类型
● 假设当需要实现“插入一条管理员数据”,则需要执行的SQL语句大致是:
insert into ams_admin (username, password, nickname, avatar, phone,
email, description, is_enable, last_login_ip, login_count,
gmt_last_login, gmt_create, gmt_modified) values (?,?,? ... ?);
● 由于以上SQL语句中的参数数量较多,则应该将它们封装起来,则在
cn.tedu.mybatis包下创建Admin类,声明一系列的属性,对应以上各参
数值:
package cn.tedu.mybatis;
import java.time.LocalDateTime;
public class Admin {
private String username; private String password;
private String nickname; private String avatar;
private String phone; private String email;
private String description; private Integer isEnable;
private String lastLoginIp; private Integer loginCount;
private LocalDateTime gmtLastLogin; private LocalDateTime gmtCreate;
private LocalDateTime gmtModified;
// Setters & Getters // toString()
}
● 接下来,在cn.tedu.mybatis包下创建mapper.AdminMapper接口,并
在接口中添加“插入1条管理员数据”的抽象方法:
package cn.tedu.mybatis.mapper;
import cn.tedu.mybatis.Admin;
public interface AdminMapper {
int insert(Admin admin);
}
● 所有用于Mybatis处理数据的接口都必须被Mybatis识别,有2种做法:
– 在每个接口上添加@Mapper注解
– 【推荐】在配置类上添加@MapperScan注解,指定接口所在的根包
● 例如,在SpringConfig上添加配置@MapperScan:
@Configuration
@PropertySource("classpath:datasource.properties")
@MapperScan("cn.tedu.mybatis.mapper")
public class SpringConfig {
// ... ...
}
● 注意:因为Mybatis会扫描以上配置的包,并自动生成包中各接口中的代
理对象,所以,千万不要放其它接口文件
● 接下来,需要配置抽象方法对应的SQL语句,这些SQL语句推荐配置在
XML文件中
● 可以从 http://doc.canglaoshi.org/config/Mapper.xml.zip 下载到XML
文件。在项目的src/main/resources下创建mapper文件夹,并将下载得
到的XML文件复制到此文件夹中,重命名为AdminMapper.xml。
● 打开XML文件夹,进行配置(1/2):
● 打开XML文件夹,进行配置(2/2):
<?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属性用于配置此XML对应哪个接口 -->
<mapper namespace="cn.tedu.mybatis.mapper.AdminMapper">
<!-- 根据需要执行的SQL语句的种类选择需要配置的节点名称 -->
<!-- 配置SQL的节点的id属性取值为抽象方法名称 -->
<!-- 在节点内部配置SQL语句 -->
<!-- SQL语句中的参数值使用 #{} 格式的占位符表示 -->
<insert id="insert">
insert into ams_admin (
username, password, nickname, avatar,
phone, email, description, is_enable,
last_login_ip, login_count, gmt_last_login, gmt_create,
gmt_modified
) values (
#{username}, #{password}, #{nickname}, #{avatar},
#{phone}, #{email}, #{description}, #{isEnable},
#{lastLoginIp}, #{loginCount}, #{gmtLastLogin}, #{gmtCreate},
#{gmtModified}
)
</insert>
</mapper>
● 最后,还需要将DataSource配置给Mybatis框架,并且,为Mybatis配置
这些XML文件的路径,这2项配置都将通过配置SqlSessionFactoryBean
来完成
● 先在datasource.properties中补充一条配置:
mybatis.mapper-locations=classpath:mapper/AdminMapper.xml
● 然后在配置类中创建SqlSessionFactoryBean类型的对象:
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource,
@Value("${mybatis.mapper-locations}") Resource mapperLocations) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(mapperLocations);
return sqlSessionFactoryBean;
}
● 在测试类中补充测试方法,以检验是否可以通过调用AdminMapper的
insert()方法插入数据:
@Test
public void testInsert() {
AnnotationConfigApplicationContext ac
= new AnnotationConfigApplicationContext(SpringConfig.class);
AdminMapper adminMapper = ac.getBean(AdminMapper.class);
Admin admin = new Admin();
admin.setUsername("admin001");
admin.setPassword("12345678");
adminMapper.insert(admin);
ac.close();
}
2.获取新增的数据的自动编号的id
● 如果某数据的id是自动编号,当需要获取新增的数据的id时,需要先使得
插入的数据类型中有id对应的属性,则在Admin类中添加id属性:
public class Admin {
private Long id;
// 原有其它属性及Setter & Getter
// 补充id的Setter & Getter
// 重新生成toString()
}
● 接下来,在节点配置2个属性,分别是useGeneratedKeys和
keyProperty:
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
原有代码
</insert>
● 当配置完成后,Mybatis执行此插入数据的操作后,会将自动编号的id赋
值到参数Admin admin的id属性中,以上keyProperty指的就是将自动编
号的值放回到参数对象的哪个属性中!
3.删除数据
● 目标:根据id删除某一条数据
● 要实现此目标,需要执行的SQL语句大致是:
delete from ams_admin where id
● 在AdminMapper接口中添加抽象方法:
int deleteById(Long id);
● 在AdminMapper.xml中配置以上抽象方法映射的SQL语句:
<delete id="deleteById">
delete from ams_admin where id=#{id}
</delete>
● 编写并执行测试
@Test
public void testDeleteById() {
AnnotationConfigApplicationContext ac
= new AnnotationConfigApplicationContext(SpringConfig.class);
AdminMapper adminMapper = ac.getBean(AdminMapper.class);
Long id = 12L;
int rows = adminMapper.deleteById(id);
// System.out.println("删除完成,受影响的行数=" + rows);
if (rows == 1) {
System.out.println("删除成功");
} else {
System.out.println("删除失败,尝试删除的数据(id=" + id + ")不存在!");
}
ac.close();
}
修改数据
● 目标:根据id修改某一条数据的密码
● 要实现此目标,需要执行的SQL语句大致是:
update ams_admin set password=? where id=?
● 在AdminMapper接口中添加抽象方法:
int updatePasswordById(@Param("id") Long id,
@Param("password") String password)
● 提示:在默认情况下,当Java程序源代码(.java文件)经过编译后,所
有局部的量的名称都会丢失,为使得配置SQL语句时可根据指定的名称使
用方法中的参数值,需要在方法的各参数前添加@Param以指定名称
– 如果方法的参数只有1个,则可以不使用@Param指定名称,因为Mybatis可以直接
找到此参数的值
● 在AdminMapper.xml中配置以上抽象方法映射的SQL语句:
<update id="updatePasswordById">
update ams_admin set password=#{password} where id=#{id}
</update>
● 提示:以上占位符中的名称是通过@Param注解指定的名称,而不是抽象
方法的参数名称
● 编写并执行测试:
@Test
public void testUpdatePasswordById() {
AnnotationConfigApplicationContext ac
= new AnnotationConfigApplicationContext(SpringConfig.class);
AdminMapper adminMapper = ac.getBean(AdminMapper.class);
Long id = 12L;
String password = "000000";
int rows = adminMapper.updatePasswordById(id, password);
if (rows == 1) {
System.out.println("修改密码成功");
} else {
System.out.println("修改密码失败,尝试访问的数据(id=" + id + ")不存在!");
}
ac.close();
}