目录
什么是MyBatis?
MyBatis实现的设想
MyBatis基于配置文件的开发步骤
mybatis的配置文件
Mapper代理开发
配置文件完成增删改查的三步
注解开发
一、条件查询
参数接收时,参数的设置:
动态条件查询:
二、添加功能
步骤:
Mybatis事务:
返回添加数据的主键:
三、修改功能
四、删除功能
参数传递
单个参数:
多个参数
mybatis常见问题
学习资料:
01-MyBatis简介_哔哩哔哩_bilibili
什么是MyBatis?
- MyBatis是一款持久层框架
- MyBatis是半自动的ORM框架,开发时,需要手动编写SQL语句
- 相比JDBC,MyBatis提供了输入映射和输出映射,便于进行SQL参数设置,以及结果集封装。并且还提供了关联查询和动态SQL等功能,极大地提高了开发的效率。
MyBatis实现的设想
- 使用数据库连接池管理数据库连接
- 将sql语句及占位符号和参数全部配置在xml中
- 将查询的结果集自动映射成java对象
MyBatis基于配置文件的开发步骤
- 编写全局配置文件configuration
- 编写mapper映射文件,mapper.xml,书写SQL,并定义好SQL的输入、输出参数
- 加载全局配置文件,生成SqlSessionFactory
- 创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作
优点:
- 相较于基于注解的开发,用配置文件更方便后续代码的维护
mybatis的配置文件
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAllases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
<configuration>
<!--全局配置文件的配置顺序如下
properties //引入放置了数据源信息的properties文件
settings //用来开启或关闭mybatis的一些特性
typeAliases //配置SQL语句的输入、输出参数细节要求等
typeHandlers //用来处理java类型和jdbc类型之间的转换
objectFactory //用于创建对象实例,用得少
plugins //用来配置mybatis的插件
environments //用来配置数据源
environment
transactionManager
dataSource
mappers
-->
</configuration>
Mapper代理开发
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。接口和配置文件分开放,但包目录结构是一样的
- 设置SQL映射文件中的namespace属性为Mapper接口全限定名
- 在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句中的id,并保持参数类型和返回值类型一致
- 编码:
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
//获取接口代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //执行方法,即执行sql语句 List<User> users=userMapper.selectAll();
配置文件完成增删改查的三步
- 编写接口方法
- 编写SQL
- 执行方法
注解开发
- 注解用于完成简单功能;配置文件用于完成复杂功能
- 常用注解:
- 查询:@Select
- 添加:@Insert
- 修改:@Update
- 删除: @Delete
@Select("select * from tb_user where id=#{id}") public User selectById(int id); //不用写xml文件了
一、条件查询
参数接收时,参数的设置:
- 散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称")
- 对象参数:对象的属性名称要和参数占位符名称一致
- map集合:SQL中的参数名要和map集合的键的名称一致
动态条件查询:
- if:用于判断参数是否有值
- test:逻辑表达式,进行条件判断
- 存在的问题:由于条件数目变化,where可能会和and连接,构成语句错误
- 解决法一:使用恒等式
- 解决法二:使用<where>标签替换where关键字
二、添加功能
步骤:
- 1、编写接口方法:Mapper接口
void add(Brand brand);
- 2、编写SQL语句:SQL映射文件
<insert id="add"> insert into tb_brand(brand_name,company_name,ordered,description,status) values(#{brandName},#{companyName},#{ordered},#{description},#{status}); </insert>
- 3、执行方法,测试
Mybatis事务:
- 1、openSession():默认开启事务,需要使用sqlSession.commit();手动提交事务
- 2、openSession(true):自动提交事务
返回添加数据的主键:
- 1、添加两个属性
2、。。。
三、修改功能
- 普通修改和动态修改
- 步骤:
- 1、编写接口方法:Mapper接口
void update(Brand brand);
- 2、编写SQL语句:SQL映射文件
<update id="update"> update tb_brand; <set> <if test="brandName !=null and brandName !=''"> brand_name=#{brandName}, </if> <if test="companyName !=null and companyName !=''"> companyName=#{companyName}, </if> <if test="ordered !=null"> ordered=#{ordered}, </if> <if test="description !=null and description !=''"> description=#{description}, </if> <if test="status !=null"> status=#{status} </if> </set> where id=#{id}; </update>
- 3、执行方法,测试
四、删除功能
- 删除单个和批量删除
- 步骤:
- 1、编写接口方法:Mapper接口
void deleteByIds(@Param("ids") int[] ids);
- 2、编写SQL语句:SQL映射文件
<delete id="deleteByIds"> delete from tb_brand where id in ( <foreach collection="ids" item="id" separator=","> #{id} </foreach> ); </delete> <!-- mybatis会将数组参数封装为一个Map集合,所以需要foreach来遍历 1、默认:array=数组 2、使用@Param注解来改变map集合的默认key的名称 -->
- 3、执行方法、测试
参数传递
- Mybatis接口方法对 接收到的不同的参数 用ParamNameResolver类 进行 不同的封装处理
单个参数:
- 1、POJO类型:直接使用,属性名和参数占位符名称一致
- 2、Map集合:直接使用,键名和参数占位符名称一致
- 3、Collection:封装成Map集合
- map.put("arg0",collection集合);
- map.put("collection",collection集合);
- 4、List:封装成Map集合
- map.put("arg0",list集合);
- map.put("collection",list集合);
- map.put("list",list集合);
- 5、Array:封装成Map集合
- map.put("arg0",数组);
- map.put("array",数组);
- 6、其他类型
多个参数
封装成Map集合
User select(@Param("username")String username,String password);
封装成Map集合后,建议使用@Param注解,替换Map集合中默认的键名,并使用修改后的名称来获取值,提高可读性
mybatis常见问题
- SQL映射文件的警告,无法识别表信息
- 解决:在idea中配置mysql数据库连接
- 实体类属性名和数据库表列名不一致,不能自动封装数据
- 解决:使用<resultMap>
- 使用参数占位符${}时,会存在sql注入问题
- 解决:使用#{}
- SQL语句中的特殊字符报错,比如"<"
- 解决:使用转义字符,比如"<"表示"<"