一、搭建环境
1.引入jar包
mysql.jar
mybatis.jar
2.补全结构
com.hl.pojo
com.hl.mapper
mybatis-config.xml
sqlMapper.xml
3.测试类
加载myabtis核心配置文件,得到IO流 Resources
创建sqlSessionFactory SqlsessionFactoryBuilder
SqlSession session = sqlSessionFactory.openSession()
//获取mapper接口
调用mapper方法
//关闭流
二、核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--配置-->
<configuration>
<!--引入外部配置文件-->
<properties resource="db.properties"></properties>
<!--设置-->
<settings>
<!--下划线到驼峰式命名法自动映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--类型起别名-->
<typeAliases>
<!--type="类型" alias="别名"-->
<!--针对每一个javabean分别起别名-->
<!-- <typeAlias type="com.hl.mybatis02.pojo.Student" alias="student"></typeAlias>-->
<!--统一起别名 别名默认为类名 不区分大小写-->
<package name="com.hl.mybatis02.pojo" />
</typeAliases>
<!--数据库环境-->
<environments default="dev">
<environment id="dev">
<transactionManager type="jdbc"></transactionManager>
<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>
<!--mappers映射器-->
<mappers>
<!--sqlMapper文件位置-->
<!-- <mapper resource="com/hl/mybatis02/mapper/GoodsMapper.xml"></mapper>-->
<!--指向mapper接口位置-->
<!-- <mapper class="com.hl.mybatis02.mapper.GoodsMapper"></mapper>-->
<!-- <mapper class="com.hl.mybatis02.mapper.ItemMapper"></mapper>-->
<!--指向mapper包的位置,统一扫描该包下所有接口-->
<package name="com.hl.mybatis02.mapper"/>
</mappers>
</configuration>
三、核心类(测试类)
四、缓存机制
缓存:多次执行相同dql,第一次走数据库表查询,第二次不再执行sql语句,直接从缓存区中获取数据。
4.1一级缓存
默认已开启,可以直接使用,属于sqlSession级别的缓存。
4.2二级缓存
默认没有开启,需要手动在mybatis配置文件中开启,属于sqlSessionFactory级别的缓存。
<!--开启当前命名空间的二级缓存-->
<cache></cache>
4.3清理缓存
java代码清理缓存
session.clearCache();
sqlMapper文件清理缓存
<!-- //查询 下划线到驼峰式命名法的映射-->
<!-- public List<Student> listAll();
useCache="false" 禁用当前sql语句的二级缓存
flushCache="true" 清空缓存区数据 导致一级缓存和二级缓存失效
-->
<select id="listAll" resultType="student" useCache="false">
select * from student
</select>
五、sqlMapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间 唯一标识-->
<mapper namespace="com.hl.mybatis02.mapper.StudentMapper">
<!-- 测试自增主键的生成
useGeneratedKeys="true" 获取自动生成的主键
keyProperty="studentId" 主键对应的属性名
-->
<!-- public int insertStudent(Student student);-->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="studentId">
insert into student(name,gender,birth_date,class_id,enrollment_date)
values (#{name},#{gender},#{birthDate},#{classId},now())
</insert>
<!-- //查询 下划线到驼峰式命名法的映射-->
<!-- public List<Student> listAll(); -->
<select id="listAll" resultType="student">
select * from student
</select>
</mapper>
六、单参数传递和多参数
//测试自增主键的生成
public int insertStudent(@Param("stu") Student student);
//查询 下划线到驼峰式命名法的映射
public List<Student> listAll();
//多个参数
public List<Student> findStudents(@Param("name") String name,
@Param("phone") String phone);
//单个参数
public Student findStudentById(@Param("id") int id);
<!--命名空间 唯一标识-->
<mapper namespace="com.hl.mybatis02.mapper.StudentMapper">
<!-- 测试自增主键的生成
useGeneratedKeys="true" 获取自动生成的主键
keyProperty="studentId" 主键对应的属性名
-->
<!-- public int insertStudent(Student student);-->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="studentId">
insert into student(name,gender,birth_date,class_id,enrollment_date)
values (#{stu.name},#{stu.gender},#{stu.birthDate},#{stu.classId},now())
</insert>
<!-- //查询 下划线到驼峰式命名法的映射-->
<!-- public List<Student> listAll(); -->
<select id="listAll" resultType="student">
select * from student
</select>
<!-- //多个参数
public List<Student> findStudents(String name,String phone);
-->
<select id="findStudents" resultType="Student">
select * from student where name=#{name} and phone=#{phone}
</select>
<!--public Student findStudentById(int id);-->
<select id="findStudentById" resultType="Student">
select * from student where student_id=#{id}
</select>
</mapper>
七、mybatis中Statement和preparedStatement
statementType="PREPARED" 默认 使用预编译 STATEMENT sql字符串拼接 CALLABLE 调用存储过程
<!-- //多个参数
public List<Student> findStudents(String name,String phone);
statementType="PREPARED" 默认 使用预编译
STATEMENT sql字符串拼接
CALLABLE 调用存储过程
-->
<select id="findStudents" resultType="Student">
select * from student where name like concat('%',#{name},'%') or phone=#{phone}
</select>
<!--public Student findStudentById(int id);-->
<select id="findStudentById" resultType="Student" statementType="STATEMENT">
select * from student where student_id=${id}
</select>
作业
1、掌握环境搭建
步骤 | 操作 | 说明 |
---|---|---|
1 | 添加依赖 | <dependency> 中加入 mybatis 和数据库驱动 |
2 | 创建配置文件 | mybatis-config.xml 配置数据源和映射文件 |
3 | 创建映射文件 | XXXMapper.xml 定义SQL语句 |
4 | 创建实体类 | 与数据库表对应的POJO类 |
5 | 创建SqlSessionFactory | 通过配置文件构建 |
6 | 获取SqlSession | 通过工厂实例获取会话 |
MyBatis环境搭建首先需要引入核心依赖,包括MyBatis框架和对应的数据库驱动。然后创建mybatis-config.xml配置文件来设置数据源、事务管理器和Mapper文件位置。接着定义实体类和Mapper接口,并为每个Mapper接口编写XML映射文件来配置SQL语句和结果映射。最后通过SqlSessionFactoryBuilder构建SqlSessionFactory,就可以获取SqlSession执行数据库操作了。
2、掌握单个参数、多个参数的增删改查
参数类型 | 示例 | 说明 |
---|---|---|
单个基本类型 | @Param("id") int id |
可直接用#{id}引用 |
多个参数 | (String name, int age) |
需用@Param或param1/param2 |
POJO对象 | User user |
直接使用属性名#{userName} |
Map集合 | Map<String,Object> |
使用key值#{name} |
集合/数组 | List<Integer> ids |
使用foreach遍历 |
对于增删改查操作,单个参数直接在XML中使用#{}引用即可。多个参数建议使用@Param注解明确指定参数名,或者在接口方法中使用Map作为参数传递。增删改查分别对应insert、delete、update和select标签,需要注意正确设置参数类型和返回类型。
3、缓存机制 (一级、二级缓存特点)
MyBatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,默认开启,同一个SqlSession中相同的查询会直接从缓存返回结果。二级缓存是Mapper级别的,需要手动开启,多个SqlSession可以共享,适用于读多写少的场景,但要注意数据一致性问题。
4、mybatis核心配置文件 常见的配置项
mybatis-config.xml是核心配置文件,主要配置数据源信息、类型别名、全局设置和映射器注册。这些配置为MyBatis运行提供了基础环境和默认行为。
5、#和$的区别?(重点)
区别点 | #(占位符) | $(拼接符) |
---|---|---|
处理方式 | 预编译处理,防止SQL注入 | 字符串替换,直接拼接到SQL中 |
参数类型 | 自动添加引号(字符串) | 原样输出,不添加引号 |
安全性 | 高 | 低,有SQL注入风险 |
使用场景 | 参数值传递 | 动态表名、列名等非参数值场景 |
性能 | 高(预编译SQL可重用) | 低(每次SQL都不同) |
#和$的主要区别在于处理方式。#采用预编译处理,能防止SQL注入,适合传递参数值;$是直接字符串替换,有SQL注入风险,一般用于动态表名、列名等非参数值场景。实际开发中应该优先使用#。
6、sqlMapper文件新增返回自增主键
<!--useGeneratedKeys="true" 获取自动生成的主键
keyProperty="studentId" 主键对应的属性名-->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="studentId">
insert into student(name,gender,birth_date,class_id,enrollment_date)
values (#{name},#{gender},#{birthDate},#{classId},now())
</insert>