一、使用注解开发
注意:利用注解开发就不需要mapper.xml映射文件了(对于简单的语句可以用注解,复杂的语句不可以)
(1)我们在我们的接口中添加注解
//查询全部用户
@Select("select id,username,pwd from user")
public List<User> getAllUser();
(2)在mybatis的核心配置文件中注入
<mappers>
<!-- 在这里进行注解的配置,class绑定接口
这里要用. 不用/ -->
<mapper class="com.join.dao.UserMapper"/>
</mappers>
(3)我们去进行测试
@Test
public void testGetAllUser() {
SqlSession session = MybatisUtils.getSession();
//本质上利用了jvm的动态代理机制
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.getAllUser();
for (User user : users){
System.out.println(user);
}
session.close();
}
(4)利用Debug查看本质(通过反射去实现的,通过获取class类进行获取)
(5)本质上利用了jvm的动态代理机制
(6)Mybatis详细的执行流程(debug中查看)
二、注解增删改
UserMapper中
/**
* 查询全部用户
*/
@Select("select * from mybatis.user")
List<User> getUserList();
/**
* 根据id查询用户
*/
@Select("select * from mybatis.user where id = #{id}")
User selectUserById(@Param("id") int id);
/**
* 添加一个新用户
*/
@Insert("insert into mybatis.user (id,username,pwd) values (#{id},#{username},#{pwd})")
int addUser(User user);
/**
* 修改一个用户
*/
@Update("update mybatis.user set username=#{username},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
/**
* 删除一个用户
*/
@Delete("delete from mybatis.user where id = #{id}")
int deleteUser(@Param("id")int id);
UserDaoTest中
/**
* 使用注解的方式
*/
@Test
public void selectUser() {
SqlSession sqlSession = MybatisUtils.getSession();
//本质上利用了jvm的动态代理机制
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserList();
for (User user: users){
System.out.println(user);
}
sqlSession.close();
}
/**
* 根据id查询用户
*/
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(3);
System.out.println(user);
session.close();
}
/**
* 添加一个新用户
*/
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5, "5", "123456");
mapper.addUser(user);
session.commit();
session.close();
}
/**
* 修改一个用户
*/
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5, "5", "123");
mapper.updateUser(user);
session.commit();
session.close();
}
/**
* 删除一个用户
*/
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(5);
session.commit();
session.close();
}
关于@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')