参考文章;狂神说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的最佳实践!