注解
1.面向接口编程
我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理想的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点麻烦。
- 根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好.
什么叫面向接口编程
- 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
- 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
1.关于接口的理解。
-
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
-
接口的本身反映了系统设计人员对系统的抽象理解。
-
接口应有两类:
- 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
-
一个体有可能有多个抽象面。
-
抽象体与抽象面是有区别的。
2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:
- 环境是系统要素所处的空间与外部影响因素的总和。
- 任何接口都是在一定的环境中产生的。
- 因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。
3**.三个面向的区别**
-
面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法
-
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现
-
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题
2.使用注解开发
-
在接口中添加注解
//查询全部用户 @Select("select * from user") List<User> getAllUserList();
-
在核心配置文件中绑定接口
<mappers> <mapper class="com.mapper.UserMapper"/> </mappers>
-
测试
@Test public void getUserList(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
-
注意:
-
使用了注解就不用写UserMapper.xml文件了
-
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。
-
因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
-
-
本质:反射加载实现
6. 底层:动态代理
-
执行流程
3.注解实现增删改查
3.1、改造MybatisUtil的getSqlsession方法
//获取SqlSession连接
public static SqlSession getSession(){
return getSession(true); //事务自动提交
}
public static SqlSession getSession(boolean flag){
return sqlSessionFactory.openSession(flag);
3.2、查询
-
接口
@Select("select * from user where id=#{id}") User getById(@Param("id") int id);
-
测试
@Test public void getById(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User byId = mapper.getById(1); System.out.println(byId); sqlSession.close(); }
3.3、增加
-
接口
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user);
-
测试
@Test public void addUser(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(new User(5,"wuming","158486")); sqlSession.close(); }
3.4、修改
-
接口
@Update("update user set name=#{name},pwd=#{pwd} where id=#{id}") int updataUser(User user);
-
测试
@Test public void updateUser(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updataUser(new User(3,"liwu","159888")); sqlSession.close(); }
3.5、删除
-
接口
@Delete("delete from user where id=#{id}") int deleteUser(@Param("id") int id);
-
测试
@Test public void deleteUser(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(5); sqlSession.close(); }
4.关于@Param()注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型,可以忽略,但是建议加上!
- 我们在SQL中引用的就是我们这里的@Param()中设定的属性名!
5.#与$的区别
- #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
- ${} 的作用是直接进行字符串替换
6.LOMbok
6.1下载lombok插件
6.2导入jar包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
6.3注解示例
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass
6.4说明
-
@Data:无参构造、get、set、tostring、hashcode、equals
-
@NoArgsConstructor:无参构造
-
@AllArgsConstructor:有参构造
-
@Getter and @Setter
-
@ToString
-
示例
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private String pwd; }
6.5 lombok优点和缺点
优点:
- 能通过注解自动生成构造器、getter/setter、equals、hashcode、tostring等方法,提高了开发效率
- 让代码变得简洁,不用过多的去关注相应的方法
- 属性做修改时,也简化了维护这些属性所生成的get/set方法等
缺点:
- 不支持多种参数构造器的重载
- 虽然省去了手动创建get/set方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。
name;
private String pwd;
}
### 6.5 lombok优点和缺点
优点:
1. 能通过注解自动生成构造器、getter/setter、equals、hashcode、tostring等方法,提高了开发效率
2. 让代码变得简洁,不用过多的去关注相应的方法
3. 属性做修改时,也简化了维护这些属性所生成的get/set方法等
缺点:
1. 不支持多种参数构造器的重载
2. 虽然省去了手动创建get/set方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。