您的位置:首页 > 博客中心 > 互联网 >

Mybatis快速复习

时间:2022-05-11 06:59

-注意核心配置文件配置标签顺序是有定义的
-注意防止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 还是 都指定E
2.引用数据类型 属性中有引用数据属性 需要指定resultMap=""
并且配置resultMap标签来映射
id为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语句
	
		
			where user_name like concat(‘%‘,#{condition},‘%‘)
			or home_address like concat(‘%‘,#{condition},‘%‘)
		
    
	
	
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.级联查询
-作用:多表查询 避免相同的字段。



--注意,在配置自动映射时 是不能有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 session = new 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核心配置文件失败");
    }
    }

    /**

    • 获取Mapper
    • @param clazz Mapper类
    • @return
      */
      public static T getMapper(Class clazz){
      //4. 通过会话工厂得到会话对象
      if(null == session.get()){
      session.set(factory.openSession());
      }
      //5. 会话对象得到UserMapper接口的代理对象
      return session.get().getMapper(clazz);

    }

    /**

    • 提交并关闭
      */
      public static void commitAndClose(){
      System.out.println("关闭 ……");
      if(null != session.get()){
      session.get().commit();
      session.get().close();
      session.remove();
      }
      }
      }

10.需要导入依赖
省去一些getsetequalstostring方法 lombok 三个注解 @Data @xxxconstructor有参 @xxxConconstructor无参 需要导入依赖

本类排行

今日推荐

热门手游