1、查询所有
实体类属性名和数据库表的列名不一致,则idea不能自动封装数据
解决方法:
* 方法一: 起别名 :对不一样的字段名起别名,让别名和实体类的属性名一样
- 缺点:每次查询都要定义一次别名
<select id="selectAll" resultType="brand">
select id , brand_name as brandName, company_name as companyName, ordered,description,status 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"></include> from tb_brand;
</select>
* 缺点:sql片段不灵活
-解决:方法二
* 方法二:resultMap:
1. 在<mapper namespace="com.itheima.mapper.BrandMapper"></mapper>标签中定义resultMap标签
2. 在<select>标签中使用resultMap属性替换resultType属性
<!--
id: 唯一标识
type:映射的类型(支持别名)
-->
<resultMap id="brandResultMap" type="brand">
<!--
id:完成主键字段的映射
result:完成一般字段的映射
column: 该字段在数据库中的列名
property: 该字段在实体类pojo的属性名
<id column="brand_name" property="brandName"/>//主键字段的映射
-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
2、Id查询
<!--
*参数占位符:
1. #{};会替换为 ?, 为了防止SQl注入
2. ${}; 拼sql语句,会存在sql注入问题
3. 使用时机:
* 参数传递的时候,使用#{}
* 数据库表名或者列名不固定的时候,使用${}
* 参数类型:
parameterType="int";可以省略
<select id="selectById" parameterType="int" resultMap="brandResultMap">
select * from tb_brand where id = ${id};
</select>
* 特殊字符处理:
1. 转移字符:
<select id="selectById" resultMap="brandResultMap">
select * from tb_brand where id < ${id};
</select>
2. CDATA区://其实就相当于文本框;<![CDATA[ 这里就是填数据的地方 ]]>
<select id="selectById" resultMap="brandResultMap">
select * from tb_brand where id <![CDATA[ < ]]> ${id};
</select>
-->
3、多条件查询
// 多条件查询
/**
* * 参数接收:
* 1. 散装参数:如果方法中有!!!多个参数!!!,需要使用@Param("sql参数占位符名称")
* 2. 对象参数: 对象的属性名称要和参数占位符名称一致
* 3. map集合: 只需保证sql中的参数名和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);
一、动态查询
- 动态sql:sql语句会随着用户的输入或者外部条件的变化而变化
<!--动态条件查询
* if : 条件查询
* test : 逻辑表达式
* 产生的问题:第一个条件不需要逻辑运算符
<if test="companyName !=null and companyName !='' ">
and company_name like #{companyName}
</if>
*解决1: 多写一个恒等式: 1=1
<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>
</select>
//上面的一段代码单单用一个if标签是不能满足需求的),存在的问题是where后面的第一个条件不需要and,所以很难满足
//使用动态sql就可以解决
<select id="selectByCondition" resultMap="brandResultMap">
select * from tb_brand
<where>
<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>
</where>
</select>
一、动态查询——单条件查询
<select id="selectByConditionSingle" resultMap="brandResultMap">
select * from tb_brand
where
<choose> <!--相当于swith-->
<when test="status !=null"><!--相当于case-->
status =#{status}
</when>
<when test="companyName !=null and companyName !=''"><!--相当于case-->
company_name like #{companyName}
</when>
<when test="brandName !=null and brandName !=''"><!--相当于case-->
brand_name like #{brandName}
</when>
<otherwise> <!--相当于default-->
1=1
</otherwise>
</choose>
</select>
//查询单个的
<select id="selectByConditionSingle" resultMap="brandResultMap">
select * from tb_brand
where
<choose> <!--相当于swith-->
<when test="status !=null"><!--相当于case-->
status =#{status}
</when>
<when test="companyName !=null and companyName !=''"><!--相当于case-->
company_name like #{companyName}
</when>
<when test="brandName !=null and brandName !=''"><!--相当于case-->
brand_name like #{brandName}
</when>
<otherwise> <!--相当于defaut-->
1=1
</otherwise>
</choose>
</select>
//使用where标签的改进
<select id="selectByConditionSingle" resultMap="brandResultMap">
select * from tb_brand
<where>
<choose> <!--相当于swith-->
<when test="status !=null"><!--相当于case-->
status =#{status}
</when>
<when test="companyName !=null and companyName !=''"><!--相当于case-->
company_name like #{companyName}
</when>
<when test="brandName !=null and brandName !=''"><!--相当于case-->
brand_name like #{brandName}
</when>
</choose>
</where>
</select>