MyBatis入门(六)

104 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

特殊SQL的执行

1.模糊查询

/**
* 测试模糊查询
* @param mohu
* @return
*/
List<User> testMohu(@Param("mohu") String mohu);
<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultType="User">
<!--select * from t_user where username like '%${mohu}%'-->
<!--select * from t_user where username like concat('%',#{mohu},'%')-->
select * from t_user where username like "%"#{mohu}"%"
</select>

2.批量删除

/**
     * 批量删除
     * @param ids
     * @return
     */

<!--int deleteMore(@Param("ids") String ids);-->
    <delete id="deleteMore">
    只能使用${}
delete from t_user where id in (${ids})
</delete

3动态设置表名

为了性能,将一张表拆分成多张表进行存储数据
 /**
     * 动态设置表名,查询所有的用户信息
     * @param tableName
     * @return
     */
    List<User> getAllUser(@Param("tableName") String tableName);
mysql中可以加单引号的有:字符串类型的数据,日期类型的数据,当前字段名
    所以需要${tableName}
    <!--List<User> getAllUser(@Param("tableName") String tableName);-->
<select id="getAllUser" resultType="User">
select * from ${tableName}
</select>

4添加功能获取自增的主键

应用场景:有一个一对多的表比如

t_clazz(clazz_id,clazz_name)班级表

t_student(student_id,student_name,clazz_id) 学生表

1、添加班级信息

2、获取新添加的班级的id

3、为班级分配学生,即将某学的班级id修改为新添加的班级的id

/**
* 添加用户信息
* @param user
* @return
* useGeneratedKeys:设置使用自增的主键
* keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参
数user对象的某个属性中
*/
int insertUser(User user);
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{sex})
</insert>
//测试类
@Test
public void insertUser() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
    User user = new User(null, "ton", "123", 23, "男", "123@321.com");
    mapper.insertUser(user);
    System.out.println(user);
    //输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},自增主键存放到了user的id属性中
}

自定义映射resultMap

resultType处理字段和属性的映射关系

resultType处理字段名和实体类中属性名不一样

比如emp_name字段名是empName

public class ResultTestMapper {
    /**
     * 解决字段名和属性名不一致
     * a> 为字段起名,保持和属性名一致
     * b> 设置全局配置,将_映射成驼峰
     在全局配置中添加以下代码
     *<setting name="mapUnderscoreToCamelCase" value="true"/>
     */
    @Test
    public  void  testGetallEmp(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> allEmp = mapper.getAllEmp();
        System.out.println(allEmp);
    }
    
    <!--    List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultType="Emp">
        select  eid, emp_name empName,age,sex,email from t_emp
        select * from t_emp
    </select>
​

resultMap处理字段和属性的映射关系

若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射

<!--
    resultMap:设置自定义映射
属性:
    id:表示自定义映射的唯一标识(主键)
    type:查询的数据要映射的实体类的类型
    子标签:
    id:设置主键的映射关系
    result:设置普通字段的映射关系
    association:设置多对一的映射关系
    collection:设置一对多的映射关系
    属性:
    property:设置映射关系中实体类中的属性名
    column:设置映射关系中表中的字段名
-->
    <resultMap id="empResultMap" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
​
    </resultMap>
<!--    List<Emp> getAllEmp();-->
    <select id="getAllEmp" resultMap="empResultMap">
         select * from t_emp
    </select>