分页模糊查询与SQL动态标签
一、模糊分页查询
1、知识点总结:
1.1、模糊查询和分页查询:在本次的学习中,一共学习了四种模糊查询方法:String类型的通过name查询、JavaBean类型的通过pet类型参数查询(此方法中有两种模糊条件表达式,分别为#{}和${})、Map类型的通过map集查询。
其中,如果是string类型,则#{}中只能是value,如果是JavaBean类型,则#{}中只能是属性名。如果是Map类型,则#{}中只能是key。
在模糊条件表达式中,#{}类似于占位符“?”,KaTeX parse error: Expected 'EOF', got '#' at position 12: {}类似于形式参数,故#̲{}须在引号外面,而{}需在引号里面。
扩展:占位符预编译的2中方式:
①、concat("%",#{pname},"%") ②、concat("%",‘${pname}’,"%")
1.2、模糊分页查询:参数为JavaBean或者Map,limit直接接#{start},#{size},如:select * from pet where pname like “%”#{pname}"%" limit #{start},#{size}
1.3、动态SQL标签:if判断标签,有test属性,代表条件。trim标签,能去掉前缀或者后缀,prefix属性,代表前缀。suffix属性代表后缀。prefixOverride属性表示去掉第一个前缀,suffixOverride表示去掉最后一个后缀。where标签,表示SQL中的判断条件部分,该标签会自动的去掉前后缀,并且在条件都不满足的情况下回把自己干掉,where没有属性。
1.4批量操作:parameterType参数类型同核心配置文件中的别名,collection固定写法为五种,int[]、list、array、set和collection,不推荐map,因为无法循环map集合,key不可以重复。
其中foreach标签标示循环,有collection属性,表示集合或数组的类型,open属性填左括号,separator填每个循环的分隔符,close属性填右括号,items填定义的变量名。
2、代码
2.1、IPetDao接口中的抽象方法
//模糊查询通过name
List<Pet> selectLike1(String name);
//模糊查询通过Pet
List<Pet> selectLike2(Pet pet);
//模糊查询通过Map
List<Pet> selectLike3(Map map);
//分页查询
List<Pet> selectPage(Map map);
//分页模糊查询
List<Pet> selectLikePage(Map map);
//动态sql标签之动态新增
int insertActive(Pet pet);
//动态修改
int updateActive(Pet pet);
//批量查询
List<Pet> selectBach(List list);
//批量删除
List<Pet> deleteBach(int[] ids);
2.2、PetMapper.xml映射文件中的sql代码
<select id="selectLike1" parameterType="string" resultType="pet">
select * from pet where pname like "%${pname}%"
</select>
<select id="selectLike2" parameterType="pet" resultType="pet">
select * from pet where pname like "%${pname}%"
</select>
<select id="selectLike3" parameterType="map" resultType="pet">
select * from pet where pname like concat("%",'${pname}',"%")
</select>
<!--分页查询-->
<select id="selectPage" parameterType="map" resultType="pet">
select * from pet limit #{start},#{size}
</select>
<!--分页模糊查询-->
<select id="selectLikePage" parameterType="map" resultType="pet">
select * from pet where pname like "%"#{pname}"%" limit #{start},#{size}
</select>
<!--动态sql标签之动态新增——if+trim-->
<insert id="insertActive" parameterType="pet">
<trim prefix="insert into pet(" suffix=")" suffixOverrides=",">
<if test="pname!=null">
pname,
</if>
<if test="pbreed!=null">
pbreed,
</if>
<if test="psex!=null">
psex,
</if>
<if test="pbirthday!=null">
pbirthday,
</if>
</trim>
<trim prefix="values(" suffix=")" suffixOverrides=",">
<if test="pname!=null">
pname,
</if>
<if test="pbreed!=null">
pbreed,
</if>
<if test="psex!=null">
psex,
</if>
<if test="pbirthday!=null">
pbirthday,
</if>
</trim>
</insert>
<!--动态修改-->
<update id="updateActive" parameterType="pet">
update pet
<set>
<if test="pname!=null">
pname=#{pname},
</if>
<if test="pbreed!=null">
pbreed=#{pbreed},
</if>
<if test="psex!=null">
psex=#{psex},
</if>
<if test="pbirthday!=null">
pbirthday=#{pbirthday},
</if>
</set>
where pid=#{pid}
</update>
<!--批量查询-->
<select id="selectBach" parameterType="list" resultType="pet">
select * from pet
<where>
pid in
<foreach collection="list" open="(" close=")" item="i" separator=",">
#{i}
</foreach>
</where>
</select>
<!--//批量删除-->
<select id="deleteBach" parameterType="int[]" resultType="pet">
delete from pet
<where>
pid in
<foreach collection="array" open="(" close=")" item="i" separator=",">
#{i}
</foreach>
</where>
</select>
2.3、测试类
private SqlSession sqlSession;
@Before
public void init(){
try {
//读取核心配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
//找一个建筑者盖工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//构建工厂
SqlSessionFactory factory = builder.build(is);
//工厂生产SQLSession对象
sqlSession = factory.openSession();
//SQLSession对象代理增删改查
} catch (IOException e) {
e.printStackTrace();
}
}
//模糊查询:通过name查询
@Test
public void selectLike1(){
List<Pet> pet = sqlSession.getMapper(IPetDao.class).selectLike1("胖");
System.out.println(pet);
}
//模糊查询:通过name查询
@Test
public void selectLike2(){
Pet pet = new Pet();
pet.setPname("阿");
List<Pet> pets = sqlSession.getMapper(IPetDao.class).selectLike2(pet);
System.out.println(pets);
}
//模糊查询:通过Map查询
@Test
public void selectLike3(){
HashMap map = new HashMap();
map.put("pname","胖花");
List<Pet> pets = sqlSession.getMapper(IPetDao.class).selectLike3(map);
System.out.println(pets);
}
//分页查询
@Test
public void selectPage(){
HashMap map = new HashMap();
map.put("start",0);
map.put("size",3);
List<Pet> pets = sqlSession.getMapper(IPetDao.class).selectPage(map);
System.out.println(pets);
}
//分页模糊查询
@Test
public void selectLikePage(){
HashMap map = new HashMap();
map.put("pname","胖");
map.put("start",0);
map.put("size",2);
List<Pet> pets = sqlSession.getMapper(IPetDao.class).selectLikePage(map);
System.out.println(pets);
}
//动态sql标签
@Test
public void insertActive(){
Pet pet = new Pet();
pet.setPname("肥花花");
pet.setPsex(1);
pet.setPbreed(1);
pet.setPbirthday(new Date());
int i = sqlSession.getMapper(IPetDao.class).insertActive(pet);
System.out.println(i);
}
//动态修改
@Test
public void updateActive(){
Pet pet = new Pet();
pet.setPid(2);
pet.setPname("肿花花");
pet.setPbreed(1);
pet.setPbirthday(new Date());
int i = sqlSession.getMapper(IPetDao.class).updateActive(pet);
System.out.println(i);
}
//批量查询
@Test
public void selectBach(){
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
List<Pet> pets = sqlSession.getMapper(IPetDao.class).selectBach(list);
System.out.println(pets);
}
//批量删除
@Test
public void deleteBatch(){
int[] array={1,3,5};
List<Pet> pets = sqlSession.getMapper(IPetDao.class).deleteBach(array);
System.out.println(pets);
}
@After
public void destroy(){
try{
sqlSession.commit();//提交
}catch (Exception e){
sqlSession.rollback();//回滚
}finally {
sqlSession.close();//关闭
}
}