入门_MyBatis中文网
(Mybatis.pdf)
什么是Mybatis?
- Mybatis是一款优秀的持久层框架,用于简化JDBC开发
- 官网:https://mybatis.org/mybatis-3/zh/index.html
持久层:
负责将数据保存到数据库的那一层代码
JavaEE三层架构:表现层,业务层,持久层
框架:
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
快速入门
JDBC写的是硬编码,后期维护很麻烦,无论是增删改查语句的修改,或者是用户名密码的改变,
MyBatis虽然麻烦,不过很多步骤只做一次,后期维护非常的方便
解决SQL映射文件的警告提示
产生原因:IDEA和数据库没有建立连接,不识别表信息
解决方法:在IDEA中配置MySQL数据库连接
Mapper代理开发
目的
1.解决原生方式中的硬编码
2.简化后期执行SQL
步骤
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
3.在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4.编码
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
细节
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<mappers> <!-- 加载sql映射文件--> <!-- <mapper resource="UserMapper.xml"/>--> <!-- Mapper代理方式--> <package name="com.itheima.mapper"/> </mappers>
Mybatis核心配置文件详解
注解完成增删改查
注解即在接口方法上直接写SQL语句,不用在xml文件中再配置
配置文件完成增删改查
起别名
定义<sql>片段
定义<resultMap>片段
注意事项
- 参数占位符
#{}: 执行SQL时,会将#{}占位符替换为?,将来自动设置参数值
${}: 拼SQL。会存在SQL注入问题
使用时机:
参数传递,都是用#{}
如果要对表名,列名进行动态设置,只能使用${}进行sql拼接
2.parameterType
用于设置参数类型,该参数可以省略
3.SQL语句中特殊字符处理
转义字符
<![CDATA[内容]]>
动态SQL
if标签:用于判断参数是否有值,使用test属性进行条件判断
存在的问题:第一个条件不需要逻辑运算符
解决方案:
使用恒等式让所有条件格式都一样
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where 1 = 1 <if test="status != null">and status = #{status}</if> <if test="companyName != null and companyName != ''">and company_name like #{companyName</if> <if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if> </select>
<where>标签替换where关键字
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand <where> <if test="status != null"> status = #{status}</if> <if test="companyName != null and companyName != ''">and company_name like #{companyName</if> <if test="brandName != null and brandName != ''">and brand_name like #{brandName}</if></where> </select>
事务提交
自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
手动提交
SqlSession sqlSession = sqlSessionFactory.openSession();
或
SqlSession sqlSession = sqlSessionFactory.openSession(false);
事务后写sqlSession.commit();
返回添加数据的主键
<insert useGeneratedKeys = "true" keyProperty = "id">
上图(批量删除) 如果接口方法未加param注解,collection属性的值应该为array
参数传递
参数封装
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("param2",参数值2)
map.put("agr1",参数值2)
---------------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)
使用中出现的问题(注意)
- 不加@Param注解,取值的时候直接写属性
public void addUser(User user);
<insert id="addUser" parameterType="com.xxxx.mybatis.entity.User">
insert into user(id,user_name,name,birthday,age)
values (#{id},#{userName},#{name},#{birthday},#{age})
</insert>
- 加了@Param注解,取值必须使用对象.属性的方式
public void addUser(@Param("user") User user);
<insert id="addUser" parameterType="com.xxxx.mybatis.entity.User">
insert into user(id,user_name,name,birthday,age)
values (#{user.id},#{user.userName},#{user.name},#{user.birthday},#{user.age})
</insert>