- 查询-多条件 查询:
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->执行方法