Mybatis-使用注解开发
在JSP中使用servlet的时候需要先在web.xml中配置相关的servlet类才能正常使用,然后还有一种快捷的方式就是使用@WebServlet的快速开发。在之前的MyBatis中也都是使用的xml文件的配置,然后这个是说说用注解的方式使用Mybatis。
利用注解开发
-
sql 类型主要分成 :
-
- @select ()
- @update ()
- @Insert ()
- @delete ()
使用了注解开发后就不再需要mapper.xml的配置文件了。
注解开发步骤
- 在我们的接口中添加注解
/**
* 查询全部用户
* @return
*/
@Select("select * from user")
public List<User> getAllUser();
- 在mybatis的核心配置文件中注入
<!--使用class绑定接口-->
<mappers>
<mapper class="com.kailong.mapper.UserMapper"></mapper>
</mappers>
- 测试
@Test
public void testGetAllUser(){
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getAllUser();
for (User user:users){
System.out.println(user);
}
sqlSession.close();
}
- 测试结果
- 利用Debug查看本质
- 本质上利用了jvm的动态代理机制
- Mybatis详细的执行流程
注解增删改
改造MybatisUtils工具类的getSession( ) 方法,重载实现。
//获取SqlSession连接
public static SqlSession getSession(){
return getSession(true); //事务自动提交
}
public static SqlSession getSession(boolean flag){
return sqlSessionFactory.openSession(flag);
}
注意:确保实体类和数据库字段对应
查询
- 编写接口方法注解
/**
* 根据Id查询用户
* @param id
* @return
*/
@Select(" select * from user where id = #{id}")
User selectUserById(@Param("id")int id);
- 测试
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
- 测试结果
新增
- 编写接口方法注解
/**
* 添加用户
* @param user
* @return
*/
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);
- 测试
@Test
public void testAddUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5,"愚生浅末","123456");
int i = mapper.addUser(user);
System.out.println(i);
session.commit(); //提交事务,重点!不写的话不会提交到数据库
session.close();
}
- 测试结果
修改
- 编写接口方法注解
/**
* 根据ID修改用户的信息
* @param user
* @return
*/
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);
- 测试
@Test
public void testUpdateUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(5, "愷龍test", "kailong");
mapper.updateUser(user);
session.close();
}
- 测试结果
删除
- 编写接口方法注解
/**
* 根据Id删除用户
* @param id
* @return
*/
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);
- 测试
@Test
public void testDeleteUser() {
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(5);
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 ('kailong');
使用注解和配置文件协同开发,才是MyBatis的最佳实践!
公众号本文地址:https://mp.weixin.qq.com/s/YsZgx7VtB18PsJkUgn7Ntg
欢迎关注公众号:愚生浅末。