Mybatis快速复习

技术文章 10个月前 完美者
1,663 0

标签: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

还是

都指定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语句
	<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

    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无参 需要导入依赖

Mybatis快速复习

标签:star   property   oci   作用   inf   equal   了解   man   read   

原文地址:https://www.cnblogs.com/x-i-n/p/14122761.html

版权声明:完美者 发表于 2020-12-17 12:12:35。
转载请注明:Mybatis快速复习 | 完美导航

暂无评论

暂无评论...