MyBatis之注解开发

一、理解接口

1.1 关于接口

  • 从字面上理解,接口应是定义(规范,约束)与实现的分离。、

  • 接口反映了系统设计人员对系统的抽象理解。

  • 接口分为两类:一类是对个体的抽象,它可对应为一个抽象体(abstract class);另一类是对个体某一方面的抽象,即形成一个抽象面(interface)。

  • 抽象体与抽象面是有区别的,一个个体有可能有多个抽象面。

1.2 面向接口编程

在真正的开发中,一般我们会选择面向接口编程,而非面向对象编程,原因如下:

  • 面向接口编程能解耦程序 ,提高复用性, 可拓展性强,在分层开发中 ,大家都遵守共同的标准,上层不用管具体的实现。

  • 在面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,系统设计人员不关心各个对象内部是如何实现的。

  • 系统设计的关键是各个对象之间的协作关系。面向接口编程就是指按照这种思想来注重各模块之间的交互关系。

1.3 面向对象与过程

  • 面向对象是指以对象为单位,考虑它的属性及方法 。

  • 面向过程是指以一个具体的事务过程为单位,考虑它的实现 。

  • 面向接口编程是针对复用技术而言的,更多体现的是对系统整体架构的考虑。

二、利用注解开发

MyBatis最初配置信息是基于 XML文件 ,映射语句(SQL)也是定义在 XML 中的,MyBatis 3提供了新的基于注解的配置。但Java 注解的表达力和灵活性有限,并不能用注解来完全构建强大的 MyBatis 映射。

2.1 注解开发流程:

利用注解开发就不需要mapper.xml映射文件了 。

SQL类型注解分类:

  • @select()

  • @update()

  • @Insert()

  • @delete()

在Mapper接口文件中添加注解:

 //查询全部用户
 @Select("select id,name,pwd password from user")
 public List<User> getAllUser();

在MyBatis的核心配置文件中注入:

 <!--使用class绑定接口-->
 <mappers>
     <mapper class="com.MyBatis.mapper.Mapper"/>
 </mappers>

在类中进行测试:

 @Test
 public void testGetAllUser() {
     SqlSession session = MybatisUtils.getSession();
     //本质上利用了jvm的动态代理机制
     Mapper mapper = session.getMapper(Mapper.class);
    List<User> users = mapper.getAllUser();
     for (User user : users){
         System.out.println(user);
    }
     session.close();
 }

本质是利用了JVM的动态代理机制:

MyBatis执行流程:

2.2 注解增删改查

  • 改造MyBatisUtils工具类的getSession( ) 方法,重载实现:

 //获取Sql Session连接
    public static SqlSession getSession(){
        return getSession(true); //事务自动提交
    }
   
    public static SqlSession getSession(boolean flag){
        return sqlSessionFactory.openSession(flag);
    }
  • 查询接口方法注解:

 //根据id查询用户
 @Select("select * from user where id = #{id}")
 User selectUserById(@Param("id") int id);
 @Test
 public void testSelectUserById() {
     SqlSession session = MybatisUtils.getSession();
     Mapper mapper = session.getMapper(Mapper.class);
     User user = mapper.selectUserById(1);
     System.out.println(user);
     session.close();
 }
  • 新增接口方法注解:

 //添加一个用户
 @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
 int addUser(User user);
 @Test
 public void testAddUser() {
     SqlSession session = MybatisUtils.getSession();
     Mapper mapper = session.getMapper(Mapper.class);
     User user = new User(6, "zhangsan", "123456");
     mapper.addUser(user);
     session.close();
 }
  • 修改接口方法注解:

 //修改一个用户
 @Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
 int updateUser(User user);
 @Test
 public void testUpdateUser() {
     SqlSession session = MybatisUtils.getSession();
     Mapper mapper = session.getMapper(Mapper.class);
     User user = new User(6, "zhaosi", "abcdef");
     mapper.updateUser(user);
     session.close();
 }
  • 删除接口方法注解:

 //根据id删除用
 @Delete("delete from user where id = #{id}")
 int deleteUser(@Param("id")int id);
 @Test
 public void testDeleteUser() {
     SqlSession session = MybatisUtils.getSession();
     Mapper mapper = session.getMapper(Mapper.class);
     mapper.deleteUser(6);
     session.close();
 }

增删改一定记得对事务的处理

2.3 关于@Param

@Param注解用于给方法参数起一个名字。以下是总结的使用原则:

  • 在方法只接受一个参数的情况下,可以不使用@Param。

  • 在方法接受多个参数的情况下,一定要使用@Param注解给参数命名。

  • 如果参数是 JavaBean , 则不能使用@Param。

  • 不使用@Param注解时,参数只能有一个,并且是JavaBean 。

JavaBean:一个遵循特定写法的Java类,它通常具有如下特点:

  • 这个Java类必须具有一个无参的构造函数

  • 属性必须私有化。

  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

  • JavaBean在J2EE开发中,通常用于封装数据,对于遵循写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。

2.4 #与$的区别

  • #{} 的作用主要是替换预编译语句中的占位符“?”

 INSERT INTO user (name) VALUES (#{name});
 INSERT INTO user (name) VALUES (?);
  • ${} 的作用是直接进行字符串替换

 INSERT INTO user (name) VALUES ('${name}');
 INSERT INTO user (name) VALUES ('kuangshen');

三、参考资料:

https://blog.csdn.net/keep12moving/article/details/92666633

posted on 2022-02-14 18:29  lixin05  阅读(185)  评论(0编辑  收藏  举报