什么是Mybatis?
Mybatis是一款优秀的持久层框架,用于简化JDBC开发
Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为Mybatis。2013年11也迁移到Github
官网:https://mybatis.org/mybatis-3/zh/index.html
持久层:
负责将数据保存到数据库的那一层代码
JavaEE三层架构:表现层、业务层、持久层。
框架:
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。
JDBC缺点:
1、硬编码 解决方法:配置文件
注册驱动
SQL语句
2、操作繁琐 解决方法:自动完成
手动设置参数
手动封装结果集
Mybatis免除了几乎所有JDBC代码以及设置参数和获取结果集的工作
解决SQL映射文件的警告提示:
产生原因:Idea和数据库没有建立连接,不识别表信息。
解决方式:在Idea中配置MySQL数据库连接。
使用Mapper代理方式完成入门案例
1、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下 (在resources文件夹下创建文件目录使用'/'作为分隔符
2、设置SQL映射文件的namespace属性为Mapper接口全限定名
3、在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4、编码
1、通过sqlSession的getMapper方法获取Mapper接口的代理对象
2、调用对应方法完成sql的执行
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
MybatisX插件:
MybatisX是一款基于IDEA的快速开发插件,为效率而生。
主要功能:
XML和接口方法相互跳转
根据接口方法生成statement
安装:
1、数据库字段名和实体类属性名不一致问题:
数据库的字段名称 和 实体类的属性名称不一样,则不能自动封装数据 *起别名: 对不一样的列名起别名,让别名和实体类的属性名一样 *缺点:每次查询都要定义一次别名 *sql片段 *不灵活 *resultMap 1、定义<resultMap>标签 2、在<select>标签中使用resultMap属性替换 resultType属性
sql片段 <sql id="brand_column">--> id, brand_name as brandName, company_name as companyName, ordered, description, status </sql> <select id="selectAll" resultType="Brand"> select <include refid="brand_column"/> from tb_brand; </select>
id:唯一标识 type:映射的类型,支持别名--> <resultMap id="brandResultMap" type="brand"> <!-- id:完成主键字段的映射 column:表的列名 property:实体类的属性名 result:完成一般字段的映射 --> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select>
2、参数问题:
<!-- *参数占位符 1、#{}:会将其替换为?,为了防止SQL注入 2、${}:拼sql,会存在SQL注入问题 3、使用时机: *参数传递的时候:#{} *表名或者列名不固定可以使用${},会存在SQL注入问题 *参数类型:parameterType: 可以省略 *特殊字符的处理方法: 1、转义字符 2、CDATA区:CD提示 -->
多个参数:
/** * 条件查询 * *参数接收 * 1、散装参数 如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”) * 2、对象参数 对象的属性名称需要和参数占位符名称一致 * 3、map集合参数 */
动态条件查询和动态单条件查询
<!-- 动态条件查询 * if:条件判断 * test: 逻辑表达式 * 问题: 当status没有输入值时,便会出错,sql语句where部分变成 where and xxx * 恒等式 * <where> 替换 where 关键字 -->
<select id="selectByConditionSingle" resultMap="brandResultMap"> select * from tb_brand where <choose> <!--相当于switch--> <when test="status != null"> <!--相当于case--> status = #{status} </when> <when test="companyName != null and companyName != ''"> <!--相当于case--> companyName like #{companyName} </when> <when test="brandName != null and brandName != ''"> <!--相当于case--> brandName like #{brandName} </when> <otherwise> <!--相当于default--> 1 = 1 </otherwise> </choose> </select>
Mybatis事务:
openSession():默认开启事务,进行增删改查操作后需要使用sqlSession.commit();手动提交事务;
openSession(true):可以设置为自动提交事务(关闭事务)
返回添加数据的主键
<insert useGeneratedKeys = "true" keyProperty = "id">
动态修改
使用<set>进行补正
批量删除
collection:需要循环的数组
item:数组中每个元素的名称
separator:每个数组元素之间的分隔符
open:开头元素之前的字符
close:结尾元素之后的字符
<delete id="deleteByIds"> delete from tb_brand where id in ( <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> ) </delete>
批量删除的小细节:
<!-- mybatis会将数组参数,封装成一个Map集合 * 默认: array = 数组 * 使用@Param注解改变map集合的默认key的名称 -->
Mybatis参数封装:
单个参数:
1、POJO类型:直接使用,属性名和参数占位符名称一致
2、Map集合:直接使用,键名和参数占位符名称一致
3、Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0", collection集合);
map.put("collection",collection集合);
4、List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0", list集合);
map.put("collection",list集合);
map.put("list",list集合);
5、Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0", 数组);
map.put("array",数组);
6、其他类型:直接使用
*多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中的默认arg键名
map.put("arg0",参数值1);
map.put("param1",参数值1);
map.put("arg1",参数值2);
map.put("param2",参数值2);
map.put("arg2",参数值3);
map.put("param3",参数值3);
建议:将来都是用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高!
注解开发适合简单功能,复杂功能不推荐注解。
查询:@Select
添加:@Insert
修改:@Update
删除:@Delete