zoukankan      html  css  js  c++  java
  • 6.Mybatis使用注解开发

    转载:https://blog.kuangstudy.com/index.php/archives/500/

    一.面向接口编程

    • 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程

    • 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好

    • 关于接口的理解:

      • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

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

      • 接口应有两类:

        • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);

        • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);

    二.使用注解开发

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

    • 注解开发具有局限性对于复杂的SQL语句难以编写,推荐使用xml文件的方式来实现开发

    1.开发流程:

    UserMapper.java接口文件:

    1 @Select("select id,name,pwd as password from User")
    2 List<User> getUsers();

    mybatis-config.xml文件:将原先绑定的xml文件改为绑定接口文件

    1 <!--绑定接口-->
    2 <mappers>
    3     <mapper class="edu.ustc.wzh.dao.UserMapper"></mapper>
    4 </mappers>

    测试程序:

     1 @Test
     2 public void getUsersTest() {
     3     SqlSession session = MybatisUtils.getSession();
     4 
     5     UserMapper mapper = session.getMapper(UserMapper.class);
     6 
     7     List<User> users = mapper.getUsers();
     8     for (User user : users) {
     9         System.out.println(user);
    10     }
    11 
    12     session.close();
    13 }

    2.本质:使用JVM动态代理机制

    3.Mybatis详细执行流程(原理)

    4.注解的增删改查

    补充:对于增删改自动提交,不需要在 session.commit(); 。

    修改MybatisUtils中的代码: openSession(true) 设置参数为true就可以自动提交不需要使用commit提交

    1 //第二步:从 SqlSessionFactory中获取SqlSession连接
    2 public static SqlSession getSession() {
    3     return sqlSessionFactory.openSession(true);
    4 }

    (1)查询

    补充知识点:多参数 @Param("userId") int id 在SQL语句中参数按照Param传入的参数为准 where id=#{userId}" 

    UserMapper.java接口文件:

    1 //方法存在多个参数,所有参数前面必须加上@Param("id")注解
    2 @Select("select id,name,pwd as password from User where id=#{userId}")
    3 User getUserByID(@Param("userId") int id);

    测试程序:

     1 @Test
     2 public void getUserByIDTest() {
     3     SqlSession session = MybatisUtils.getSession();
     4 
     5     UserMapper mapper = session.getMapper(UserMapper.class);
     6 
     7     User user = mapper.getUserByID(1);
     8     System.out.println(user);
     9 
    10     session.close();
    11 }

    (2)添加(由于设置了自动提交则不需要在进行commit)

    UserMapper.java接口文件:

    1 @Insert("insert into User(id,name,pwd) values (#{id},#{name},#{password})")
    2 int addUser(User user);

    测试程序:

     1 @Test
     2 public void addUser() {
     3     SqlSession session = MybatisUtils.getSession();
     4 
     5     UserMapper mapper = session.getMapper(UserMapper.class);
     6 
     7     int res = mapper.addUser(new User(7, "wzl", "123456"));
     8 
     9     if (res > 0) {
    10         System.out.println("添加成功!");
    11     }
    12 
    13 
    14     session.close();
    15 }

    (3)修改

    UserMapper.java接口文件:

    1 @Update("update User set name=#{name},pwd=#{password} where id=#{id}")
    2 int updateUser(User user);

    测试程序:

     1 @Test
     2 public void updateUserTest(){
     3     SqlSession session = MybatisUtils.getSession();
     4 
     5     UserMapper mapper = session.getMapper(UserMapper.class);
     6 
     7     int res = mapper.updateUser(new User(7,"wzl","qqqqqq"));
     8 
     9     if (res > 0) {
    10         System.out.println("修改成功!");
    11     }
    12 
    13     session.close();
    14 }

    (4)删除

    UserMapper.java接口文件:

    1 @Delete("delete from User where id=#{userId}")
    2 int deleteUser(@Param("userId") int id);

    测试程序:

     1 @Test
     2 public void deleteUserTest(){
     3     SqlSession session = MybatisUtils.getSession();
     4 
     5     UserMapper mapper = session.getMapper(UserMapper.class);
     6 
     7     int res = mapper.deleteUser(7);
     8 
     9     if (res > 0) {
    10         System.out.println("删除成功!");
    11     }
    12 
    13     session.close();
    14 }

    4.关于@Param()注解

    • 基本类型的参数或String类型,需要加上

    • 引用类型不需要加

    • 如果只有一个基本类型则可以省略,但是推荐加上

    • 我们在SQL中引用@Param()中设定的属性

    (1)#$的区别

    • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
      1 INSERT INTO user (name) VALUES (#{name});
      2 INSERT INTO user (name) VALUES (?);
    • ${} 的作用是直接进行字符串替换【可能会产生SQL注入】
      1 INSERT INTO user (name) VALUES ('${name}');
      2 INSERT INTO user (name) VALUES ('kuangshen');
  • 相关阅读:
    Jquery(智能感知AJAX,从后台调数据)
    jQuery插件(输入关键字出现提示,并可查询)
    设置缓存失效的三种方法
    关于fluorinefx基础和服务器搭建的文章地址
    关于过河问题的感悟
    .net 大文件上传
    iis7中运行cmd
    学习总结
    C#开源资源项目(转载)
    HTML数据提取
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12298680.html
Copyright © 2011-2022 走看看