MyBatis注解开发---实现增删查改和动态SQL

目录

相关导读

1. 环境搭建

(1)创建持久层接口,并在接口方法上定义Sql语句  

(2)测试方法 

(3)运行结果

2. 注解实现增删查改

(1)增加用户

(2)删除用户

(3)模糊查询用户

(4)更新用户信息

3. 注解实现动态sql

(1)使用脚本标签实现动态Sql

(2)在方法中构建动态Sql


相关导读

Mybatis专栏:

Mybatis系列专栏 MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

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语句  

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();
}

        由于注解在方法上方,而方法中就有参数类型和返回值类型,所以使用注解开发不需要定义参数类型和返回值类型

        在核心配置文件注册持久层接口,由于没有映射文件,所以只能采用注册接口或注册包的方法。(如下代码段所示)

    <mappers>
        <package name="com.example.mapper"/>
    </mappers>

(2)测试方法 

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)增加用户

添加方法和对应的注解

// 添加用户
    @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 

测试方法

// 测试增删查改方法
    @Test
    public void testADSU(){
        // 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();
}

运行结果

        OK,观察我们确实是添加了凉哥 

(2)删除用户

添加方法和对应的注解

// 删除用户
    @Delete("delete from user where id = #{id}")
    void delete(int id);

测试方法

@Test
    public void testADSU(){
        /*// 新增一个用户
        User user = new User("凉哥","男","北京");
        userMapper.add(user);
        session.commit();*/
        // 删除用户
        userMapper.delete(27);
        session.commit();
}

运行结果

        OK,观察运行结果我们也得知确实是将凉哥给删掉了 

(3)模糊查询用户

添加方法和对应的注解

// 根据用户名模糊查询
    @Select("select * from user where username like #{username}")
    List<User> findByUsernameLike(String username);

测试方法

        我们查询一下姓名带有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)更新用户信息

添加方法和对应的注解

// 更新用户
    @Update("update user set username = #{username},sex=#{sex},address=#{address} where id = #{id}")
    void update(User user);

测试方法

// 测试增删查改方法
    @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 标签:

新增注解方法

// 根据任意条件查询--使用脚本标签
    @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);

        这个是实现对用户名进行模糊查询,性别和地址进行精确查询 

新增测试方法

// 测试任意条件查询--使用脚本标签
    @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

新增注解方法

// 根据任意条件查询--在方法中构建动态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();
    }

新增测试方法

// 测试任意条件查询--方法标签动态生成Sql
    @Test
    public void testFindByConditionSql(){
        User user = new User("an","man","Beijing");
        List<User> all = userMapper.findByCondition(user);
        all.forEach(System.out::println);
    }

运行结果

        OK,确实同样也查询出来了 。

猜你喜欢

转载自blog.csdn.net/qq_53317005/article/details/129648122