1. 环境搭建
MyBatis可以使用注解替代映射文件。映射文件的作用就是定义Sql语句,可以在持久层接口上使用 @Select/@Delete/@Insert/@Update定义Sql语句,这样就不需要使用映射文件了。 1 创建maven工程,引入依赖(可以直接复制之前maven工程的pom.xml文件) 2 创建mybatis核心配置文件SqlMapConfig.xml 3 将log4j.properties文件放入resources中,让控制台打印SQL语句。 4 创建实体类(直接吧之前的实体类cv过来即可)
(1)创建持久层接口,并在接口方法上定义Sql语句
代码语言:javascript复制package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
// 查询所有用户
@Select("select * from user")
List<User> findAll();
}
代码语言:javascript复制由于注解在方法上方,而方法中就有参数类型和返回值类型,所以使用注解开发不需要定义参数类型和返回值类型 在核心配置文件注册持久层接口,由于没有映射文件,所以只能采用注册接口或注册包的方法。(如下代码段所示)
<mappers>
<package name="com.example.mapper"/>
</mappers>
(2)测试方法
代码语言:javascript复制import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class testUserMapper {
InputStream is = null;
SqlSession session = null;
UserMapper userMapper = null;
@Before
public void before() throws Exception{
is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
session = factory.openSession();
userMapper = session.getMapper(UserMapper.class);
}
@After
public void after() throws Exception{
session.close();
is.close();
}
@Test
public void testFindAll(){
List<User> all = userMapper.findAll();
all.forEach(System.out::println);
}
}
(3)运行结果
实现的效果也是和使用映射文件一样的。
2. 注解实现增删查改
(1)增加用户
添加方法和对应的注解
代码语言:javascript复制// 添加用户
@SelectKey(keyColumn = "id",keyProperty = "id",resultType = int.class,before = false,statement = "SELECT LAST_INSERT_ID()")
@Insert("insert into user(username,sex,address) values(#{username},#{sex},#{address})")
void add(User user);
其实这里已经使用了主键回填功能,新增用户的时候无需设置用户id
测试方法
代码语言:javascript复制// 测试增删查改方法
@Test
public void testADSU(){
// 新增一个用户
User user = new User("凉哥","男","北京");
userMapper.add(user);
session.commit();
}
运行结果
点击这里查看运行结果
添加描述
OK,观察我们确实是添加了凉哥
(2)删除用户
添加方法和对应的注解
代码语言:javascript复制// 删除用户
@Delete("delete from user where id = #{id}")
void delete(int id);
测试方法
代码语言:javascript复制@Test
public void testADSU(){
/*// 新增一个用户
User user = new User("凉哥","男","北京");
userMapper.add(user);
session.commit();*/
// 删除用户
userMapper.delete(27);
session.commit();
}
运行结果
添加描述
OK,观察运行结果我们也得知确实是将凉哥给删掉了
(3)模糊查询用户
添加方法和对应的注解
代码语言:javascript复制// 根据用户名模糊查询
@Select("select * from user where username like #{username}")
List<User> findByUsernameLike(String username);
测试方法
代码语言:javascript复制我们查询一下姓名带有man的看看
// 测试增删查改方法
@Test
public void testADSU(){
/*// 新增一个用户
User user = new User("凉哥","男","北京");
userMapper.add(user);
session.commit();
// 删除用户
userMapper.delete(27);
session.commit();*/
// 根据用户名模糊查询
List<User> users = userMapper.findByUsernameLike("%man%");
users.forEach(System.out::println);
}
运行结果
OK,通过与数据库表进行对比,确实是查询出来了
(4)更新用户信息
添加方法和对应的注解
代码语言:javascript复制// 更新用户
@Update("update user set username = #{username},sex=#{sex},address=#{address} where id = #{id}")
void update(User user);
测试方法
代码语言:javascript复制// 测试增删查改方法
@Test
public void testADSU(){
/*// 新增一个用户
User user = new User("凉哥","男","北京");
userMapper.add(user);
session.commit();
// 删除用户
userMapper.delete(27);
session.commit();*/
// 根据用户名模糊查询
/*List<User> users = userMapper.findByUsernameLike("%man%");
users.forEach(System.out::println);*/
// 更新用户
User user1 = new User(24,"哈士奇","女","上海外滩");
userMapper.update(user1);
session.commit();
}
我们将哈哥的数据修改一下,看看是否能够成功修改
运行结果
添加描述
OK,确实是成功进行了修改了
3. 注解实现动态sql
前言,不过有一说一,这个注解开发动态Sql实现要比映射文件要难,符号要找对。 MyBatis注解开发中有两种方式构建动态Sql:
(1)使用脚本标签实现动态Sql
将Sql 嵌套在 <script> 内即可使用动态 Sql 标签:
新增注解方法
代码语言:javascript复制// 根据任意条件查询--使用脚本标签
@Select("<script>"
"select * from user n"
" <where>n"
" <if test=""
" username != null and username.length() !=0 ">n"
" username like '%${username}%'n"
" </if>n"
" <if test="sex != null and sex.length() != 0">n"
" and sex = #{sex}n"
" </if>n"
" <if test="address != null and address.length() != 0">n"
" and address = #{address}n"
" </if>n"
" </where>"
"</script>")
List<User> findByCondition(User user);
这个是实现对用户名进行模糊查询,性别和地址进行精确查询
新增测试方法
代码语言:javascript复制// 测试任意条件查询--使用脚本标签
@Test
public void testFindByCondition(){
User user = new User("an","man","Beijing");
List<User> all = userMapper.findByCondition(user);
all.forEach(System.out::println);
}
查询名字带有an,并且性别是man,地址是Beijing的User.
运行结果
添加描述
添加描述
OK,确实是将符合要求的用户都查询出来了
(2)在方法中构建动态Sql
在MyBatis中有 @SelectProvider 、 @UpdateProvider 、 @DeleteProvider 、 @InsertProvider 注解。当使用这些注解时将不在注解中直接编写SQL, 而是调用某个类的方法来生成SQL。
新增注解方法
代码语言:javascript复制// 根据任意条件查询--在方法中构建动态sql
@SelectProvider
default String findByConditionSql(User user){
StringBuffer sb = new StringBuffer("select * from user where 1 = 1");
if(user.getUsername()!=null && user.getUsername().length()!=0){
sb.append("and username like '%${username}%'");
}
if(user.getSex()!=null && user.getSex().length()!=0){
sb.append("and sex = #{sex}");
}
if(user.getAddress()!=null && user.getAddress().length()!=0){
sb.append("and address = #{address}");
}
return sb.toString();
}
新增测试方法
代码语言:javascript复制// 测试任意条件查询--方法标签动态生成Sql
@Test
public void testFindByConditionSql(){
User user = new User("an","man","Beijing");
List<User> all = userMapper.findByCondition(user);
all.forEach(System.out::println);
}
运行结果
OK,确实同样也查询出来了 。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!