注解:
使用注解后,就不在使用xml文件,但是需要在mybatis-config.xml中绑定接口。
本质
:反射机制实现
底层
:动态代理
mybatis详细执行流程
:
常用注解
:
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
下面来看具体使用方法:
@Param
:
- 基本类型或String类型参数需要加上。
- 引用类型不需要加
- 如果还有一个基本类型,可以忽略
- 在SQL语句中引用的就是@Param里面的属性。
#{}和${}区别
:
-
#{}是预编译处理,${}是字符串替换。
-
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。
-
使用#{}可以有效的防止SQL注入,提高系统安全性。
-
String 类型 String qwe, name =${} 后为 name = qwe
-
String 类型 String qwe, name =#{} 后为 name = ‘qwe’
查询:
使用步骤:
1.绑定接口
<!--绑定接口-->
<mappers>
<mapper class="dao.UserMapper"/>
</mappers>
2.注解接口
//查询所有用户
@Select("select * from user")
List<User> getUserList();
//根据id查询用户
@Select("select * from user where id=#{id}")
User getUserById(@Param("id") int id);
3.测试
@Test
public void testZhuJie(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> userList= userMapper.getUserList();
for (User user : userList) {
System.out.println(user);
}sqlSession.close();
}
4.测试结果
增加:
增删改需要提交事务。我们在工具类中实现。使得openSession为True,就是自动提交事务了。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
1.注解接口
//增加用户
@Insert("insert into user(id,name,password) values(#{id},#{name},#{password})")
int addUser(User user);
2.测试:
@Test
public void testZhuJie(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
userMapper.addUser(new User(7,"老王","12345"));
sqlSession.close();
}
3.测试结果:
修改:
1.注解接口:
//修改用户
@Update("update user set name=#{name},password=#{password} where id=#{id}")
int updateUser(User user);
2.测试:
@Test
public void testZhuJie(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
userMapper.updateUser(new User(7,"小明","12345"));
sqlSession.close();
}
3.测试结果:
删除:
1.编写接口:
//删除用户
@Delete("delete from user where id=#{id}")
int deleteUser(@Param("id") int id);
2.测试:
@Test
public void testZhuJie(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(5);
sqlSession.close();
}
3.测试结果: