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

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

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

mybatis respository接口注解和xml对应关系_spring

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

mybatis respository接口注解和xml对应关系_Test_02

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


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


mybatis respository接口注解和xml对应关系_spring_03

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

注解的本质:反射!

底层:动态代理

Debug测试

mybatis respository接口注解和xml对应关系_spring_04

 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的最佳实践!