- MyBatis的综合案例
- 环境搭建
- 创建表tb_brand
- CREATE TABLE tb_brand ( -- id 主键 id INT PRIMARY KEY AUTO_INCREMENT, -- 品牌名称 brand_name VARCHAR(20), -- 企业名称 company_name VARCHAR(20), -- 排序字段 ordered INT, -- 描述信息 description VARCHAR(100), -- 状态:0:禁用 1:启用 STATUS INT );
- mysql命名规范
- 不区分大小写
- 如果有多个单词,单词之间使用下划线分隔
- brand_name
- Java命名规范
- 区分大小写
- 如果有多个单词,使用驼峰命名法
- brandName
- mybatis中默认情况下,表字段名与实体类的名要一致才会自动封装数据
- 可选:使用idea做为客户端
- 安装mybatisX插件
- 创建表tb_brand
- 会话工具类
- 一个项目中只需要一个工厂类
- 每次访问数据库都必须创建新的会话,并且会话对象不能共享
- package com.itheima.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /** * 会话工厂类 */ public class MyBatisUtils { private static SqlSessionFactory factory; static { //1.获取核心配置文件的输入流 InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); } catch (IOException e) { e.printStackTrace(); } //2.创建工厂建造类 SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder(); //3.创建工厂类 (一个项目中只需要一个工厂类) factory = factoryBuilder.build(inputStream); } /** * 获取会话对象 */ public static SqlSession getSession() { //4.从工厂类中获取会话对象 (每次访问数据库都必须创建新的会话,并且会话对象不能共享) return factory.openSession(); } }
- 查询操作
- 查询所有记录
- BrandMapper接口
- List<Brand> selectAll()
- BrandMapper.xml实体类映射配置文件
- <select id="selectAll" resultType="brand"> select * from tb_brand </select>
- 表中字段名与实体类的属性名不同的解决方法
- 1. 给字段名取别名,让别外与实体类的属性名相同 (下面定义别名省略了as) select id,brand_name brandName, company_name companyName, ordered, description, status from tb_brand
- 2. 手动创建表的字段名与实体类的属性名之间的映射关系 1) 使用resultMap创建映射关系 2) 查询结果使用resultMap,而不是resultType(指定返回元素类型)
- <!-- resultMap作用:创建表字段名与实体类属性名之间的映射关系 属性名: id:映射的唯一标识 type:对应的实体类的名字,可以使用类全名也可以使用别名 子标签: <id>:映射表的主键 column:表中主键字段名 property指定实体类的属性名 <result>:映射表中其它的字段 通常只需要映射名字不同的字段 --> <resultMap id="brandMap" type="com.itheima.pojo.Brand"> <id column="id" property="id"/> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="findAll" resultMap="brandMap"> select * from tb_brand </select>
- 3. 只需要在核心配置文件中指定:将下划线映射成驼峰命名法
- 在mybatis-config.xml中指定:<setting name="mapUnderscoreToCamelCase" value="true"/>
- 常见错误
- org.apache.ibatis.binding.BindingException: Type interface com.itheima.mapper.BrandMapper is not known to the MapperRegistry.
- 解决思路
- 原因:接口与映射配置文件对不上
- 1. 接口文件名与映射文件名是否相同
- 2. 包结构com.itheima.mapper是否一样
- 3. resources下目录使用/创建,而不是点号
- 4. 接口中方法名与配置文件中id是否一样
- 5. 核心配置文件中包名:<package name="com.itheima.mapper"/> 是否正确
- 6. 映射文件中namespace="com.itheima.mapper.BrandMapper"是否正确
- BrandMapper接口
- 查询一条记录
- 接口
- Brand selectById(Integer id)
- 配置文件
- <select id="selectById" resultType="brand"> select * from tb_brand where id=#{id} </select>
- 占位符两种写法
- #{变量名} 底层使用是PreparedStatement,替换占位符
- ${变量名} 底层使用的是Statement,采用字符串拼接的方式,有SQL注入问题
- 接口
- 多条件查询
- 字符串前后加%,拼接问题
- 使用函数拼接字符串
- SELECT CONCAT('a','b','c')
- 前面使用双引号,中间使用单引号
- SELECT "a"'b'"c"
- SQL语句写法
- SELECT * FROM tb_brand WHERE `status`=1 AND brand_name LIKE "%"'米'"%" AND company_name LIKE "%"'公司'"%"
- 使用函数拼接字符串
- 接口
- 方式1:使用多个参数
- 如果有多个参数,必须使用@Param("参数名")指定参数名字,用在配置文件中:#{参数名}
- List<Brand> selectByCondition(@Param("status")Integer status, @Param("brandName")String brandName, @Param("companyName")String companyName);
- 方式2:实体类封装参数
- 只要一个实体类封装所有的属性值
- List<Brand> selectByCondition(Brand brand);
- 方式3:使用Map封装多个参数
- HashMap<String, Object> condition = new HashMap<>(); condition.put("status", 1); condition.put("brandName", "米"); condition.put("companyName", "公司");
- List<Brand> selectByCondition(Map<String,Object> condition)
- mybatis方法重载的问题:
- 在mybatis中不允许出现方法的重载,即同名的方法不能出现2次,否则会出现以下异常
- Mapped Statements collection already contains value for 包名.接口.方法名
- 方式1:使用多个参数
- 配置文件
- if标签作用
- 判断表达式的值是否为真,如果为真则拼接SQL语句
- 如果是字符串的类型,不但要判断是否为空,还要判断是否是空字符串
- where标签
- 1. 有条件的时候生成where关键字,根据条件去过滤数据
- 2. 会根据条件去掉多余的and or where关键字(自己干掉自己实现查全部)
- 代码
- <select id="selectByCondition" resultType="com.itheima.pojo.Brand"> SELECT * FROM tb_brand <where> <if test="status!=null"> `status`=#{status} </if> <if test="brandName!=null and brandName!=''"> AND brand_name LIKE "%"#{brandName}"%" </if> <if test="companyName!=null and companyName!=''"> AND company_name LIKE "%"#{companyName}"%" </if> </where> </select>
- if标签作用
- 字符串前后加%,拼接问题
- 单一的查询条件
- 标签
- choose 类似于 switch 多分支
- when 类似于 case 只会执行其中一个条件
- otherwise 类似于 default 上面所有的条件都不满足就执行这个
- 接口
- List selectByConditionSingle(Brand brand)
- 配置
- <select id="selectByConditionSingle" resultType="com.itheima.pojo.Brand"> SELECT * FROM tb_brand <where> <choose> <when test="status!=null"> `status`=#{status} </when> <when test="brandName!=null and brandName!=''"> brand_name LIKE "%"#{brandName}"%" </when> <when test="companyName!=null and companyName!=''"> company_name LIKE "%"#{companyName}"%" </when> <otherwise> ordered > 50 </otherwise> </choose> </where> </select>
- 标签
- 在XML中特殊字符处理
- 1. 使用实体字符进行转义,小于:< 大于: >
- 2. 使用CD代码段,解析成纯文本
- 查询所有记录
- 增删改操作
- mybatis中默认是手动提交事务
- 1. 手动提交事务 sqlSession.commit()
- 2. 从工厂中打开会话的时候,指定为自动提交事务 factory.openSession(true)
- 添加记录
- 接口
- /** * 增删改返回的是影响的行数 */ int addBrand(Brand brand);
- 配置
- <insert id="addBrand" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> INSERT INTO tb_brand VALUES (null,#{brandName},#{companyName},#{ordered},#{description},#{status}) </insert>
- 获取生成的主键
- useGeneratedKeys: 设置为true,要获取自增长的主键值
- keyColumn: 主键在表中的字段名
- keyProperty:主键在实体类中属性名
- 接口
- 删除记录
- 接口
- int deleteById(Integer id)
- 配置
- <delete id="deleteById"> DELETE FROM tb_brand WHERE id=#{id} </delete>
- 接口
- 修改
- 接口
- int update(Brand brand)
- 配置
- 更新所有的字段
- <update id="update"> UPDATE tb_brand SET brand_name=#{brandName}, company_name=#{companyName}, ordered=#{ordered}, description=#{description}, `status`=#{status} WHERE id=1; </update>
- 更新部分字段
- <update id="update"> UPDATE tb_brand <set> <if test="brandName!=null and brandName!=''"> brand_name=#{brandName}, </if> <if test="companyName!=null and companyName!=''"> company_name=#{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>
- 更新所有的字段
- set标签作用:
- 相当于sql语句中set关键字
- 去掉多余的逗号
- 接口
- 批量删除多条记录
- 接口
- int deleteByIds(@Param("ids")int[] ids)
- 只有一个参数也需要使用@Param("别名")
- int deleteByIds(@Param("ids")int[] ids)
- 配置
- <delete id="deleteByIds"> DELETE FROM tb_brand WHERE id IN <foreach collection="ids" open="(" item="id" separator="," close=")"> #{id} </foreach> </delete>
- foreach标签作用:用于遍历数组或集合
- collection:指定数组或集合的名字,引用@Param("变量名")
- open:遍历开始前添加的符号
- item: 给遍历中每个元素起的变量名
- separator: 每次遍历完添加的符号
- close: 遍历结束后添加的符号
- 接口
- mybatis中默认是手动提交事务
- 参数传递
- 多个参数如果没有使用@Param指定别名
- 以arg开头的变量名,从0开始: arg0 arg1 arg2
- 以param开头的变量名,从1开始:param1, param2, param3
- 数组
- 可以使用的名字是:array和arg0
- 集合
- 参数是一个List,可以使用名字是:arg0, collection, list
- 多个参数如果没有使用@Param指定别名
- 环境搭建
MyBatis的综合案例
最新推荐文章于 2023-12-01 19:25:02 发布