前言
为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)
五、配置文件完成增删改查
1.学习目标
2.入门案例环境准备
(详细代码可以在作者主页的mybatisy源码re_crud_demo模块里找到)
- 在数据库创建实体类表tb_brand
- 代码
-- 删除tb_brand表 drop table if exists tb_brand; -- 创建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 ); -- 添加数据 insert into tb_brand (brand_name, company_name, ordered, description, status) values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0), ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1), ('小米', '小米科技有限公司', 50, 'are you ok', 1); SELECT * FROM tb_brand;
- 效果
- 创建对应的实体类brand
package org.example.pojo; //此处省略getter、setter和toString方法 public class Brand { // id 主键 private Integer id; // 品牌名称 private String brandName; // 企业名称 private String companyName; // 排序字段 private Integer ordered; // 描述信息 private String description; // 状态:0:禁用 1:启用 private Integer status;
- 在test包下的test文件下创建测试样例MybatisTest
- 安装MybatisX插件
- 文件结构预览
3.查询–查询所有
- 操作步骤
- 编写接口方法:Mapper接口
public interface BrandMapper { /** * 查询所有 */ List<Brand> selectAll(); }
- 编写SQL语句:SQL映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:名称空间 --> <mapper namespace="org.example.mapper.BrandMapper"> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select> </mapper>
- 编写测试样例
public class MyBatisTest { @Test public void testSelectAll() throws IOException { //1. 获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //4. 执行方法 List<Brand> brands = brandMapper.selectAll(); System.out.println(brands); //5. 释放资源 sqlSession.close(); } }
- 运行结果
- 小结
- 问题
- 问题描述: 查询出来的brandName和companyName为空
- 原因: 数据库表的字段名称 和 实体类的属性名称 不一样,则不能自动封装数据
(实体类属性名)
(数据库名称)
- 解决方案一
起别名:对不一样的列名起别名,让别名和实体类的属性名一样 * 缺点:每次查询都要定义一次别名 * sql片段 * 缺点:不灵活
(sql片段):
<!-- 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>
运行结果:
- 解决方案二:resultMap
resultMap: 1. 定义<resultMap>标签 2. 在<select>标签中,使用resultMap属性替换 resultType属性
对应的xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:名称空间 --> <mapper namespace="org.example.mapper.BrandMapper"> <!-- id属性 ,resultMap标签的标识。--> <!-- type属性 ,返回值的全限定类名,或类型别名。--> <resultMap id="brandResultMap" type="brand"> <!-- id:完成主键字段的映射 column:表的列名 property:实体类的属性名 result:完成一般字段的映射 column:表的列名 property:实体类的属性名 --> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select> </mapper>
运行结果:
4.查询–根据id查询
- 操作步骤
2. 编写接口方法:Mapper接口
package org.example.mapper; import org.example.pojo.Brand; import java.util.List; public interface BrandMapper { /** * 查询所有 */ List<Brand> selectAll(); /** * 查看详情:根据Id查询 */ Brand selectById(int id); } package org.example.mapper; import org.example.pojo.Brand; import java.util.List; public interface BrandMapper { /** * 查看详情:根据Id查询 */ Brand selectById(int id); }
- 编写SQL语句:SQL映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:名称空间 --> <mapper namespace="org.example.mapper.BrandMapper"> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id = #{id}; </select> </mapper>
- 编写测试样例
public class MyBatisTest { @Test public void testSelectById() throws IOException { //接收参数 int id = 1; //1. 获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //4. 执行方法 Brand brand = brandMapper.selectById(id); System.out.println(brand); //5. 释放资源 sqlSession.close(); } }
- 运行结果
- BrandMapper.xml中的sql语句的参数占位符
1. #{}:会将其替换为 ?,为了防止SQL注入
2. ${}:拼sql。会存在SQL注入问题
3. 使用时机: * 参数传递的时候:#{} * 表名或者列名不固定的情况下:${} 会存在SQL注入问题
- BrandMapper.xml配置文件中sql语句select标签中的参数类型
* 参数类型:parameterType:可以省略
- sql语句中的特殊字符处理
* 特殊字符处理: 1. 转义字符:
2. CDATA区: