文章目录
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 ,如果传入的值是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 {}