面向接口的做作用:解耦
理解:定义(规范,约束),与实现的分离
接口本身放映了系统设计人员对系统的抽象理解
抽象接口应有两类:
第一类是对一个个体的抽象,他可对应一个抽象体(abstact class);
是对一个个体某一方面的抽象,即形成一个抽象面(inface);
一个体可能有多个抽象面,抽象体和抽象面之间是有区别的
三个面向的区别
- 面向对象:我们考虑问题时,以对象为单位,要考虑实例化对象的属性和方法
- 面向过程:当考虑问题时,是以一个具体流程(事务过程)为单位,考虑它的实现
- 面向接口:本质上与面对过程和面对对象不是一个问题,更多的是考虑它整体的一个架构
使用注解实现接口
接口+注解
public interface UserMapper { @Select("select * from user") List<User> getUsers(); }
注册机
<mappers>
<mapper class="com.king.dao.UserMapper"/>
</mappers>
测试
@Test public void mapperTest(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUsers(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
缺点:
本质:反射机制实现
底层:动态代理模式
练习:增删改
mapper
@Insert("insert into `user`(id,name,pwd) VALUES (#{id},#{name},#{pwd})") int addUser(User user); @Delete("DELETE FROM `user` WHERE id=#{id}") int delUser(int i); @Update("UPDATE `user` SET `name`=#{name},pwd=#{pwd} WHERE id=#{id}") int updateUser(User user);
注意:当接口要传递多个参数时,要用注解@Param标记每个参数,每个参数对应sql中的#{**}
//注意:当有多个参数是需使用注解标记@Param(要与sql语句的传参名相同) @Select("select * from user where id=#{id} and name=#{name}") List<User> getUserList(@Param("id")int id,@Param("name")String name);
扩展:当使用Mapper.xml去实现接口时,接口方法需传递多个参数,该怎么办
mapper接口
//多个参数 List<User> getUsersList(@Param("id")int id,@Param("name")String name);
mapper.xml(不需要写传参类型了,以为在接口中就已经写明了)
<select id="getUsersList" resultType="com.king.pojo.User"> select * from mybatis.user where id = #{id} and `name` = #{name} </select>
扩展二:(1)当使用注解方式操作crud时,一个注册机只能注册一个文件/包
<!--绑定接口--> <mappers> <mapper class="com.king.dao.UserMapper"/> </mappers>
(2)当使用mapper.xml实现时,可利用通配符注册多个mapper.xml
<mappers> <mapper resource="com/king/dao/*.xml"/> </mappers>