mysql動態SQL
解決
Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.zwt.mapper.AddressesMapper.queryTrim'. It's likely that neither a Result Type nor a Result Map was specified.
的問題
在sql語句加上返回的類型 :
resultType="com.zwt.pojo.Addresses"
緩存
兩次查詢僅有一次調用SQL語句,第二次從緩存中命中。
SqlSession sqlSession = MybatisUtil.getSession(); AddressesMapper mapper = sqlSession.getMapper(AddressesMapper.class); List<Addresses> addresses = mapper.listAll(); System.out.println(addresses); List<Addresses> addresses2 = mapper.listAll(); System.out.println(addresses2); sqlSession.commit(); sqlSession.close();
DEBUG [main] - ==> Preparing: select country,state,city from addresses DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 7
緩存失效方式
查詢后進行增刪改會使緩存失效
SqlSession sqlSession = MybatisUtil.getSession(); AddressesMapper mapper = sqlSession.getMapper(AddressesMapper.class); List<Addresses> addresses = mapper.listAll(); //緩存失效一:查詢后增刪改會使緩存失效 Addresses a = new Addresses(); a.setId(2); a.setCountry("2"); a.setCity("3"); a.setState("4"); a.setZip("5"); mapper.update(a); List<Addresses> addresses2 = mapper.listAll(); sqlSession.commit(); sqlSession.close();
DEBUG [main] - ==> Preparing: select country,state,city from addresses DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 7 DEBUG [main] - ==> Preparing: update addresses SET country = ?, city = ?, state = ?, zip = ? WHERE id = ? DEBUG [main] - ==> Parameters: 2(String), 3(String), 4(String), 5(String), 2(Long) DEBUG [main] - <== Updates: 1 DEBUG [main] - ==> Preparing: select country,state,city from addresses DEBUG [main] - ==> Parameters:
強制清空緩存
List<Addresses> addresses = mapper.listAll(); //強制清空會話所有緩存sqlSession.clearCache(); List<Addresses> addresses2 = mapper.listAll(); sqlSession.commit(); sqlSession.close();
DEBUG [main] - ==> Preparing: select country,state,city from addresses DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 7 DEBUG [main] - ==> Preparing: select country,state,city from addresses DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 7
動態SQL
動態SQL-if
<select id="queryByCountryCity" resultType="com.zwt.pojo.Addresses"> select * from addresses <where> <if test="country != null and city = '' "> and COUNTRY = #{country}</if> <if test="city != null">and city = #{city}</if> </where> </select>
public void m3(){ SqlSession sqlSession = MybatisUtil.getSession(); AddressesMapper mapper = sqlSession.getMapper(AddressesMapper.class);//
List<Addresses> addresses = mapper.queryByCountryCity(null, "Perry");//
List<Addresses> addresses = mapper.queryByCountryCity("China", null);
List<Addresses> addresses = mapper.queryByCountryCity("Taylor", "");
System.out.println(addresses); sqlSession.close();
當country不為空並且city為空時,通過country查詢;
當city不為空時則通過city查詢
動態SQL-模糊查詢
第一種
List<Addresses> addresses = mapper.queryLike("%Luo%"); select * from addresses where city like #{city}
第二種
通過mysql的函數 concat 完成:
select * from addresses where city like concat('%', #{city}, '%')
第二種
通過band標簽對變量重新綁定,在用新的變量查詢
<bind name = "_city" value = " '%' + city + '%'"></bind> select * from addresses where city like #{_city}
