MyBatis 中SQL语句怎么样使用两种类型的参数带条件查询

MyBatis 中SQL语句怎么样使用两种类型的参数带条件查询,第1张

最简单的直接设置resultType=“map”,得到的就是一个List<Map<String,Object>>

每一个Map的key就是查询结果的列名,也就是表的字段名。当然sql语句中最好as一下

复杂一点可以自定义一个resultMap标签

<resultMap id="result" type="javautilMap">

<result property="c1" column="column1"/>

<result property="c2" column="column2"/>

</resultMap>

其中result可以自定义,select标签中的resultMap="result",和上面的resultMap标签的id对应

property设置的是自定义的字段名称,也就是结果集中每一个Map的key

column设置查询结果的字段名称

然后通过

for(List<Map<String,Object> map:list){

mapget("c1");//获取c1对应的字段的值

。。。

}

SqlSessionFactoryBuilder 的实例化分两步。第一步 解析配置文件 得到configuration对象,第二步实例化DefaultSqlSessionFactory记录configuration。

sqlSessionFactoryopenSession()这一步就厉害了,完成了事务管理对象实例化、执行器实例化、执行器代理(拦截器链)。到这一步为止完成了defaultSqlSessionFactory会话创建。

sqlSessiongetMapper()是通过从configuration的mapperRegistry中获取mapperclass的MapperProxyFactory对象,再用MapperProxyFactory对象生产出一个MapperProxy的代理对象。到这里完成了对mapper类代理对象的创建,后续调用mapper类的方法时将会由mapperProxy处理。

userMapperqueryUser()真正做事的时候到了。由上文可知mapper类的方法被调用时将会由mapperProxy代替处理,所以第一站就是mapperProxy的invoke()

由下图可知,缓存的位置位于CachingExecutor中的localCache,

而Executor是在openSession时创建,由此可知一级缓存是sqlSesssion级别的。

cacheKey的组成:ms, parameter, rowBounds, boundSql

由下图可知,二级缓存与MappedStatement有关,在MappedStatement中共享一个Cache对象,而MappedStatement位于configuration,所以二级缓存可以跨sqlSession。

查询语句是 MyBatis 中最常用的元素之一,本文涉及mybatis的单表查询 *** 作,关联表有关的查询会后续补充。

巧妇难为无米之炊,要想从数据库中表中取出数据并转化为javaBean,所以,我们要先准备javabean以及与其对应的数据表。

javaBean:

public class President {

private int id;

private String name;

@Override

public String toString() {

return "President [id=" + id + ", name=" + name + "]";

}

//get set 方法

}

创建两个对应的数据库表,并插入两条数据:

create table president1(

p_id int not null auto_increment primary key,

p_name varchar(50) not null

);

insert into president1(p_name) values('lily'),('Tom');

create table president2(

id int not null auto_increment primary key,

name varchar(50) not null

);

insert into president2(name) values('lily'),('Tom');

创建两个数据库是为了测试两个不同的查询状况,

数据库字段名与实体类属性名相同

从sql表可以看出president2的字段名与javabean:President的属性名完全相同,这种情况下mybatis的select *** 作非常简单:

<!-- 从表 president2中查询-->

<select id="getPreByIdPresident2" parameterType="int" resultType="President">

select from president2 where id=#{id}

</select>

此时mybatis运用反射机制会将查询返回的结果(id,name)封装成President对象。

如果从表president1中查询,同样采用上面的sql语句

<!-- 从表 president1中查询-->

<select id="getPreByIdPresident1" parameterType="int" resultType="President">

<span style="white-space:pre"> </span>President p1 = sessionselectOne(statement+"getPreByIdPresident1", 1);

<span style="white-space:pre"> </span>Systemoutprintln("表president1中查询"+p1);

</select>

此时如果用getPreByIdPresident1进行查询,返回的结果会是null,我们将上面的sql语句在mysql中执行下:

有结果返回,但是返回的字段名为(p_id,p_name)这种结果mybatis在解析时无法与President类对应。多数情况下实体类属性名与数据库表的字段名都会有差异,这种情况如果mybatis不能处理也就太low了。

数据库字段名与实体类属性名不相同

mybatis针对该种情况有两种解决方法,但是归根到底都是同一种实现。

Method1:定义一个ResultMap将数据库字段名与实体类属性名做个映射

我们欲从表president1中查询数据,此时的mapper配置如下:

<resultMap type="President" id="getFromPresident2">

<!-- 主键必须用id标签映射,其他的用非集合用result映射 集合类用collection映射 -->

<!-- column为数据库字段名,property为实体类属性名 -->

<id column="p_id" property="id" />

<result column="p_name" property="name" />

</resultMap>

<select id="getPreByIdPresident1Method1" resultMap="getFromPresident2">

select from president1 where p_id=#{id}

</select>

首先定义了一个resultMap,将数据库表的字段名与实体类属性名做了一一对应,其中type为实体类(此处运用的类别名),id为了在select标签中引用映射结果。

在select标签中并没有用resultType属性,而使用了resultMap,即为上面定义的resultMap,mybatis会根据resultMap中的映射关系去构造President

Method1:直接在sql语句中使用别名

<!-- 从表 president1中查询 -->

<select id="getPreByIdPresident1Method2" resultType="President">

select p_id id,p_name name from president1 where p_id=#{id}

</select>

这种方法会查到实际的数据,这种方法与字段名和属性名相同都是基于相同的原理:MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到JavaBean 的属性上。即mybatis底层都是通过创建ResultMap来进行关系的映射,与method1原理相同。。

使用MyBatis过程中无可避免的要用到动态SQL做查询;有关MyBatis动态SQL的基础不在此记录,需要的同学可以去MyBatis官网查手册。

本文要解决的问题如下:

生成动态SQL时需要支持的内容:

通用 where 的 xml 配置段如下:

通用数据结构声明如下:

最好使用Builder来构造 Filter和List<Filter> 。

以上就是关于MyBatis 中SQL语句怎么样使用两种类型的参数带条件查询全部的内容,包括:MyBatis 中SQL语句怎么样使用两种类型的参数带条件查询、mybatis执行sql、mybatis注解怎么解决字段名与属性名不同的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9737269.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存