指定参数位置下标的查询
使永场景例如查询某个出生日期在1998-02-01到2012-6-2之间的用户
如果入参是多个可以通过指定参数位置进行传参,是实体类包含不住的条件实体类只能封装成员变量的条件如果某个条件有区间范围的判断或者两个值进行处理则实体类包不住
当参数位置传入多个参数的时候默认下标从0开始arg0代表第一个参数 arg1代表第二个参数以此类推
List<User>QueryBirthday(Date Begin,Date End);
<select id="QueryBirthday" resultType>
select<include refid="allcolums">
from users where birthday between #{arg0} and #{arg1}
</select>
提示:以下是本篇文章正文内容,下面案例可供参考
入参是map
使用场景当传递的数据有多条不适用指定下标或指定名称的方式来进行传参又加上参数不一定与对象的成员变量一致可以使用map进行传递在sql语句中使用的时候使用#{j键名}${键名}
使用map的好处是可以通过键知道值所表达的含义语义更明确
List<User>getByMap(Map map)
<select id="getByMap">
select<include refid="allcolums" resultType="user">
from users where birthday between #{birthdayBegin}
and #{birthdayEnd}
</select>
二、返回值是map
1.返回值是一行map
当我们返回的的数据来自不同的表的时候通过实体类是不能进行接收的返回的键就是列名
代码如下(示例):
Map getRunturnMap(Integer id);
<select id="getRunturnMap" resultType="map">
slect username,address
from users where id=#{id}
</select>
2.返回多行map
代码如下(示例):
List<Map>getMulMap();
<select id="getMulMap" resultType="map">
select username,address from users
</select>
该处使用的url网络请求的数据。
列名与类中成员变量名称不一致
实体类:
public interface BookMapper{
List<Book>getAll()
}
@Data
public Class Book{
private Integer id;
private String name;
}
可以通过resultMap手动定义映射内容
<resultMap id="bookMap" type="book">
<!-- 主键绑定 property类中属性的名称 column是表中的字段-->
<id property="id" column="bookid"></id>
<!-- 非主键-->
<result property="name" column="bookname"></result>
</resultMap>
<select id="getAll" resultMap="bookMap">
select bookid,bookname from book
</select>
表之间的关联关系
关联关系是有方向的
一对多
一个老师可以教多个学生
客户和订单就是典型的一对多关联
一个客户名下可以有多个订单
使用一对多的关联关系可以满足查询客户的同时查询该客户名下的所有订单
客户表是一方,订单表是多方客户一方中可以持有订单的集合
使用一对多的关联关系可以满足查询客户所有信息的同时查询该客户名下的所有订单
Customer getById(Integer Id);
<resultMap id="customerMap" type="costomer">
<!-- 主键绑定-->
<id property="id" column="cid"></id>
<!-- 非主键-->
<result property="name"column="name"></result>
<result property="age" column="age"></result>
<!-- 多出来的东西 oftype值的是集合泛型的类型-->
<collection property="ordersList" ofType="orders">
<!-- 主键绑定 查询的时候起了别名这里得修改-->
<id property="id" column="oid"></id>
<!-- 非主键-->
<result property="orderNumber" column="orderNumber"></result>
<result property="orderPrice" column="orderPrice"></result>
</collection>
</resultMap>
<select id="getById" resultMap="customerMap">
select c.id cid,name,age,o.id oid,orderNumber,orderPrice,customer_id
from customer c left join orders o on c.id=o.customer_id where c.id=#{id}
</select>
实体类
package com.zhangsong.pojo;
import lombok.Data;
@Data
public class Orders {
private Integer orderNumber;
private Double orderPrice;
private Integer customer_id;
//关联下此订单的客户信息
private Customer customer;
}
import lombok.Data;
import java.util.List;
@Data
public class Customer {
private Integer id;
private String name;
private Integer age;
private List<Orders> ordersList;
}
多对一
多个学生只有一个老师
站在订单的方向查询订单的同时将客户的信息查出
订单是多方会持有一方的对象客户是一方
>public interface OrdersMapper{
> //根据主键查询订单并同时查询此订单下的客户信息
>Orders getById( Integer id);
>}
>
<resultMap id="ordersMap" type="orders">
<!-- 主键绑定-->
<id property="id" column="oid"></id>
<!-- 非主键绑定-->
<result property="orderPrice" column="orderPrice"></result>
<result property="orderNumber" column="orderNumber"></result>
<!--多出来的-->
<!-- property定你成员变量的名称-->
<!-- javaType指定你成员变量的类型 -->
<!-- 只需要绑定自身的属性-->
<association property="customer" javaType="customer">
<id property="id" column="cid"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
</association>
</resultMap>
<select id="getById" resultMap="ordersMap">
select o.id oid,orderNumber,orderPrice,customer_id,c.id cid
from orders o inner join customer c on o.customer_id=o.id where o.id=#{id}
</select>
一对一
一对一辅导
多对多
划线的车位和每一辆车一个车可以随便停车位 车位可以有不同的车
事务管理
在mybatis中设置设置事务
< transactionManager type=“JDBC”></ transactionManager>
程序员自己控制处理的提交和回滚可设置为自动提交
sqlSession= factory.openSession(true);设置为自动提交在增删改后不需要commit();
缓存
mybatsi提供两级缓存,一级缓存和二级缓存默认开启一级缓存缓存就是为了提高 查询效率使用缓存后查询的流程
先去缓存查询没有再去数据库去查 如果数据库发生改变就情况缓存
一级缓存使用的是sqlsession的作用域同一个sqlSession共享一级缓存
二级缓存使用的是mapper的作用域,不同的sqlsession只要访问的是一个mapper.xml则共享二级缓存