框架学习--MyBatis(2)

mybatis

环境配置

搭建

在这里插入图片描述

注意事项

1)创建IUserDao.xml和IUserDao.java时,名称时为了和以前的只是保持一致。mybatis中,持久层的操作接口名称和映射文件也叫做:Mapper。IUserDao=IUserMapper
2)在IDAEA中创建目录时,与包不一样
创建包:com.xxx.dao三级目录
创建目录:com.xxx.dao一级目录
3)mybatis的映射配置文件位置必须与dao接口的包结构相同
4)映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
5)映射配置文件的操作配置,id属性的取值必须时dao接口的方法名

遵从345点后,开发中就无需再写dao的实现类

开发

步骤

第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession
第四步:创建Dao接口的代理
第五步:执行dao的方法
第六步:释放资源

注意事项

不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置方法:指定实体类的全限定类名

如果在注解开发:
配置方法:应该使用class属性指定被注解的dao全限定类名

<mapper class="com.itheima.dao.IUserDao"/>

注解开发

减少编写 Mapper 映射 文件

将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.

1)在很大程度上防止sql注入
2)使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)

$

将传入的数据直接显示生成在sql中。如:order by useriduser_id,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

1)不能防止sql注入
2)一般用于传入数据库对象,例如传入表名

常见注解

@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用
@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装 @SelectProvider: 实现动态 SQL 映射 @CacheNamespace:实现注解二级缓存的使

CRUD操作

select
@Select("select * from user where id = #{uid} ")
User findById(Integer userId);
insert
@Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address} )")   
int saveUser(User user); 
update
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ")  
int updateUser(User user)
delete
@Delete("delete from user where id = #{uid} ")  
int deleteUser(Integer userId);

数据不一致(别名问题)

@Results&&@Result
@Results(id="userMap", /*唯一标识,使其他语句可以使用*/   value= {     
@Result(id=true,column="id",property="userId"),     
@Result(column="username",property="userName"),     
@Result(column="sex",property="userSex"),     
@Result(column="address",property="userAddress"),     
@Result(column="birthday",property="userBirthday")    }) 


@ResultMap("userMap") //@ResultMap(value={"userMap"}) 

复杂查询

@Results

@Results 注解 代替的是标签 该注解中可以使用单个@Result 注解,也可以使用@Result 集合 @Results({@Result(),@Result()})或@Results(@Result())

@Resutl 注解 代替了 标签和标签
@Result 中 属性介绍:
id 是否是主键字段(主键)
column 数据库的列名
property 需要装配的属性名(实现类的属性名)
one 需要使用的@One 注解(@Result(one=@One)())) many 需要使用的@Many 注解(@Result(many=@many)()))

@One 注解(一对一)

代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper fetchType 会覆盖全局的配置参数:
lazyLoadingEnabled。
使用格式:
@Result(column=" “,property=”",one=@One(select=""))

例如:

@Results(id="accountMap",    value= {     
@Result(id=true,column="id",property="id"),      
@Result(column="uid",property="uid"),     
@Result(column="money",property="money"),     
@Result(column="uid",       property="user",       
one=@One(select="com.itheima.dao.IUserDao.findById",          fetchType=FetchType.LAZY)     )    }) 
@Many 注解(多对一)

代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType (一般为 ArrayList)但是注解中可以不定义;
使用格式: @Result(property="",column="",many=@Many(select=""))

@Results(id="userMap",    value= {     
@Result(id=true,column="id",property="userId"),     
@Result(column="username",property="userName"),     
@Result(column="sex",property="userSex"),     
@Result(column="address",property="userAddress"),     
@Result(column="birthday",property="userBirthday"),     
@Result(column="id",property="accounts",       
many=@Many(         select="com.itheima.dao.IAccountDao.findByUid",         fetchType=FetchType.LAZY         )       )    })

缓存配置

一级缓存

默认开启

二级缓存

1)SqlMapConfig 中开启二级缓存支持
<!-- 配置二级缓存 --> 
<settings> 
 	<!-- 开启二级缓存的支持 -->  
 	<setting name="cacheEnabled" value="true"/> </settings> 
2)在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true)//mybatis 基于注解方式实现配置二级缓存 
public interface IUserDao {} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章