洞察如何利用移动警务平台提高安全保障效率,数字化转型助力合规运营
961
2023-04-28
利用MyBatis实现条件查询的方法汇总
SQL映射文件
Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处。
它的功能强大,SQL映射文件的配置却比较简单。
使用SQL映射文件可以减少50%以上的代码量。
Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,下面是SQL映射文件的几个顶级元素配置
1、mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespace绑定某个接口之后,就可以不写该接口的实现类,因为mybatis会根据接口的完整名称来找到对应的mapper配置来执行SQL语句。因此namespace的命名必须跟你设置的接口同名比如
2.cache:配置给命名空间的缓存
eviction="FIFO" flushInterval="60000" size="512" readOnly="true" /> 在mapper文件配置支持cache后如果需要对个别查询进行调整,可以单独设置cache,代码如下 select id from text where id = 1 由于Mybatis框架不擅长缓存查询结果数据集,所以不对它进一步了解,所以采用OSCahe,Memcached等专门的缓存服务器做更为合理。 3.cache-ref:从其他命名空间引用缓存 4.resultMap:用于描述数据库结果集合对应关系 5.SQL:可以重用的SQL 块,也可以被其他语句引用 6.insert:映射插入语句 7.delete:映射删除语句 8.update:映射更新语句 9.映射查询语句 使用SELECT完成单条件查询 Select 元素的属性 id 命名空间中唯一的标识符,可以被用来引用这条语句 ParameterType 表示查询语句传入参数的类型的完全限定名或别名,它支持基础数据类型和复杂数据类型 除了内建的类型别名外,还可以为自定义的类设置别名,该表格只列出了部分映射,其他的别名请参考mybatis的帮助文档,ResultType 查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的 select * from text where name = #{name} 这是一个 id为 selectTest的SQL映射语句 ,它的参数类型为 string 也可为复杂类型,返回值是 User类型,如果使用类 做返回值的话 类中的字段设置的和数据库表的字段一致,这样可以使数据库和类中的属性自动匹配以便开发(注意如果数据库表和实体类的属性命名不一样则需要手动配置),参数类型为 #{参数名} 它会告诉Mybatis生成PreparedStatement参数 ,对于JDBC该参数会被识别成 ? 若采用JDBC来实现代码如下: String sql = "select * from text where name = ? "; PreparedStatement ps = new PreparedStatement(sql); ps.setString(1,name); 由此看出,Mybatis可以节省大量的代码,如果想完成复杂一些的查询或者让配置文件更简洁些,这就需要了解select元素的属性和mybatis配置文件的属性, 介绍属性: id:命名空间中的唯一标识符,可以被用来引用这条语句 parameterType:表示查询语句传入的参数的类型的完全限定名或别名 resultType:查询语句返回结果类型的完全限定名或别名 使用SELECT完成多条查询 上面只是对一个表进行查询,但是在实际操作中查询数据会有多条件, 结果也会有各种类型。 select t.*,u.id = u_id,u.UserName,u.password from text as t,User as u where t.id = u.id and t.id = #{id} 注意Mybatis传入参数类型可以是Java基本数据类型,但是只适用于一个参数的情况通过#{参数名}即可获取传入的值,如果多参入参,需要复杂数据类型来支持,包括java实体类,Map,通过#{属性名}或#{Map 的 key}来获取传入的参数值。 使用resultMap完成查询结果的展现 在Mybatis中使用resultType做自动映射,一定要注意:字段名和实体类的属性名一致,若不一致,则需要给数据库字段 as 起别名,保证别名与属性名一致,我们还可以使用resultMap做自定义结果映射,字段名可以不一致,并且还可以指定要显示的列,比较灵活,应用也广泛,推荐使用第二种方式来做结果映射。 resultMap元素用来描述如何将结果集映射到Java对象,此处使用reusltMap对列表展示所需的必要字段来进行自由映射,resultMap元素的属性值和子节点 id 属性:唯一标识,此id用于select元素resultMap属性引用 type 属性: 表示该resultMap的映射结果类型 result子节点:用于表示一些简单的属性 ,其中column 属性表示从数据库中查询的字段名,property 则表示查询出来的字段对应的值赋给实体对象的哪个属性 属性 说明 resultType resultType直接表示返回值类型,包括基础数据类型和复杂数据类型 resultMap resultMap则是对外部resultMao定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap resultType和resultMap的关联 在Mybatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中关键字是字段名,值是其对应的值,当select元素提供的返回值属性是resultType的时候,Mybatis会将Map里面的键值对取出赋给resultType所指定对象的属性,(即调用对应对象的属性的setter方法进行填充), 注意在Mybatis的select元素中resultType 和resultMap本质是一样的,都是Map数据结构,但需要明确的一点他们是不能同时存在的,只能二选一。 resultMap的自动映射级别 在Mybatis中,使用resultMap能够进行自动映射匹配的前提是字段名和属性名需要一致,在默认映射级别(PARTIAL)情况下,若一致,即使没有做属性名和字段名的匹配,也可以在后台获取到未匹配过的属性值,若不一致,且在resultMap里没有做映射,那么无法在后台获取并输出 事务开启回滚 在使用 sqlsessionFactory获取sqlsession时给openSession(boolean)带有参数表示事务是否提交 ,不带参数不开启事务 Sqlsession = factory.opSession(false);//true 为自动提交事务 commit 提交方法 Sqlsession.commit();//提交事务 rollback回滚 Sqlsession.rollback();//回滚事务 使用INSERT完成增加操作 Mybatis实现增加操作,使用的是insert 元素来映射插入语句,操作方法很简单,先向接口定义一个方法 比如 int add(User user); 然后我们在SQL映射文件中定义一个insert节点 insert user into(userName,password) values(#{userName},#{password}) insert 的属性 id :与 select元素的id一样,是命名空间中唯一的标识码,可以被引用这条语句 parameterType :与select元素的parameterType一样,是传入的参数的类型完全限定名,别名和select元素的解释一致 对于增删改(insert,delete,update),这类数据库更新操作,需要注意: 1.该类型的操作本身默认返回默认返回执行SQL影响的行数,所以DAO层接口方法的方法值最好为int,不要为boolean类型 2.insert,delete,update元素中均没有resultType属性,只有查询需要对返回结果类型(resultType,resultMap)进行相应的指定 使用update完成修改操作 Mybatis 实现修改操作,使用的是 update元素来映射修改语句,具体用法和insert类似 update user set userName = #{userName} ,password =#{password} where id = #{id} @Param注解实现多参数入参 假如我需要删除 删除 姓名 为 李XX 的数据 当数据库有很多个同名的数据 所以需要其他的条件来 确认删除那个李XX 数据 但我们 直接使用一个类对象作为参数的话,有点多余,因为我们只需要2个条件,就ok了,当由于它的参数类型时采用map的方式只有一个参数时可直接 #{任意名}来使用,但有多个参数的时候就不行了 所以这时需要@Param注解 /** *我们需要接口方法的参数里面添加@Param注解 **/ int update(@Param("id") int id,@Param("name") String name); 而我们在 SQL映射文件中使用参数: update user set userName = #{name} where id = #{id} 使用delete完成删除操作 Mybatis 实现删除操作,是通过使用delete元素来映射删除语句的,具体用法和update ,insert 类似 int deleteUser(@Param("id") Integer id); delete元素映射 delete from user where id = #{id} association association 映射到JavaBean的某个 ‘复杂类型' 属性 比如JavaBean类,即JavaBean 内部嵌入了一个复杂数据类型(JavaBean)属性,这种情况就属于复杂类型的关联,但是需要注意:association 仅处理一对一的关联关系 实体类 class User{ private int id; private String name; private String password; private text userText; //省略getter和setter方法 } 我们使用association来映射 User 的text属性 association 的属性 属性 说明 javaType 完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为 property 映射数据库列的实体对象的属性 resultMap 用于引用外部的resultMap映射 resultMap 引用外部 resultMap association处理一对一的关联关系,那么对于一对多的关联关系的处理这就需要用到collection元素来实现了 collection collection 元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个复杂类型 属性,只不过这个属性是一个集合列表,即 JavaBean内部嵌套一个复杂数据类型(集合)属性,和使用association元素一样,我们使用嵌套查询,或者从连接中嵌套结果集 实体类 class User{ private int id; private String name; private String password; private List //省略getter和setter方法 } 我们在接口中添加 一个方法 public List 使用 collection实现结果映射 collection 的属性 属性 说明 ofType 完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为 property 映射数据库列的实体对象的属性 resultMap 用于引用外部的resultMap映射 collection 引用外部映射和association引用基本一致 resultMap自动映射级别 设置 reultMap的自动映射级别我们需要在mybatis的核心配置文件中设置 属性 说明 NONE 禁止自动匹配 PARTIAL(默认) 自动匹配所有的属性,但有内部嵌套的(association和collection)的除外 FULL 自动匹配所有 在使用时 如果没有设置映射级别,对于复杂类型他们是不会自动匹配的,需要手动匹配,复杂类型需要自己对association和collection的进行设置 总结 MyBatis的SQL映射文件提供 select,insert,update,delete等元素来实现SQL语句的映射 SQL映射文件的根节点是mapper元素,需要指定namespace来区别其他的mapper,保证全局唯一,并且其名称必须和接口同名,作用是绑定接口,即面向接口编程 关于MyBatis的SQL语句参数入参,对于经基础数据类型的参数数据,使用@Param注解来实现 ,复杂类型的参数直接入参即可 resultMap的association和collection都可以实现高级映射 SQL 映射文件的select的返回结果类型的映射可以使用resultMap和resultType,但它们不能同时使用
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
在mapper文件配置支持cache后如果需要对个别查询进行调整,可以单独设置cache,代码如下
select id from text where id = 1
由于Mybatis框架不擅长缓存查询结果数据集,所以不对它进一步了解,所以采用OSCahe,Memcached等专门的缓存服务器做更为合理。
3.cache-ref:从其他命名空间引用缓存
4.resultMap:用于描述数据库结果集合对应关系
5.SQL:可以重用的SQL 块,也可以被其他语句引用
6.insert:映射插入语句
7.delete:映射删除语句
8.update:映射更新语句
9.映射查询语句
使用SELECT完成单条件查询
Select 元素的属性 id 命名空间中唯一的标识符,可以被用来引用这条语句
ParameterType 表示查询语句传入参数的类型的完全限定名或别名,它支持基础数据类型和复杂数据类型
除了内建的类型别名外,还可以为自定义的类设置别名,该表格只列出了部分映射,其他的别名请参考mybatis的帮助文档,ResultType 查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的
select * from text where name = #{name}
这是一个 id为 selectTest的SQL映射语句 ,它的参数类型为 string 也可为复杂类型,返回值是 User类型,如果使用类 做返回值的话 类中的字段设置的和数据库表的字段一致,这样可以使数据库和类中的属性自动匹配以便开发(注意如果数据库表和实体类的属性命名不一样则需要手动配置),参数类型为 #{参数名} 它会告诉Mybatis生成PreparedStatement参数 ,对于JDBC该参数会被识别成 ? 若采用JDBC来实现代码如下:
String sql = "select * from text where name = ? ";
PreparedStatement ps = new PreparedStatement(sql);
ps.setString(1,name);
由此看出,Mybatis可以节省大量的代码,如果想完成复杂一些的查询或者让配置文件更简洁些,这就需要了解select元素的属性和mybatis配置文件的属性,
介绍属性:
id:命名空间中的唯一标识符,可以被用来引用这条语句
parameterType:表示查询语句传入的参数的类型的完全限定名或别名
resultType:查询语句返回结果类型的完全限定名或别名
使用SELECT完成多条查询
上面只是对一个表进行查询,但是在实际操作中查询数据会有多条件,
结果也会有各种类型。
select t.*,u.id = u_id,u.UserName,u.password
from text as t,User as u where t.id = u.id and t.id = #{id}
注意Mybatis传入参数类型可以是Java基本数据类型,但是只适用于一个参数的情况通过#{参数名}即可获取传入的值,如果多参入参,需要复杂数据类型来支持,包括java实体类,Map,通过#{属性名}或#{Map 的 key}来获取传入的参数值。
使用resultMap完成查询结果的展现
在Mybatis中使用resultType做自动映射,一定要注意:字段名和实体类的属性名一致,若不一致,则需要给数据库字段 as 起别名,保证别名与属性名一致,我们还可以使用resultMap做自定义结果映射,字段名可以不一致,并且还可以指定要显示的列,比较灵活,应用也广泛,推荐使用第二种方式来做结果映射。
resultMap元素用来描述如何将结果集映射到Java对象,此处使用reusltMap对列表展示所需的必要字段来进行自由映射,resultMap元素的属性值和子节点
id 属性:唯一标识,此id用于select元素resultMap属性引用
type 属性: 表示该resultMap的映射结果类型
result子节点:用于表示一些简单的属性 ,其中column 属性表示从数据库中查询的字段名,property 则表示查询出来的字段对应的值赋给实体对象的哪个属性
属性
说明
resultType
resultType直接表示返回值类型,包括基础数据类型和复杂数据类型
resultMap
resultMap则是对外部resultMao定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap
resultType和resultMap的关联
在Mybatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中关键字是字段名,值是其对应的值,当select元素提供的返回值属性是resultType的时候,Mybatis会将Map里面的键值对取出赋给resultType所指定对象的属性,(即调用对应对象的属性的setter方法进行填充), 注意在Mybatis的select元素中resultType 和resultMap本质是一样的,都是Map数据结构,但需要明确的一点他们是不能同时存在的,只能二选一。
resultMap的自动映射级别
在Mybatis中,使用resultMap能够进行自动映射匹配的前提是字段名和属性名需要一致,在默认映射级别(PARTIAL)情况下,若一致,即使没有做属性名和字段名的匹配,也可以在后台获取到未匹配过的属性值,若不一致,且在resultMap里没有做映射,那么无法在后台获取并输出
事务开启回滚
在使用 sqlsessionFactory获取sqlsession时给openSession(boolean)带有参数表示事务是否提交 ,不带参数不开启事务
Sqlsession = factory.opSession(false);//true 为自动提交事务
commit 提交方法
Sqlsession.commit();//提交事务
rollback回滚
Sqlsession.rollback();//回滚事务
使用INSERT完成增加操作
Mybatis实现增加操作,使用的是insert 元素来映射插入语句,操作方法很简单,先向接口定义一个方法 比如 int add(User user);
然后我们在SQL映射文件中定义一个insert节点
insert user into(userName,password)
values(#{userName},#{password})
insert 的属性
id :与 select元素的id一样,是命名空间中唯一的标识码,可以被引用这条语句
parameterType :与select元素的parameterType一样,是传入的参数的类型完全限定名,别名和select元素的解释一致
对于增删改(insert,delete,update),这类数据库更新操作,需要注意:
1.该类型的操作本身默认返回默认返回执行SQL影响的行数,所以DAO层接口方法的方法值最好为int,不要为boolean类型
2.insert,delete,update元素中均没有resultType属性,只有查询需要对返回结果类型(resultType,resultMap)进行相应的指定
使用update完成修改操作
Mybatis 实现修改操作,使用的是 update元素来映射修改语句,具体用法和insert类似
update user set userName = #{userName} ,password =#{password}
where id = #{id}
@Param注解实现多参数入参
假如我需要删除 删除 姓名 为 李XX 的数据 当数据库有很多个同名的数据 所以需要其他的条件来 确认删除那个李XX 数据 但我们 直接使用一个类对象作为参数的话,有点多余,因为我们只需要2个条件,就ok了,当由于它的参数类型时采用map的方式只有一个参数时可直接 #{任意名}来使用,但有多个参数的时候就不行了 所以这时需要@Param注解
/**
*我们需要接口方法的参数里面添加@Param注解
**/
int update(@Param("id") int id,@Param("name") String name);
而我们在 SQL映射文件中使用参数:
update user set userName = #{name}
where id = #{id}
使用delete完成删除操作
Mybatis 实现删除操作,是通过使用delete元素来映射删除语句的,具体用法和update ,insert 类似
int deleteUser(@Param("id") Integer id);
delete元素映射
delete from user where id = #{id}
association
association 映射到JavaBean的某个 ‘复杂类型' 属性 比如JavaBean类,即JavaBean 内部嵌入了一个复杂数据类型(JavaBean)属性,这种情况就属于复杂类型的关联,但是需要注意:association 仅处理一对一的关联关系
实体类
class User{
private int id;
private String name;
private String password;
private text userText;
//省略getter和setter方法
}
我们使用association来映射 User 的text属性
association 的属性
属性
说明
javaType
完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为
property
映射数据库列的实体对象的属性
resultMap
用于引用外部的resultMap映射
resultMap 引用外部 resultMap
association处理一对一的关联关系,那么对于一对多的关联关系的处理这就需要用到collection元素来实现了
collection
collection 元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个复杂类型 属性,只不过这个属性是一个集合列表,即 JavaBean内部嵌套一个复杂数据类型(集合)属性,和使用association元素一样,我们使用嵌套查询,或者从连接中嵌套结果集
实体类
class User{
private int id;
private String name;
private String password;
private List
//省略getter和setter方法
}
我们在接口中添加 一个方法
public List
使用 collection实现结果映射
collection 的属性
属性
说明
ofType
完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为
property
映射数据库列的实体对象的属性
resultMap
用于引用外部的resultMap映射
collection 引用外部映射和association引用基本一致
resultMap自动映射级别
设置 reultMap的自动映射级别我们需要在mybatis的核心配置文件中设置
属性
说明
NONE
禁止自动匹配
PARTIAL(默认)
自动匹配所有的属性,但有内部嵌套的(association和collection)的除外
FULL
自动匹配所有
在使用时 如果没有设置映射级别,对于复杂类型他们是不会自动匹配的,需要手动匹配,复杂类型需要自己对association和collection的进行设置
总结
MyBatis的SQL映射文件提供 select,insert,update,delete等元素来实现SQL语句的映射
SQL映射文件的根节点是mapper元素,需要指定namespace来区别其他的mapper,保证全局唯一,并且其名称必须和接口同名,作用是绑定接口,即面向接口编程
关于MyBatis的SQL语句参数入参,对于经基础数据类型的参数数据,使用@Param注解来实现 ,复杂类型的参数直接入参即可
resultMap的association和collection都可以实现高级映射
SQL 映射文件的select的返回结果类型的映射可以使用resultMap和resultType,但它们不能同时使用
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~