Mapper 的动态代理作用
之前使用的sqlsession进行增删改查的缺点:
[1]没有办法实现多参数的传递
[2]书写的时候没有接口,后期的维护就比较的低
解决的方案:
Mapper的代理方式实现增删改查
使用步骤:
①定义接口:
public interface FlowerMapper {
//查询所有操作
List<Flower> selectAll();
//修改操作
int insert(Flower flower);
}
②配置mapper.xml文件
<!--namespace:必须是接口所在的全路径-->
<mapper namespace="com.bjsxt.mapper.FlowerMapper">
<!--id的名称和接口中方法名必须保持一致-->
<select id="selectAll" resultType="flower">
SELECT * from flower
</select>
<insert id="insert">
insert into flower values (DEFAULT ,#{name},#{price},#{production})
</insert>
</mapper>
③测试代码使用
1.首先通过getMapper获得dao层接口的类
FlowerMapper mapper = sqlSession.getMapper(FlowerMapper.class);
2.调用接口方法
//查询操作
List<Flower> list = mapper.selectAll();
//添加操作
Flower f=new Flower();
f.setName("sxt");
f.setPrice(19);
f.setProduction("bj");
int insert = mapper.insert(f);
System.out.println(insert);
Mapper代理多参数传递:
//查询信息
public Flower selectOne(int id,String name);对应mapper.xml文件中
<select id="selectOne" resultType="flower"> <!-- select * from flower where id=#{0} and name=#{1} --> <!-- map.put("param1",1) map.put("param2",'玫瑰花') --> select * from flower where id=#{param1} and name=#{param2} </select>
// 查询信息 定义传入参数的别名,uu->uu,ii->oo
public Flower selectOne2(@Param("uu")int uu,@Param("oo")String ii);对应mapper.xml文件中
可以不使用param1,param2...,在后续进行动态拼接sql的时候这种方式常用 <select id="selectOne2" resultType="flower"> select * from flower where id=#{uu} and name=#{oo} </select>
// 传递对象
public Flower selectOne3(Flower fl);跟之前一样直接使用对象的属性 <select id="selectOne3" resultType="flower"> select * from flower where id=#{id} and name=#{name} </select>
// 传递多个对象
public Flower selectOne4(Flower fl,Flower fl2);传递多个对象,可能对象都有相同的属性,那么怎么知道我用的是哪个呢 就用param1表示传入的第一个对象 用param2表示传入的第二个对象,。。。。 <select id="selectOne4" resultType="flower"> select * from flower where id=#{param1.id} and name=#{param2.name} </select>
通过Mapper代理方式,又引入一个mybatis.xml的优化:
之前如果要扫描mapper.xml文件用的是:
<mapper resource="com/bjsxt/mapper/FlowerMapper1.xml"></mapper>
每个mapper.xml对应一个<mapper></mapper>
现在引出一个新的扫描mapper.xml文件的方法:
<!--这种方法首先会去com/bjsxt/mapper包下找所有的接口,然后会去找和接口名相同的xml文件进行扫描-->
<!--如果mapper包下没有接口,那么这种方法就失效了,还要用之前的方法扫描xml文件-->
<package name="com.bjsxt.mapper"></package>
<!--同样如果一个mapper.xml文件没有对应的接口,那么想要扫描这个xml文件就还要用之前的方式-->