在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;)。
记录下,以便回顾。