首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis【8】-- Mybatis返回List或者Map以及模糊查询怎么搞?

Mybatis【8】-- Mybatis返回List或者Map以及模糊查询怎么搞?

作者头像
秦怀杂货店
发布2022-02-15 14:27:03
发布2022-02-15 14:27:03
1.7K0
举报
文章被收录于专栏:技术杂货店技术杂货店

代码直接放在Github仓库【https://github.com/Damaer/Mybatis-Learning 】,可直接运行,就不占篇幅了。

  • 1.返回List(查询所有学生)
  • 2.返回Map(查询所有学生,key是名字,value是学生对象)
  • 3.模糊查询

定义获取sqlSession实例的工具类如下:

代码语言:javascript
复制
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtils {
    static private SqlSessionFactory sqlSessionFactory;

    static public SqlSession getSqlSession() {
        InputStream is;
        try {
            is = Resources.getResourceAsStream("mybatis.xml");
            if (sqlSessionFactory == null) {
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            }
            return sqlSessionFactory.openSession();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

1.返回List(查询所有学生)

定义接口:

代码语言:javascript
复制
// 返回所有学生的信息List
public List<Student> selectAllStudents();

使用SqlSession.selectList()这个方法对sql进行调用:

代码语言:javascript
复制
public List<Student> selectAllStudents() {
        List<Student> students ;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            students = sqlSession.selectList("selectAllStudents");
            //查询不用修改,所以不用提交事务
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
        return students;
    }

sql语句如下,返回类型是Student,这里写的是别名,这是因为定义过别名,否则需要写全路径名:

代码语言:javascript
复制
    <!-- 查询列表 -->
    <!-- 系统不知道返回封装为什么类型,所以要注明返回类型 -->
    <select id="selectAllStudents" resultType="Student">
        select id,name,age,score from student
        <!-- 如果数据库为tid,tname,tage,那么我们可以使用别名
        select tid id,tname name,tage age,tscore score from student -->
    </select>

2.返回Map(查询所有学生,key是名字,value是学生对象)

定义接口:

代码语言:javascript
复制
// 返回所有学生的信息Map
public Map<String, Object> selectAllStudentsMap();

接口实现类,使用selectMap(),里面有两个参数,一个是sql的id,一个是需要当成key的字段,注意,如果这个key在数据表里面有重复的,那么后面查出来的value会覆盖掉前面的value:

代码语言:javascript
复制
public Map<String, Object> selectAllStudentsMap() {
        Map<String ,Object> map=new HashMap<String, Object>();
        /**
         * 可以写成Map<String ,Student> map=new HashMap<String, Student>();
         */
        try {
            sqlSession=MyBatisUtils.getSqlSession();
            map=sqlSession.selectMap("selectAllStudents", "name");
            //查询不用修改,所以不用提交事务
        } finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
        return map;
    }

sql语句:用的同样是返回List的sql语句,其实这个map的处理是map=sqlSession.selectMap("selectAllStudents", "name");这句话帮我们处理的。

代码语言:javascript
复制
    <!-- 查询列表 -->
    <!-- 系统不知道返回封装为什么类型,所以要注明返回类型 -->
    <select id="selectAllStudents" resultType="Student">
        select id,name,age,score from student
        <!-- 如果数据库为tid,tname,tage,那么我们可以使用别名
        select tid id,tname name,tage age,tscore score from student -->
    </select>

3.模糊查询

我们需要查询名字的时候一般是模糊查询。那么使用下面的sql即可:

代码语言:javascript
复制
    <!-- 模糊查询-->
    <!-- 不能写成'%#{name}%' -->
    <!-- 可以写成这样,也就是使函数拼接 select id,name,age,score from student where name like concat('%',#{xxx},'%') -->
    <!-- 也可以写成这样,‘’引起来的是写死的,而变量是不可以引起来的select id,name,age,score from student where name like '%' #{xxx} '%' -->
    <!-- '%' #{xxx} '%'中间必须有空格,要不就无效了 -->
    <select id="selectStudentsByName" resultType="Student">
        <!--最常用的(动态参数) select id,name,age,score from student where name like '%' #{name} '%' -->
        <!-- 下面的是字符串拼接 ,只能写value,了解即可,容易sql注入,执行效率低,不建议使用-->
        select id,name,age,score from student where name like '%${value}%'
    </select>

值得注意的是关于占位符的问题,如果只是一个int类型传进来,如果使用#,我们不需要和传入的名字一样,比如#{}里面写xxx都可以:

代码语言:javascript
复制
<!-- 删除 -->
    <delete id="deleteStudentById" >
        delete from student where id=#{xxx}
        <!-- 这里的id放什么都可以,只是一个占位符,不表示什么 -->
    </delete>

当传入的是对象,那么我们就不能随便写了,因为随便写就不知道用哪一个属性了。

代码语言:javascript
复制
<update id="updateStudent">
 update student set name=#{name},age=#{age},score=#{score} where id=#{id}
</update>

如果我们使用

{},那么当传进来一个

{value},里面写id都是不可以的,必须写value

代码语言:javascript
复制
<select id="selectStudentById" resultType="Student">
 select * from student where id=${value}
</select>

模糊查询的时候,以下方式是拼接的模式,容易被sql注入,所以我们一般不推荐:

代码语言:javascript
复制
<select id="selectStudentsByName" resultType="Student">
    <!-- 下面的是字符串拼接 ,只能写value,了解即可,容易sql注入,执行效率低,不建议使用-->
    select id,name,age,score from student where name like '%${value}%'
</select>

注意不可以写成 '%#{name}%' ,拼接的必须使用 $ 符号。可以使用函数进行连接:

代码语言:javascript
复制
<select id="selectStudentsByName" resultType="Student">
    select id,name,age,score from student where name like concat('%',#{xxx},'%')
</select>

当然也可以不使用函数,注意 '%' 与 #{name} 之间是有空格的,要不会报错,这种是我们比较推荐的,也就是动态参数,可以极大减少sql注入的风险:

代码语言:javascript
复制
<select id="selectStudentsByName" resultType="Student">
    select id,name,age,score from student where name like '%' #{name} '%'
</select>

【作者简介】: 秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秦怀杂货店 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.返回List(查询所有学生)
  • 2.返回Map(查询所有学生,key是名字,value是学生对象)
  • 3.模糊查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档