MyBatis 基础
MyBatis 是一个持久层半自动 ORM 框架,用来简化 JDBC 代码
- 数据持久化:
把内存中的数据保存到硬盘上
系统架构中用来做数据持久化的代码叫做持久层(dao)
- ORM:
Object Relationship Mapping:对象关系映射
通过配置来实现 model 和 数据库记录之间的相互转换,
在这个过程中不用编写 JDBC 代码
- MyBatis 的使用:
1. 创建 maven 项目
2. 引入 mybatis 和 mysql 依赖
3. 创建并编辑 mybatis-config.xml 配置文件
1. 复制粘贴官网的模板内容
2. 修改数据库连接的 4 个配置
3. 修改 SQL 配置文件路径为 UserMapper.xml
4. 创建 User model 类,属性名和数据库字段名保持一致
5. 创建 UserDao 接口,声明数据库操作方法
ArrayList<User> findAll();
User findByAccount(String account);
6. 创建并编辑 UserMapper.xml 代替以前的 UserDaoImpl
1. 复制官方模板
<?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="">
</mapper>
2. 一个配置文件对应于一个 Dao 接口
通过 namespace 设置接口的全名进行绑定
3. 在 mapper 标签内部编写每个方法用到的 SQL 语句
<select></select> 用于编写查询语句
通过 id 设置对应的方法名,绑定 SQL 和方法
通过 resultType 设置方法返回数据的类型全名
如果返回值是集合,只需要配置集合中存储的类全名即可
<select id="findAll" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user;
</select>
4. 创建 Application 使用 mybatis
// 1. 读取配置文件,Reader 导 io 包,Resources 导 ibatis 包,捕获异常
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
// 2. 解析配置文件
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
// 3. 获取执行 SQL 语句的 session 对象
SqlSession session = factory.openSession();
// 4. 从 session 获取 dao 对象
UserDao userDao = session.getMapper(UserDao.class);
// 5. 调用 dao 中的方法
ArrayList<User> users = userDao.findAll();
- 注意事项:
mybatis-config.xml
1. xml 中是 & 表示 & 符号
2. mapper 的路径从 resources 文件夹开始算
UserMapper.xml
namespace, id, resultType 复制粘贴,拒绝手写
Model 类:
属性名要和字段名保持一致
model 和表的关联默认靠的是名字一致,
如果不一致还需要进行其它配置才能关联
SQL 参数可以使用 #{} 或 ${} 区别在于
#{} 自动为字符串添加 ""
${} 不会为字符串添加 ""
SQL 单参数赋值方案:
#{_parameter} 表示参数
<select id="findByAccount" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user WHERE account=#{_parameter};
</select>
SQL 多参数赋值方案:
方案1:通过参数的索引进行赋值:param1, param2
User findByAccountAndPassword(String account, String password);
<select id="findAllByPageAndSize" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user LIMIT #{param1}, #{param2};
</select>
方案2:把参数封装到 model 类,通过属性名字赋值
ArrayList<User> findByAccountOrPassword(User user);
<select id="findByAccountOrPassword" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user WHERE account=#{account} OR password=#{password};
</select>
- 增删改:
<insert></insert>
<update></update>
<delete></delete>
增删改默认是在事务中执行的,只有提交了事务,修改才能数据库生效
session.commit();
- 动态 SQL:
if:表示判断
<select id="findAllByPasswordLike" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user
<if test="_parameter != null">
WHERE password LIKE #{_parameter}
</if>
;
</select>
where:封装查询条件
1. 只有有条件的时候才会添加 where 关键字
2. 消除多余的 AND/OR
<select id="findAllByAccountAndPasswordLike" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user
<where>
<if test="account != null">
AND account LIKE #{account}
</if>
<if test="password != null">
AND password LIKE #{password}
</if>
</where>
;
</select>
set:封装更新字段,只更新不为 null 字段的值
1. 添加 SET 关键字
2. 消除多余的 ,
<update id="update">
UPDATE user
<set>
<if test="account != null">
account=#{account},
</if>
<if test="password != null">
password=#{password},
</if>
</set>
WHERE id=#{id};
</update>
foreach:
通常用在 in 条件后,遍历集合并拼接内容,生成查询条件
<select id="findAllByIds" resultType="com.zhiyou100.model.User">
SELECT id, account, password FROM user WHERE id IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
;
</select>
遍历集合,拼接的内容为 (1,2,3,4)
图解如下: