D38--Mybatis(03)

一 、 log4j日志

1.1 使用步骤

  • 1.导入日子的jar包
  • 2.导入日志的核心配置文件
    • 1)日志级别
    • 2)输出日志文件的位置

1.2 配置log4j.propertis 有三个组件

  • 组件一:记录器(Loggers) 用来配置日志的输出级别,使用哪些输出元
    • 格式: 记录器名 = 级别,输出源1,输出源2…
    • log4j的日志级别(从高到低):fatal(致命错误),error(错误),warn(警告),info(信息),debug(调试),trace(堆栈)
      log4j记录日志的时候,只会记录 配置级别及更高级别的信息
      一个记录器可以指定多个输出源,输出源的名字自定义
      例如:log4j.rootLogger=info, stdout info是日志级别 , stdout是输出源名称
    • 组件二:输出源(Appenders) 在log4j中可以定义多个输出源(控制台,日志文件,邮件,数据库)
      log4j.appernder.输出源名称 = 实现类
      log4j.appender.stdout=org.apache.log4j.ConsoleAppender 向控制台输出
      log4j.appender.file=org.apache.log4j.FileAppender 向文件输出
      组件三:布局(Layouts) 在日志中都记录哪些信息
      log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 自定义布局
      log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 自定义布局格式

二、 配置Mybatis的数据连接池

2.1 数据源的多种配置方式

  • 数据源: 连接池
    • POOLED:使用mybatis的连接池
      UNPOOLED:不使用mybatis的连接池
      JNDI:服务

2.2 数据库连接注意的细节

  • 获取数据库连接的时机:操作数据的时候获取连接
  • 设置连接的事务提交方式: 创建SqlSession的时候配置自动提交事务
    • openSession(); //手动事务提交
    • openSession(true); //自动提交事务
    • openSession(Connection var1); //自己创建连接

三、 Mybatis中的动态SQL(重点)

3.1 根据用户名或性别查询用户信息

  • 步骤:
    • dao接口中编写方法
      sql映射文件中写sql语句和返回值
      测试

3.1.1 sql,if,where 标签

<!--sql:抽取公共的sql-->
<sql id="resultSql">
    select username,sex,address,birthday from user
</sql>
<select id="findUserByTiaoJian" parameterType="user" resultType="user">
    <!-- 包含sql的代码片段-->
    <include refid="resultSql"></include>
    <where>
        <!--test : 判断条件-->
        <if test="username!=null and username!='' ">
            AND username = #{username}
        </if>
        <if test="sex!=null and sex!='' ">
            AND sex = #{sex}
        </if>
    </where>

结果:
在这里插入图片描述

3.1.2 foreach标签

  1. 查询id为 2 3 4 5 6 的用户信息 int[ ]
  • parameterType:
    • pojo:全限定名
    • 基本类型和String :包装类的全限定名 或 基本类型名称
  • int[ ] 数组: int [ ],_int [ ]
  • list:list
  • collection:被遍历对象的模型
    • 数组:array
    • list:list
      • open:以什么开始
        close:以什么结束
        separator:以什么分隔
        item:变量名为 id
<select id="findUserByIds1" parameterType="list" resultType="user">
    SELECT  * FROM  USER  WHERE id IN
    <foreach collection="list" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
</select>

四、多表查询

4.1 一对一查询

<select id="findAccountAndUser" resultMap="accountMap">
          SELECT a.`ID` aid,a.`UID` uid,a.`MONEY` money,u.* FROM account a
	    LEFT JOIN USER u ON a.`UID` = u.`id`
    </select>
    <!-- account 表-->
    <resultMap id="accountMap" type="Account">
        <id column="aid" property="id"></id>
        <result column="uid" property="uid"></result>
        <result column="money" property="money"></result>
        <!--
        建立查询结果与实体属性的一对一关系
         id:建立主键和实体属性的对应关系
                column:查询结果的别名
                property:对应实体的属性名称
                javaType: 实体中属性的类型
        -->
        <!--user表-->
        <association property="user" javaType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="sex" property="sex"></result>
            <result column="address" property="address"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>
  • type=“Account” : 对应接口UserDao中方法中的泛型
  • 测试类:
  1. 创建SqlSessionFactoryBuilder
  2. 解析核心配置文件得到sessionFactory
@Test
    public void testfindAccountAndUser(){
    SqlSession sqlSession = sessionFactory.openSession(true);
    UserDao dao = sqlSession.getMapper(UserDao.class);

    List<Account> list = dao.findAccountAndUser();
    for (Account account : list) {
        System.out.println(account);
    }
}
  • 结果:
  • 在这里插入图片描述

4.2 一对多

  • 需求: 查询用户的详细信息 及 用户所拥有的所有帐号信息
  • 需要将账号表 封装到用户表
用户表(User)中:
 private List<Account> accountList;

4.2.1 映射文件UserDao.xml

  • collection
    • property: 实体中属性名称
      javaType: 实体中属性的类型
      ofType: 集合的泛型(即user表中)
<select id="findUserAndAccount" resultMap="userMap">
         SELECT u.*,a.`ID` aid,a.`UID` uid,a.`MONEY` money FROM USER u
	    LEFT JOIN account a ON a.`UID` = u.`id`
    </select>
    <!--给user表起别名-->
    <resultMap id="userMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="sex" property="sex"></result>
        <result column="address" property="address"></result>
        <result column="birthday" property="birthday"></result>
        <!--建立查询结果与实体属性的一对多关系-->
        <!--
             property: 实体中属性名称
                javaType: 实体中属性的类型
                ofType: 集合的泛型
        -->
        <collection property="accountList" javaType="list" ofType="Account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>

4.3 多对多

  • 需求:
  • 站在用户角度看角色:
    • 查询用户的详细信息 及 用户所拥有的所有角色信息
用户表中(省略了其他部分):
private List<Role> roleList;
<select id="findUserAndRole" resultMap="userMap">
        SELECT u.*,r.`ID` rid,r.`ROLE_NAME` rname,r.`ROLE_DESC`
         rdesc FROM USER u
	    LEFT JOIN user_role ur ON u.`id` = ur.`UID`
	    LEFT JOIN role r ON ur.`RID` = r.`ID`
    </select>
    <resultMap id="userMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="birthday" property="birthday"></result>
        <!--
                   property: 实体中属性名称
                   javaType: 实体中属性的类型
                   ofType: 集合的泛型
           -->
        <collection property="roleList" javaType="list" ofType="Role">
            <id column="rid" property="id"></id>
            <result column="rname" property="roleName"></result>
            <result column="rdesc" property="roleDesc"></result>

        </collection>
    </resultMap>
  • 测试类:
@Test
    public void testfindUserAndRole(){
    SqlSession sqlSession = sessionFactory.openSession(true);
    UserDao dao = sqlSession.getMapper(UserDao.class);
    List<User> list = dao.findUserAndRole();
    for (User user : list) {
        System.out.println(user);
    }
}
  • 结果:
    在这里插入图片描述

4.4 总结

  1. 一对一,是将一个实体的某条信息封装到另一个实体中。
  2. 一对多: 是将一个实体的全部信息以集合 的形式封装到另一个实体中。
  3. 多对多: 需要用到中间表,与一对多类似。

猜你喜欢

转载自blog.csdn.net/qq_33852347/article/details/84972777
38