MyBatis学习笔记②

139 阅读3分钟

各种查询功能

  1. 若查询出一条数据则可通过实体类对象接收结果
  2. 若查询出多条数据则一定不能通过实体类对象接收结果,此时会抛异常TooManyResultsException\

这两种情况,一个实体类,一个List集合

public interface SelectMapper {

    /**
     * 根据id查询用户信息
     */
    User getUserById(@Param("id") Integer id);

    /**
     * 查询所有的用户
     */
    List<User> getAllUser();
}
<!--getUserById(@Param("id") Integer id)-->
<select id="getUserById" resultType="User">
    select * from t_user where id = #{id}
</select>

<!--getAllUser();-->
<select id="getAllUser" resultType="User">
    select * from t_user
</select>
@Test
public void testGetUserById() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    System.out.println(mapper.getUserById(3));
}

@Test
public void  testGetAllUser() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    System.out.println(mapper.getAllUser());
}

注意一下int和Integer的小差别!!!
int默认为0,Integer默认为null,所以Integer只要不是NULL有数据就好使。

image.png

这里呢,各种int,Integer,Int等都可以通用,因为mybatis已经设置了别名!

别名

  1. java.lang.Integer->int,integer
  2. int->_int,_integer
  3. Map->map
  4. String->string

还有第三种!
搞一个Map集合
注意@Param{"id"}中的双引号哦!!!!!

/**
 * 根据id查询用户信息为一个map集合
 */
Map<String, Object> getUserByIdToMap(@Param("id") Integer id);
<!--Map<String, Object> getUserByIdToMap(@Param(id) Integer id)-->
<select id="getUserByIdToMap" resultType="Map">
    select * from t_user where id = #{id}
</select>
@Test
public void testGetUserByIdToMap() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    System.out.println(mapper.getUserByIdToMap(7));
}

若查询结果与实体类没有对应,那么就直接返回一个map,字段为键,字段的值为值。

1. 如果类中的字段不被外界访问,仅在类的内部应用,那么就直接定义成字段
2. 如果类中的字段可能被外界访问并且操作,那么就将字段定义成属性

不知道为什么老师开始套娃List<Map<String, Object>>List<User>

介绍了一个@mapKey("获取到的作为key的字段")like this,多条数据还可以这样搞的!!

image.png

如此总结一下,唉!

  • 单条数据 实体类、List集合、Map集合
  • 多条数据 实体类的List集合、Map类的List集合、@mapKey注解(赞美框架!!!)

特殊的SQL语句

特殊在哪呢?特殊在要用${}

模糊查询

<!--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>
/**
* 测试模糊查询
* @param mohu
* @return
*/
List<User> testMohu(@Param("mohu") String mohu);

'%#{}%'这种东西不会被看成占位符的,#{}直接变成字符串了

批量删除

比如批量删除邮件这种

/**
* 批量删除
* @param ids
* @return
*/
int deleteMore(@Param("ids") String ids);
<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
delete from t_user where id in (${ids})
</delete>

注意mysql8.0中不能使用#{},因为它会自动加单引号。弹幕中讲了“实际中一般使用foreach拼接动态删除语句”

动态设置表名

/**
 * 动态设置表名,查询所有的用户信息
 * @param tableName
 * @return
*/
List<User> getAllUser(@Param("tableName") String tableName);
<!--List<User> getAllUser(@Param("tableName") String tableName);-->
<select id="getAllUser" resultType="User">
select * from ${tableName}
</select>

添加功能获取自增的主键

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>

主要使用了这个useGeneratedKeys="true" keyProperty="id"标签!

构造方法快捷键,又忘记了“atl+insert”!超级方便,IDEA yyds!!!

实体类中的字段名与数据库中的属性名不一致了哦!要搞一个自动映射!

<!--
resultMap:设置自定义映射
    属性:
        id:表示自定义映射的唯一标识
        type:查询的数据要映射的实体类的类型
    子标签:
        id:设置主键的映射关系
        result:设置普通字段的映射关系
        association:设置多对一的映射关系
        collection:设置一对多的映射关系
    属性:
        property:设置映射关系中实体类中的属性名
        column:设置映射关系中表中的字段名
-->
<resultMap id="userMap" type="User">
    <id property="id" column="id"></id>
    <result property="userName" column="user_name"></result>
    <result property="password" column="password"></result>
    <result property="age" column="age"></result>
    <result property="sex" column="sex"></result>
</resultMap>
<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultMap="userMap">
    <!--select * from t_user where username like '%${mohu}%'-->
    select id,user_name,password,age,sex from t_user where user_name like concat('%',#{mohu},'%')
</select>

<setting name="mapUnderscoreToCamel" value="true"/>

啊就学到这里了。。。