//插入
@Insert("insert into orders value(null,#{ordertime},#{total},#{uid})")
void save(Orders orders);
//删除
@Delete("delete from orders where id = #{vaalue}")
void del(int id);
//修改
@Update("update orders set ordertime = #{ordertime},total = #{total},uid = #{uid} where id = #{id}")
void edit(Orders orders);
//查询所有
@Select("select * from orders")
List<Orders> findAll();
//查询指定字段
@Select(" select * from orders where id = #{value}")
Orders findById(int id);
//一对一 查询
@Select("select * from orders")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "ordertime",column = "ordertime"),
@Result(property = "total",column = "total"),
@Result(
property = "user",
column = "uid",
javaType = User.class,
one = @One(select = "com.softwareMan.dao.UserDao.findById")
)
})
List<Orders> findOne_One();
//一对多/多对多,区别在与many = @Many(select = "执行方法")
@Select("select * from user")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(
property = "ordersList", //要封装的属性
column = "id", //根据已查出的那个字段作为条件去查询 orders 表
javaType = List.class, //属性类型
many = @Many(select = "com.softwareMan.dao.OrdersDao.findByUserId") //执行那个接口的那个方法
)
})
List<User> findone_two();
<!--
last_insert_id() : 查询刚插入数据自增id
order : 执行的时机 after 之前执行; before 之后执行
keyProperty : 与实体类属性保持一致
keyColumn : 与数据库字段保持一致
-->
<insert id="save" parameterType="orders" >
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER" >
select last_insert_id();
</selectKey>
insert into orders value(null,#{ordertime},#{total},#{uid})
</insert>
① ${} //底层进行字符串拼接 --- sql注入 不适用
---> 平
select * from orders where name = '%${value}%'
② #{} //底层预编译sql
---> %平%
select * from orders where name = '#{value}'
- 等到需要用到数据的时候才去查询,不用的时候不查询。
* 先从一张表中查询出外键字段,然后拿着这个字段去查另一张表
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!--
配置 user 对象中 accounts 集合的映射
使用 select 调用另一个方法按照已查出字段 id 查询信息
-->
<collection property="accounts"
column="id"
ofType="account"
select="com.softwareMan.dao.AccountDao.findAccountByUid">
</collection>
</resultMap>
<select id="findAll" resultMap="userAccountMap">
select * from user
</select>
<settings>
<!--开启Mybatis支持延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
- 一级缓存是 sqlSession 级别的,存在于 sqlSession 中,sqlsession 存在,以及缓存就存在
- 二级缓存是 mapper 级别的,多个 sqlSession 操作同一个 mapper 映射的 sql,共用同一份 二级缓存
- 发起一次用户请求时会先去一级缓存找,找不到再去数据库查询,并将数据存入一级缓存
- 一级缓存执行 增、删、改、commit()、close() 等方法时会清空缓存
- 在 mubatis 中开启二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在 mapper 中开启 二级缓存 支持
<cache/>
- statement 上添加 useCache 属性
<select id="findById" parameterType="INT" resultType="user" useCache="true">
select * from user where id = #{uid}
</select>