标签:star property oci 作用 inf equal 了解 man read
-注意核心配置文件配置标签顺序是有定义的
-注意防止sql注入 #{}获取的值会加上"" ${}有sql注入风险
-注意在配置映射文件"接口映射文件"时需要在mapper标签中写nameSpace="权限定类名"
核心配置文件 SqlMapperConfig.xml 映射文件 XxxxMapper.xml 接口XxxxMapper
1.首先从传参数开始
1.传基本类型参数
1.传一个参数 #{里面随便写都能接收参数}
2.传多个参数需要 #{param1},#{param1}接收参数
3.传多个参数还可以使用注解形式 @Param("指定名") #{指定名}通过指定名来获取参数
2.传引用类型参数 一般会将多个不相关的参数封装到QueryVo
1.直接 属性名
3.传递map
比较万能 通过键就可以键就可以获取值 列如:#{键}
2.其次返回值
1.基本数据类型
1.可以指定resultType="类型" 类型忽略大小写
2.也可以不指定resultType
2.引用数据类型 先在核心配置文件配置别名较为方便
1.可以指定resultType="类型" 无论是List
2.引用数据类型 属性中有引用数据属性 需要指定resultMap=""
并且配置resultMap标签来映射
一对一:
一对多:
3.获取主键
1.-int类型两种方式
1.int类型自增id
会自动装配到返回值引用对象中
select LAST_INSERT_ID()
2.
-string类型id
/查询最后一次新增的id 并封装到user里面/
select uuid()/自己生成一个传递过去/
2.-注解形式返回主键
@SelectKey(resultType = Integer.class,keyProperty ="id",before = false,statement = "select LAST_INSERT_ID()")
3.模糊查询三种方式
1.从参数上传递%
-where user_name like #{name}
2.在sql语句上拼接字符串
-where user_name like "%"#{name}"%"
3.通过concat方法拼接 常用
-where user_name like concat("%",#{name},"%")
4.多条件查询
可以将其封装到QueryVo中
通过#{属性}
5.动态sql
1.xml形式标签
if标签
判断条件是否为真,如果为真则将if中字符串拼接到SQL语句中
where标签
1-where标签就相当于SQL语句中where关键字
2-去掉多余的and、or关键字
set标签
1. 一般与if标签配合使用
2. set用在update语句中,相当于set关键字
3. 会去掉多余的逗号
foreach标签属性
collection 参数名,要求必须是Iterable对象或数组或Map
index(了解即可) 元素下标
item 表示遍历过程中每个元素的变量
separator 每次遍历后添加分隔符
open 遍历前添加什么符号
close 遍历后添加什么符号
特殊场景(了解即可)**:如果需要遍历的是Map(或者元素是Map.Entry类型的Collection),则index表示key,item表示value。
1. sql标签:定义一段可以重用的SQL语句
2. include标签: 引用上面定义的SQL语句
<sql id="conditionSql">
<if test="condition!=null and condition!=‘‘">
where user_name like concat(‘%‘,#{condition},‘%‘)
or home_address like concat(‘%‘,#{condition},‘%‘)
</if>
</sql>
<select id="selectByConditon" resultMap="userResultMap">
select * from t_user
<!--引用代码块-->
<include refid="conditionSql"/>
</select>
<select id="countByConditon" resultType="int">
select count(1) from t_user
<!--引用代码块-->
<include refid="conditionSql"/>
</select>
2.注解形式动态sql
@SelectProvider(type = 指定自定义类的class文件, method = "指定类中的方法名")
方法中 返回一个sql字符串
return new SQL(){{
SELECT("*");
FROM("t_user");
if(queryVo.getUser().getUserName() != null){
WHERE("user_name like concat(\"%\",#{user.userName},\"%\")");
}
if(queryVo.getUser().getSex() != null) {
AND();
WHERE("sex=#{user.sex}");
}
if(queryVo.getStartIndex() != null && queryVo.getPageSize() != null) {
LIMIT("#{startIndex},#{pageSize}");
}
}}.toString();
6.级联查询
-作用:多表查询 避免相同的字段。
<association property="userInfo" column="id" select="selectUserInfoByUserId"/>
<collection property="orders" column="id" select="selectOrderByUserId"/>
--注意,在配置自动映射时 是不能有conllection的 查询出来的信息是多条
7.注解形式--注解结果映射--and级联查询:
一对一
@Results(value = {
@Result(id = true, column = "id", property = "id"),
@Result(column = "user_name", property = "userName"),
@Result(column = "sex", property = "sex"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "home_address", property = "homeAddress"),
@Result(
property = "userInfo",
column = "id",
one = @One(select = "com.itheima.dao.UserInfoMapper.selectUserInfoByUserId"))
})
一对多and一对多
@Results(value = {
@Result(id = true, column = "id", property = "id"),
@Result(column = "user_name", property = "userName"),
@Result(column = "sex", property = "sex"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "home_address", property = "homeAddress"),
@Result(
property = "userInfo",
column = "id",//传递过来的参数
one = @One(select = "com.itheima.dao.UserInfoMapper.selectUserInfoByUserId")),
@Result(
property = "orders",
column = "id",//传递过来的参数
many = @Many(select = "com.itheima.dao.OrderMapper.selectOrderListByUserId"))
})
8-mybatis缓存机制
sqlsession 一级缓存 单close时会将缓存内容存入二级缓存
sqlsessionFactory 二级缓存 通过namespase配置cache标签来开启
访问机制会先访问二级缓存
9.封装Mybatis
/**
mybatis工具类
使用步骤:
1-获取mapper
2-执行CRUD操作(可能是1次,也可能多次)
3-提交事务
4-关闭session
*/
public class MyBatisUtils {
private static SqlSessionFactory factory;
private static final ThreadLocal
// 读取核心配置文件,初始化SqlSessionFactory,只执行一次
static {
//1. 得到输入流对象
try( InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml")?? {
//2. 构造会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 通过建造类得到会话工厂
factory = builder.build(inputStream);
System.out.println("创建SqlSessionFactory成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("加载mybatis核心配置文件失败");
}
}
/**
}
/**
10.需要导入依赖
省去一些getsetequalstostring方法 lombok 三个注解 @Data @xxxconstructor有参 @xxxConconstructor无参 需要导入依赖
标签:star property oci 作用 inf equal 了解 man read
原文地址:https://www.cnblogs.com/x-i-n/p/14122761.html