Mybatis07-注解的原理和用注解实现CRUD

参考文章;​​​​​​狂神说MyBatis04:使用注解开发

狂神的文章讲的真的很详细了。

我们怎么使用注解开发,举个例子,我们原本是在mapper里面绑定接口,编写sql语句

使用注解,不用写mapper.xml了

在mybatis的核心配置文件中注入 

<!--使用class绑定接口-->

 我们发现,不写mapper.xml,没有定义它的返回类型,参数,方法名,却还是能够得到输出结果,为什么?

注解的本质:反射!

底层:动态代理

Debug测试

 sqlSession会通过反射会获取到接口类。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

用注解实现简单的CRUD

 首先我们在工具类里打开自动提交事务功能。

public static SqlSession getSqlSession(){
   return  sqlSessionFactory.openSession(true);//开启自动提交事务
}

 @Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param("userId") int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。

UserDao.class

public interface UserDao {
    @Select("select * from mybatis.user")
    List<User> getUser();

//方法存在多个参数,所有参数必须加上@Param
    @Select("select * from user where id=#{id}")
    User getUserById(@Param("id")int id);

    @Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(Map<String,Object> map);

    @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
    int updateUser(Map<String,Object> map);

    @Delete(" delete  from user where id=#{id}")
    int  delUser(int id);

}

Test


public class UserDaoTest {

    @Test
    public  void userdaotest(){
        //1.获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //2.方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> user = userDao.getUser();
        for (User user1 : user) {
            System.out.println(user1);
        }
        //3.关闭sqlSession
        sqlSession.close();
    }

    @Test
    public  void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
        sqlSession.close();
    }

    @Test
    public  void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map<String,Object> map=new HashMap<>();
        map.put("id",10);
        map.put("name","okay");
        map.put("pwd","111000");
        int i = mapper.addUser(map);
        if(i>0){
            System.out.println("add成功");
        }
        sqlSession.close();
        //开启了自动提交事务,不用再手动提交了
    }
    @Test
    public  void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map<String,Object> map=new HashMap<>();
        map.put("id",10);
        map.put("name","okayupdate");
        map.put("pwd","111000qq");
        int i = mapper.updateUser(map);
        if(i>0){
            System.out.println("update成功");
        }
        sqlSession.close();
        //开启了自动提交事务,不用再手动提交了
    }

    @Test
    public void delUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        mapper.delUser(10);
        sqlSession.close();
    }


  注解只在简单的sql语句时使用!在复杂的接口或者业务代码上,不能使用注解!

关于@Param

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

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

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

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

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

#与$的区别

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】

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

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

使用注解和配置文件协同开发,才是MyBatis的最佳实践!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JagTom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值