MyBatis多条件查询
-
1.编写接口方法:Mapper接口
参数:所有查询条件
结论:List<Brand>
1.创建BrandMapper类
public interface BrandMapper { /** * 查询所有 */ List<Brand> selectAll(); /** * 查看详情:根据Id查询 */ Brand selectById(int id); /** * 条件查询 * *参数接收 * 1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符") * 2.对象参数 * 3.map集合参数 * // * @param status // * @param companyName // * @param brandName * @return */ //List<Brand> selectByCondition(@Param("status")int status,@Param("companyName")String companyName,@Param("brandName") String brandName); //List<Brand> selectByCondition(Brand brand); // List<Brand> selectByCondition(Map map); }
2.编写SQL语句:SQL映射文件
创建BrandMapper.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="com.uestc.mapper.BrandMapper"> <!-- 数据库表的字段名称,和 实体类的属性名称 不一样,则不能自动封装数据 * 起别名: 对不一样的列名起别名,让别名和实体类的属性名一样 *缺点:每次查询都要定义一次别名 *sql片段 *缺点:不灵活 * resultMap 1.定义<resultMap>标签 2.在<select>标签中使用resultMap属性替换 resultType属性 --> <!-- id:唯一标识 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> <!-- 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>--> <!-- <select id="selectAll" resultType="brand">--> <!-- select *--> <!-- from tb_brand;--> <!-- </select>--> <!-- *参数占位符: 1.#{}:会将其替换为 ? 为了放在SQL注入 2.${}:拼SQL,会存在SQL注入问题 3.使用时机: * 参数传递的时候:#{} * 表名或者列名不固定的情况下:${} *参数类型:parameterType:可以省略 *特殊字符处理: 1.转义字符: < ==> < 2.CDATA区: <![CDATA[ < ]]> --> <!-- <select id="selectById" resultMap="brandResultMap">--> <!-- select *--> <!-- from tb_brand where id = #{id};--> <!-- </select>--> <select id="selectById" resultMap="brandResultMap"> select * from tb_brand where id <![CDATA[ < ]]> #{id}; </select> <!-- 条件查询 --> <select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where status = #{status} and company_name like #{companyName} and brand_name like #{brandName}; </select> </mapper>
3.执行方法,测试
创建MyBatisTest类
@Test public void testSelectByCondition() throws IOException { //接收参数 int status = 1; String companyName = "华为"; String brandName = "华为"; //处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //封装对象 // Brand brand = new Brand(); // brand.setStatus(status); // brand.setCompanyName(companyName); // brand.setBrandName(brandName); //Map处理 Map map = new HashMap(); map.put("status",status); map.put("companyName",companyName); map.put("brandName",brandName); //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.selectByCondition(status, companyName, brandName); //List<Brand> brands = brandMapper.selectByCondition(brand); List<Brand> brands = brandMapper.selectByCondition(map); System.out.println(brands); //5.释放资源 sqlSession.close(); }
查询-多条件-动态条件查询:
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL。
MyBatis对动态SQL有很强大的支撑:
if
choose(when,otherwise)
trim(where,set)
foreach
查询-单条件-动态条件查询:
从多个条件中选择一个
choose(when,where):选择,类似于Java中的switch语句
总结:SQL语句设置多个参数有几种方式?
(1)散装参数:需要使用@Param("SQL中的参数占位符名称")
(2)实体类封装参数:只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功。
(3)map集合:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功。
MyBatis完成操作需要几步?三步:编写接口方法->编写SQL->执行方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!