三. 传参 parameterType
传参可以使用三种方式
1.map 方式的传参(较旧的方式)
2.注解@Param 的方式 (适用于参数较少的情况,且与实体属性无太太关联)
3.实体对象bean 的方式 (适用于插入,更新 等与实体属性关联的,或者属性过多的时候,封装成bean传入)
三.一 Map 形式的传参
接口:
//多个参数的时候。 public List<User> findByNameAndSexMap(Map<String,Object> map);
xml配置实现
<!-- 查询多个参数的时候 ,map 的形式 parameterType='map' map为系统定义好的别名--> <select id="findByNameAndSexMap" parameterType="map" resultType="user"> select * from user where name like concat('%',#{name},'%') and sex=#{sex} </select>
测试方法:
@Test public void findByNameAndSexMapTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //定义参数 Map<String,Object> paraMap=new HashMap<String,Object>(); //key与xml 中配置的相同 paraMap.put("name","蝴蝶"); paraMap.put("sex","男"); List<User> allList=userMapper.findByNameAndSexMap(paraMap); allList.forEach(n ->System.out.println(n)); }
要注意,map 中的key 键值 要与 sql语句中的#{值} 保持一致。
三.二 @param 注解的方式
接口:
public List<User> findByNameAndSexAnnotation(@Param(value="name") String name, @Param(value="sex") String sex);
sql语句配置:
<!-- 查询多个参数的时候 ,注解 的形式, 没有参数类型 --> <select id="findByNameAndSexAnnotation" resultType="user"> select * from user where name like concat('%',#{name},'%') and sex=#{sex} </select>
测试方法, 为传参的形式
@Test public void findByNameAndSexAnnotationTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.findByNameAndSexAnnotation("蝴蝶","男"); allList.forEach(n ->System.out.println(n)); }
查询的结果与上面的一样。
此时,sql语句中的值要与 注解的value 值相同,不一定要与方法中的形参的值相同。 适用于参数较少的情况,一般不超过5个。
三.三 对象bean 的方式
接口:
public List<User> findByNameAndSexBean(User user);
sql语句:
<!-- 实体对象bean的方式传参, 已经定义好别名user了 --> <select id="findByNameAndSexBean" parameterType="user" resultType="user"> select * from user where name like concat('%',#{name},'%') and sex=#{sex} </select>
测试方法:
@Test public void findByNameAndSexBeanTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=new User(); user.setName("蝴蝶"); user.setSex("男"); List<User> allList=userMapper.findByNameAndSexBean(user); allList.forEach(n ->System.out.println(n)); }
查询的结果与上面的一致。
三.四 三种传参方式的比较
map 形式: map传入进去,是不知道key值是什么的,与sql 语句隔离了,导致了业务可读性的丧失,导致了后续的扩展与维护的困难,应当果断废弃这种方式。
param 注解方式: 受参数个数的影响, 当n<=5 时,是最好的方式, 比java bean 还好,应该比java bean 更直观。 当n>5 时,多个参数调用会出现困难。
java bean 方式: 当参数个数过多时使用。 >5 时。
四. MyBatis 排序
排序,用order by 进行排序。
四.一 单个参数排序,用value 接收
接口:
public List<User> orderByAge(String age);
sql语句:
<!-- 单个值排序,必须用value 进行接收 --> <select id="orderByAge" parameterType="string" resultType="user"> <!-- select * from user order by ${value} desc --> select * from user order by ${value} desc </select>
测试方法:
@Test public void orderByAgeTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.orderByAge("age"); allList.forEach(n ->System.out.println(n)); }
四.二 多个参数排序 ,用注解方式传入
接口:
public List<User> orderByAgeAndId(@Param("age") String age,@Param("id") String id);
sql语句:
<!-- 多个参数排序,可以用注解的方式 --> <select id="orderByAgeAndId" resultType="user"> select * from user order by ${age} asc,${id} desc </select>
测试方法:
@Test public void orderByAgeAndIdTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.orderByAgeAndId("age","id"); allList.forEach(n ->System.out.println(n)); }
五. 查询某些列的值
在sql 语句的前面进行查询
接口:
public List<User> selectColumn(@Param(value="column1") String column1, @Param(value="column2") String column2,@Param(value="column3") String column3);
sql语句:
<select id="selectColumn" parameterType="map" resultType="user"> <!-- 也可以写别名进行操作。 --> select ${column1},${column2},${column3} from user </select>
测试方法:
@Test public void selectColumnTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> allList=userMapper.selectColumn("name","sex","description"); allList.forEach(n ->System.out.println(n)); }
只有要查询的列才有值。