MyBatis_05(各种查询功能)

MyBatis各种查询功能:

 如果查询出的数据只有 "一条",可以通过:

1-实体类对象接收
2-List集合接收
3-Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}

2-如果查询出的数据有 "多条",一定不能用"实体类对象"接收,会抛异常 "TooManyResultsException",可以通过

 1-实体类类型的"LIst集合"接收
 2-Map类型的"LIst集合"接收
 3-在mapper接口的方法上添加@MapKey注解

1-"查询功能"案例:

  • 1.1查询 "一个" 实体类对象

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

<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User">
	select * from t_user where id = #{id}
</select>

@Test
        public void testGetUserById(){
            SqlSession sqlSession = SqlSessionUtils.getSession();
            SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
            User userById = mapper.getUserById(3);
            System.err.println(userById);
            sqlSession.close();
        }
  • 1.2-查询 "一个" List集合

/**
 * 查询所有用户信息
 * @return
 */
List<User> getUserList();
<!--List<User> getUserList();-->
<select id="getUserList" resultType="User">
	select * from t_user
</select>
@Test
    public void testGetAllUser(){
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<User> userById = mapper.getAllUser();
        for (User u:userById) {
            System.err.println(u);
        }
        sqlSession.close();
    }
  • 1.3-查询"(表的数据个数)" --> ("表"有多少条数据)

/**  
* 查询用户的总记录数  
* @return  
* 在MyBatis中,对于Java中常用的类型都设置了类型别名  
* 例如:java.lang.Integer-->int|integer  
* 例如:int-->_int|_integer  
* 例如:Map-->map,List-->list  
*/  
int getCount();

<!--int getCount();-->
<select id="getCount" resultType="_integer">
	select count(id) from t_user
</select>

@Test
    public void testCount() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Integer count = mapper.getCount();
        System.err.println(count);
    }
  • 1.4-查询 "一条数据" 为 "map集合":

(用 "Map集合" 来接收 "表的数据",以"字段为Key,字段的值为Vaule")

/**  
 * 根据用户id查询用户信息为map集合  
 * @param id  
 * @return  
 */  
Map<String, Object> getUserToMap(@Param("id") int id);

<!--Map<String, Object> getUserToMap(@Param("id") int id);-->
<select id="getUserToMap" resultType="map">
	select * from t_user where id = #{id}
</select>
<!--结果:{password=123456, sex=男, id=1, age=23, username=admin}-->

 @Test
    public void testGetUserToMap() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map<String, Object> userToMap = mapper.getUserToMap(3);
        System.err.println(userToMap);
    }
  • 1.5-查询 "多条数据" 为map集合("两种方法")

  • 1.5.1- 方法一:List<Map<String, Object>>

/**  
 * 查询所有用户信息为map集合  
 * @return  
 * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取  
 */  
List<Map<String, Object>> getAllUserToMap();

<!--Map<String, Object> getAllUserToMap();-->  
<select id="getAllUserToMap" resultType="map">  
	select * from t_user  
</select>
<!--
	结果:
	[{password=123456, sex=男, id=1, age=23, username=admin},
	{password=123456, sex=男, id=2, age=23, username=张三},
	{password=123456, sex=男, id=3, age=23, username=张三}]
-->
@Test
    public void testGetAllUserToMap() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<Map<String, Object>> allUserToMap = mapper.getAllUserToMap();
        System.err.println(allUserToMap);
    }
  • 1.5.2-方法二:@MapKey("id")

/**
 * 查询所有用户信息为map集合
 * @return
 * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
 */
@MapKey("id")
Map<String, Object> getAllUserToMap2();

<!--Map<String, Object> getAllUserToMap2();-->
<select id="getAllUserToMap2" resultType="map">
	select * from t_user
</select>
<!--
	结果:
	{
	1={password=123456, sex=男, id=1, age=23, username=admin},
	2={password=123456, sex=男, id=2, age=23, username=张三},
	3={password=123456, sex=男, id=3, age=23, username=张三}
	}
-->

@Test
    public void testGetAllUserToMap2() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map<String, Object> allUserToMap = mapper.getAllUserToMap2();
        System.err.println(allUserToMap);
    }

2-特殊SQL的执行:

  • 2.1-模糊查询

/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 * @date 2022/2/26 21:56
 */
List<User> getUserByLike(@Param("username") String username);

 <!--    List<User> getUserByLike(@Param("username") String username);-->
    <select id="getUserByLike" resultType="User">
        <!--select * from t_user where username like '%${username}%'-->
        <!--select * from t_user where username like concat('%',#{username},'%')-->
        select * from t_user where username like "%"#{username}"%" //这个最经常用
    </select>
@Test
    public void testGetAllUserToMap2() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        List<User> a = mapper.getUserByLike("a");
        System.err.println(a);
    }
  • 2.2-批量删除:

细节点:
   *只能使用${},不能使用#{}
       
       因为:
           ${}:delete from t_user where id in (1,2,3)
           #{}:delete from t_user where id in ('1,2,3')  //不行
 
原因:#{}在MyBatis会自动生成 ' ' 号。
/**
 * 根据id批量删除
 * @param ids 
 * @return int
 * @date 2022/2/26 22:06
 */
int deleteMore(@Param("ids") String ids);

<delete id="deleteMore">
	delete from t_user where id in (${ids})
</delete>

//测试类
@Test
public void deleteMore() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
	SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
	int result = mapper.deleteMore("1,2,3,8");
	System.out.println(result);
}

  • 2.3-动态设置表名:

连接了"数据库",但是有很多"表"需要查询,就可以 "动态设置表名"

细节:
     只能使用${},因为 "表名" 不能加单引号
/**
     * 查询指定表中的数据
     * @param tableName
     * @return java.util.List<com.atguigu.mybatis.pojo.User>
     * @date 2022/2/27 14:41
     */
    List<User> getUserByTable(@Param("tableName") String tableName);
<!--List<User> getUserByTable(@Param("tableName") String tableName);-->
    <select id="getUserByTable" resultType="User">
        select * from ${tableName}
    </select>
@Test
    public void getUserByTable() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        SqlMapper mapper = sqlSession.getMapper(SqlMapper.class);
        List<User> userByTable = mapper.getUserByTable("t_user");
        System.out.println(userByTable);
    }
  • 2.4-添加功能获取自增的主键

理解:在 "添加一条信息后,可以返回这个信息在表中的id值"

使用场景:
t_clazz(clazz_id,clazz_name)
t_student(student_id,student_name,clazz_id)

添加班级信息
获取新添加的班级的id
为班级分配学生,即将某学的班级id修改为新添加的班级的id
/**
 * 添加用户信息
 * @param user 
 * @date 2022/2/27 15:04
 */
void insertUser(User user);

注意点:
1-useGeneratedKeys:设置使用自增的主键

2-keyProperty:因为增删改有统一的返回值是受影响的行数,
因此只能将获取的自增的主键放在传输的参数user对象的某个属性中

<!--void insertUser(User user);
    useGeneratedKeys:设置使用自增的主键
    keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
    -->

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
    </insert>
//测试类
    @Test
    public void insertUser() {
        SqlSession sqlSession = SqlSessionUtils.getSession();
        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属性中
    }

posted on 2023-02-21 22:40  陈嘻嘻-  阅读(18)  评论(0编辑  收藏  举报

导航