springboot整合mybatis时,sql相关注解的使用 以及 实体类数据库表字段映射

在springboot整合mybatis时我们常用某某mapper.xml文件来进行我们sql的编写,相信大家都很熟悉了。
这里主要是介绍一下注解的使用:
1.首先是@Select()、@Update()、@Delete()、@Insert()类型的使用
我们可以直接在mapper接口的方法上使用该注解,注解中写我们的sql语句即可。
示例:

	/**
     * 根据用户名查询
     * @param username
     * @return
     */
    @Select("select * from t_user where username=#{username}")
    User findUserByName(@Param("username") String username);

测试一下:

@SpringBootTest
@RunWith(SpringRunner.class)
class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    void findUserByName() {
        User user = userMapper.findUserByName("zhangsan");
        System.out.println(user);
    }
}

结果如下:在这里插入图片描述
类似地,增、删、改依然可以使用这种方法,再举个栗子:

	/**
     * 添加用户
     * @param user
     * @return
     */
    @Insert("insert into t_user(username,password,salt,token) values(#{userName},#{password},#{salt},#{token})")
    int addUser(User user);

2.有人会问了,那如果是复杂的动态sql呢?这里我们会使用另一个注解类型:@UpdateProvider()、@SelectProvider()、@DeleteProvider()、@InsertProvider(),这个注解有两个重要的参数:
type:表示我们的sql语句在哪个类中
method:表示我们的sql语句在哪个方法中(方法名自定义,为了方便对应,这里取了跟接口方法一样的名字)
用这两个参数就可以精确的知道我们的sql语句来源。
示例:

/**
     * 更新用户
     * @param user
     * @return
     */
    @UpdateProvider(type = UserSQL.class,method = "updateUserById")
    int updateUserId(@Param("user") User user);

下面是我们的sql类,其中有个updateUserByName方法,通过匿名内部类,大括号代码块的形式拼出我们的sql.

package com.qf.springbootmybatis.sql;

import com.qf.springbootmybatis.pojo.User;
import org.apache.ibatis.jdbc.SQL;

import java.util.Map;

public class UserSQL {

    public String updateUserById(Map<String,Object> map){
        User user = (User) map.get("user");
        String sql = new SQL() {
            {
                UPDATE("t_user");
                if (user.getUserName()!=null && user.getUserName()!="")
                SET("username=#{user.userName}");
                SET("password=#{user.password}");
                SET("salt=#{user.salt}");
                SET("token=#{user.token}");
                WHERE("id=#{user.id}");
            }
        }.toString();

        return sql;
    }
}

测试一下:

@Test
    void updateUserId(){
        User user1 = userMapper.findUserById(1);//此处查寻一个数据用于后面更新方法的参数

        user1.setPassword("abcd");
        user1.setSalt("666");
        int i = userMapper.updateUserId(user1);
        System.out.println("跟新结果:"+i);
    }

结果:
在这里插入图片描述
解释一下sql类:
动态sql中会用到一些判断,所以我们需要将接口方法中的参数在sql方法中获取到,只需要在sql方法传入一个map,通过map来获取到我们接口中的参数:

User user = (User) map.get(“user”);

在sql类中通过new的形式创建sql语句,并且在if判断中就使用到了我们的user.

关于实体类数据库表字段映射:

示例:

/**
     * 根据id查询游戏角色
     */
    @Select("select * from t_role where id = #{id}")
    @Results({
            @Result(column = "role_name",property = "roleName"),
            @Result(column = "role_sex",property = "roleSex")
    })
    Role findRoleById(int id);

数据库:
在这里插入图片描述
测试一下:

@Test
    void findRoleById(){
        Role role = userMapper.findRoleById(1);
        System.out.println(role);
    }

结果:
在这里插入图片描述

关于实体类数据库表字段映射的处理思路,具体操作自行百度:

第一种:如果我们的实体类遵从标准的驼峰式命名,可以在配置文件中开启自动驼峰转下划线的开关即可。
第二种:通过在mapper.xml中建立resultMap映射关系来解决。
第三种:在sql语句中通过字段重命名(as)的方式来解决,as后面为实体类属性(select user_name as userName from t_user;)。

记录下,以便回顾。

你可能感兴趣的:(初识java)