Mybatis相关配置属性

RoleMapper

package com.itheima.sh.dao;


import com.itheima.sh.pojo.Role;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface RoleMapper {
    //分页查询角色以及对应的用户和权限信息
    List<Role> queryAllRolesAndUsersAndPermi(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

}

UserMapper

package com.itheima.sh.dao;


import com.itheima.sh.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserMapper {
    //分页查询用户
    List<User> queryAllUsersAndRoles(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
    //根据用户id修改用户名称 密码
    @Update("update t_user set username=#{username},password=#{password} where id=#{id}")
    void updateUserById(User user);
}

UserRoleMapper

package com.itheima.sh.dao;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;

public interface UserRoleMapper {
    //根据用户id删除中间表数据
    @Delete("delete from t_user_role where user_id=#{id}")
    void deleteUserAndRoleByUID(@Param("id") String id);
    //向中间表插入新的数据
    @Insert("insert into t_user_role values(#{uid},#{roleId})")
    void addUserAndRoleID(@Param("uid")String id, @Param("roleId")String roleId);
}

Permission

package com.itheima.sh.pojo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 权限
 */
public class Permission implements Serializable{
    private String id;
    private String name; // 权限名称
    private String keyword; // 权限关键字,用于权限控制
    private String description; // 描述
    //一个权限可以保存多个角色
    private List<Role> roles = new ArrayList<Role>(0);

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {
        return "Permission{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", keyword='" + keyword + '\'' +
                ", description='" + description + '\'' +
                ", roles=" + roles +
                '}';
    }
}

Role

package com.itheima.sh.pojo;

import java.util.ArrayList;
import java.util.List;

/*
    角色
 */
public class Role {

    private String id;
    private String name;
    private String keyword;
    private String description;
    //一个角色可以保存多个用户
    private List<User> users = new ArrayList<User>(0);
    //一个角色可以保存多个权限
    private List<Permission> permissions = new ArrayList<Permission>(0);

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", keyword='" + keyword + '\'' +
                ", description='" + description + '\'' +
                ", users=" + users +
                ", permissions=" + permissions +
                '}';
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public List<Permission> getPermissions() {
        return permissions;
    }

    public void setPermissions(List<Permission> permissions) {
        this.permissions = permissions;
    }
}

User

package com.itheima.sh.pojo;

import java.util.ArrayList;
import java.util.List;
/*
    用户
 */
public class User {
    private String id;
    private String username;
    private String password;
    private String email;
    private String createTime;
    private String updateTime;
    private String remark;
    private List<String> roleIds;
    //一个用户可以保存多个角色
    private List<Role> roles = new ArrayList<Role>(0);

    public List<String> getRoleIds() {
        return roleIds;
    }

    public void setRoleIds(List<String> roleIds) {
        this.roleIds = roleIds;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", createTime='" + createTime + '\'' +
                ", updateTime='" + updateTime + '\'' +
                ", remark='" + remark + '\'' +
                ", roleIds=" + roleIds +
                ", roles=" + roles +
                '}';
    }
}

RoleServiceImpl

package com.itheima.sh.service;

import com.itheima.sh.dao.RoleMapper;
import com.itheima.sh.pojo.Role;
import com.itheima.sh.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class RoleServiceImpl {
    public List<Role> queryAllRolesAndUsersAndPermi(int startIndex, int pageSize) {
        //1.获取会话工厂对象
        SqlSession sqlSession = SqlSessionUtil.getSqlSession(false);
        //2.获取接口代理对象
        RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
        //3.使用接口代理对象调用接口中的方法
        List<Role> roleList = mapper.queryAllRolesAndUsersAndPermi(startIndex,pageSize);
        //4.释放资源
        sqlSession.close();
        //5.返回集合给web层
        return roleList;
    }
}

UserServiceImpl

package com.itheima.sh.service;

import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.dao.UserRoleMapper;
import com.itheima.sh.pojo.User;
import com.itheima.sh.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class UserServiceImpl {
    public List<User> queryAllUsersAndRoles(int startIndex, int pageSize) {
        //1.获取会话工厂对象
        SqlSession sqlSession = SqlSessionUtil.getSqlSession(false);
        //2.获取接口代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //3.使用接口代理对象调用接口中的分页查询用户和角色的方法
        List<User> userList = mapper.queryAllUsersAndRoles(startIndex,pageSize);
        //4.释放资源
        sqlSession.close();
        //5.返回集合给web层的调用者
        return userList;

    }
    //修改用户方法
    public void updateUserById(User user) {
        //1.获取会话工厂对象
        SqlSession sqlSession = SqlSessionUtil.getSqlSession(true);
        //2.获取接口代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserRoleMapper userRoleMapper = sqlSession.getMapper(UserRoleMapper.class);

        //3.使用UserMapper接口代理对象调用UserMapper接口中根据id更新用户的方法
        userMapper.updateUserById(user);

        //4.使用UserRoleMapper接口代理对象调用UserRoleMapper的方法根据用户id删除中间表t_user_role中有关当前用户id所有的信息
        userRoleMapper.deleteUserAndRoleByUID(user.getId());

        //5.使用UserRoleMapper接口代理对象调用UserRoleMapper的方法将当前用户id和新的角色id插入到中间表t_user_role中
        //注意在User实体类中使用集合private List<String> roleIds;保存多个角色id,因为一个用户可以有多个角色
        //这里需要遍历集合roleIds取出每个角色id
        List<String> roleIds = user.getRoleIds();
        //遍历
        /*
            admin(1)   原来角色 管理员(1) 会员(2)
            admin(1)   新的角色 会员(2)  游客(3)
         */
        for (String roleId : roleIds) {
            //6.将当前用户的用户id和角色id插入到中间表t_user_role
            userRoleMapper.addUserAndRoleID(user.getId(),roleId);
        }
    }
}

SqlSessionUtil

package com.itheima.sh.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/*
    工具类特点:
        1.位于util包
        2.私有化构造方法
        3.提供静态方法
 */
public class SqlSessionUtil {
    private static SqlSessionFactory factory = null;

    // 2.私有化构造方法
    private SqlSessionUtil() {
    }

    //静态代码块:类加载就执行获取工厂对象
    static {
        try {
            //1.获取工厂创造类对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //2.获取会话工厂对象
            factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 3.提供静态方法
    //提供会话对象,设置自动提交事务
    public static SqlSession getSqlSession() {

        SqlSession sqlSession = factory.openSession(true);
        //返回会话对象
        return sqlSession;
    }

    //提供会话对象,设置自动提交事务
    public static SqlSession getSqlSession(boolean isAutoCommit) {
        SqlSession sqlSession = factory.openSession(isAutoCommit);
        //返回会话对象
        return sqlSession;
    }

    //编写静态方法接收会话对象,手动提交事务并且关闭会话对象
    public static void commitAndClose(SqlSession sqlSession) {
        //防止空指针,判断
        if (sqlSession != null) {
            //一切正常提交事务
            sqlSession.commit();
            //关闭会话对象
            sqlSession.close();
        }
    }

    public static void commit(SqlSession sqlSession) {
        //防止空指针,判断
        if (sqlSession != null) {
            //一切正常提交事务
            sqlSession.commit();

        }
    }

    public static void close(SqlSession sqlSession) {
        //防止空指针,判断
        if (sqlSession != null) {
           sqlSession.close();

        }
    }

    //编写静态方法接收会话对象,回滚事务并且关闭会话对象
    public static void rollbackAndClose(SqlSession sqlSession) {
        //防止空指针,判断
        if (sqlSession != null) {
            //出现正常回顾事务
            sqlSession.rollback();
            //关闭会话对象
            sqlSession.close();
        }
    }

}

QueryAllRolesAndUsersAndPermi

package com.itheima.sh.web;

import com.itheima.sh.pojo.Role;
import com.itheima.sh.service.RoleServiceImpl;

import java.util.List;
import java.util.Scanner;

/*
    分页查询角色和对应的用户以及权限信息
    入口:
 */
public class QueryAllRolesAndUsersAndPermi {
    public static void main(String[] args) {
        //1.创建键盘录入的对象
        Scanner sc = new Scanner(System.in);
        //2.提示
        System.out.println("请输入起始索引:");
        //获取
        int startIndex = sc.nextInt();//起始索引

        System.out.println("请输入每页条数:");
        //获取
        int pageSize = sc.nextInt();//每页条数

        //3.创建业务层对象
        RoleServiceImpl roleService = new RoleServiceImpl();
        //4.使用业务层对象调用查询角色和对应的用户以及权限信息
        /*
            roleList = [Role{id=1, name='管理员', keyword='ROLE_ADMIN', description='这是管理员',
                            users=[User{id=1, username='admin', password='123', email='[email protected]',
                                                        createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0',
                                                                    remark='null', roleIds=null, roles=[]},
                                  User{id=4, username='wangwu', password='123', email='[email protected]',
                                                                    createTime='2021-12-05 14:50:35.0',
                                                                    updateTime='2021-12-05 14:50:35.0',
                                                                     remark='null', roleIds=null, roles=[]},
                                 User{id=6, username='tianqi', password='123', email='[email protected]',
                                                                      createTime='2021-12-05 14:50:35.0',
                                                                      updateTime='2021-12-05 14:50:35.0', remark='null',
                                                                      roleIds=null, roles=[]},
                                User{id=8, username='杨幂', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]},
                                User{id=9, username='李沁', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]},
                                User{id=10, username='赵丽颖', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}],
                           permissions=[com.itheima.sh.pojo.Permission@691a7f8f, com.itheima.sh.pojo.Permission@50a7bc6e, com.itheima.sh.pojo.Permission@161b062a, com.itheima.sh.pojo.Permission@17c1bced]}, Role{id=2, name='会员', keyword='ROLE_MEMBER', description='这是会员', users=[User{id=1, username='admin', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}, User{id=2, username='zhansan', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}, User{id=3, username='lisi', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}, User{id=5, username='zhaoliu', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}, User{id=8, username='杨幂', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}, User{id=10, username='赵丽颖', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[]}], permissions=[com.itheima.sh.pojo.Permission@2d9d4f9d, com.itheima.sh.pojo.Permission@4034c28c]}]
         */
        List<Role> roleList=roleService.queryAllRolesAndUsersAndPermi(startIndex,pageSize);
        System.out.println(roleList.size());//2
        //5.输出
        System.out.println("roleList = " + roleList);
    }
}

QueryAllUsersAndRoles

package com.itheima.sh.web;

import com.itheima.sh.pojo.User;
import com.itheima.sh.service.UserServiceImpl;

import java.util.List;
import java.util.Scanner;

/*
    需求:分页查询用户和对应的角色信息,然后将信息输出到idea控制台。
    入口
 */
public class QueryAllUsersAndRoles {
    public static void main(String[] args) {
        //1.创建键盘录入的对象
        Scanner sc = new Scanner(System.in);
        //2.提示
        System.out.println("请输入起始索引:");
        //获取
        int startIndex = sc.nextInt();//起始索引

        System.out.println("请输入每页条数:");
        //获取
        int pageSize = sc.nextInt();//每页条数
        //3.创建业务层对象
        UserServiceImpl userService = new UserServiceImpl();
        //4.使用业务层对象调用业务层分页查询用户和角色的方法
        //将键盘录入的起始索引和每页条数传递到业务层
        //分页查询的是多个用户存储到list集合中
        List<User> userList = userService.queryAllUsersAndRoles(startIndex, pageSize);
        //5.判断集合是否有数据
        if (userList != null && userList.size() != 0) {
            //集合有数据
            /*
                User{id=1, username='admin', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0',
                    updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null,
                    roles=[Role{id=1, name='管理员', keyword='ROLE_ADMIN', description='这是管理员',
                    users=[], permissions=[]}, Role{id=2, name='会员', keyword='ROLE_MEMBER',
                    description='这是会员', users=[], permissions=[]}]}
                User{id=2, username='zhansan', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[Role{id=2, name='会员', keyword='ROLE_MEMBER', description='这是会员', users=[], permissions=[]}]}
                User{id=3, username='lisi', password='123', email='[email protected]', createTime='2021-12-05 14:50:35.0', updateTime='2021-12-05 14:50:35.0', remark='null', roleIds=null, roles=[Role{id=2, name='会员', keyword='ROLE_MEMBER', description='这是会员', users=[], permissions=[]}]}


             */
            userList.forEach(System.out::println);
        }else{
            //没查询到数据
            System.out.println("没有用户");
        }
    }
}

UpdateUserWeb

package com.itheima.sh.web;

import com.itheima.sh.pojo.User;
import com.itheima.sh.service.UserServiceImpl;

import java.util.ArrayList;

public class UpdateUserWeb {
    public static void main(String[] args) {
        /*
            需求:修改id是1的用户的密码为456,用户名为刘德华,扮演角色变为游客(提示:游客角色id是3)和会员(提示:会员角色id是2)
         */
        //1.创建实体类对象
        User user = new User();
        //2.向user对象中添加数据
        user.setId("1");//修改用户的id
        user.setUsername("刘德华");//用户的新用户名
        user.setPassword("456");//用户的新密码
        //创建集合保存当前用户新角色的id
        ArrayList<String> list = new ArrayList<>();
        list.add("2");//会员角色id是2
        list.add("3");//游客角色id是3
        user.setRoleIds(list);
        //3.创建业务层对象
        UserServiceImpl userService = new UserServiceImpl();
        //4.调用修改方法
        userService.updateUserById(user);
    }
}

RoleMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
映射文件
namespace 指定接口的类全名
-->
<mapper namespace="com.itheima.sh.dao.RoleMapper">
    <resultMap id="queryAllRolesAndUsersAndPermiResultMap" type="Role" autoMapping="true">
        <!--    配置t_role表和实体类Role的关系    -->
        <id column="rid" property="id"/>
        <result column="rname" property="name"/>
        <result column="rkwd" property="keyword"/>
        <result column="rdes" property="description"/>
        <!--
            配置关联t_user表,角色和用户属于一对多,使用collection
                1) property="users" 表示Role实体类中保存多个用户的容器对象名  private List<User> users = new ArrayList<User>(0);
                2) ofType="User" 表示容器的泛型类型

        -->
        <collection property="users" ofType="User" autoMapping="true">
            <!--    配置t_user表和实体类User的关系    -->
            <id column="id" property="id"/>
        </collection>

        <!--
            配置关联t_permission表,角色和权限属于一对多,使用collection
                1) property="permissions" 表示Role实体类中保存多个权限的容器对象名
                        private List<Permission> permissions = new ArrayList<Permission>(0);
                2) ofType="Permission" 表示容器的泛型类型
        -->
        <collection property="permissions" ofType="Permission" autoMapping="true">
            <!--    配置t_permission表和实体类Permission的关系    -->
            <id column="pid" property="id"/>
            <result column="pname" property="name"/>
            <result column="pkwd" property="keyword"/>
            <result column="pdes" property="description"/>
        </collection>
    </resultMap>
    <!--
         //分页查询角色以及对应的用户和权限信息
        List<Role> queryAllRolesAndUsersAndPermi(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
    -->
    <select id="queryAllRolesAndUsersAndPermi" resultMap="queryAllRolesAndUsersAndPermiResultMap">
        select temp.id rid,temp.name rname,temp.keyword rkwd,temp.description rdes,
               u.*,p.id pid,p.name pname,p.keyword pkwd,p.description pdes
        from (select * from t_role limit #{startIndex},#{pageSize}) temp
        inner join t_user_role ur
        inner join t_user u
        inner join t_role_permission rp
        inner join t_permission p
        on temp.id=ur.role_id and ur.user_id=u.id and temp.id=rp.role_id and rp.permission_id = p.id
    </select>
</mapper>

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
映射文件
namespace 指定接口的类全名
-->
<mapper namespace="com.itheima.sh.dao.UserMapper">
    <!--
        1.type="User" : 相当于之前的resultType,表示接口的方法返回类型,这里方法:
              List<User> queryAllUsersAndRoles(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
         的返回值是List<User>,那么type属性值位置书写集合泛型类型

    -->
    <resultMap id="queryAllUsersAndRolesResultMap" type="User" autoMapping="true">
        <!--
            配置t_user表和User实体类关系
        -->
        <id column="id" property="id"/>
        <!--
            配置关联的t_role表,因为一个用户有多个角色,所以这里是一对多,使用标签collection
            private List<Role> roles = new ArrayList<Role>(0);
            1.property="roles" 表示User实体类中保存多个角色容器对象名
            2.ofType="Role" : 表示保存角色的容器中的泛型类型
        -->
        <collection property="roles" ofType="Role" autoMapping="true">
            <!--
                配置t_role表和Role实体类关系
            -->
            <id column="rid" property="id"/>
        </collection>
    </resultMap>
    <!--
         //分页查询用户
        List<User> queryAllUsersAndRoles(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);
    -->
   <select id="queryAllUsersAndRoles" resultMap="queryAllUsersAndRolesResultMap">
       select temp.*,r.id rid,r.name,r.keyword,r.description
       from (select * from t_user limit #{startIndex},#{pageSize})  temp
       inner join t_user_role ur
       inner join t_role r
       on temp.id = ur.user_id and ur.role_id = r.id;
   </select>
</mapper>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day0801
jdbc.username=root
jdbc.password=1234

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <target>System.out</target>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
                %msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>
        </encoder>
    </appender>

    <!-- File是输出的方向通向文件的 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--日志输出路径-->
        <file>C:/code/itheima-data.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--

    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
   , 默认debug
    <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
    -->
    <root level="ALL">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>
</configuration>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--加载外部的配置文件-->
    <properties resource="db.properties"></properties>
    <!--settings-->
    <settings>
        <!--开启驼峰自动映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--别名-->
    <typeAliases>
        <package name="com.itheima.sh.pojo"></package>
    </typeAliases>
    <!--mybatis环境的配置
        一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境
    -->
    <environments default="development">
        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="development">
            <!--事务管理器:由JDBC来管理-->
            <!--
                事务管理器type的取值:
                1. JDBC:由JDBC进行事务的管理
                2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
            -->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <!--
                数据源:
                1. POOLED:使用mybatis创建的连接池
                2. UNPOOLED:不使用连接池,每次自己创建连接
                3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源。
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

    </environments>
    <!--映射器-->
    <mappers>
        <!--加载其它的映射文件 注:注解开发是点号-->
        <!-- <package name="com.itheima.sh.dao"></package>-->
        <!--加载其它的映射文件 注:不是点号-->
        <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
        <!--
            加载其它的映射文件 xml形式
                包扫描方式加载mapper映射文件,说明:
                1. 要求mapper映射文件,与mapper接口要放在同一个目录
                2. 要求mapper映射文件的名称,与mapper接口的名称要一致
            -->
        <package name="com.itheima.sh.dao"></package>
    </mappers>
</configuration>

总结

今日总结:
1.映射文件方式实现动态sql:*************************
    1.<if test="判断条件">
           文本
         </if>
     如果判断条件为真,那么执行if标签的文本,如果为假就不执行

     2. 多分支或者多选一
     <choose>
            <when test="判断条件">
                 文本1
            </when>
            <when test="判断条件">
                文本2
            </when>
            <otherwise>
                 文本3
            </otherwise>
        </choose>
    如果某个when的条件满足,则执行对应文本,不会执行下面的内容,如果不满足条件则继续执行下面的内容
    如果when中的所有判断条件都为false,那么执行otherwise文本

    3.<where>标签作用:1)加where关键字  2)去掉多余的and和or

    4.<set>标签作用:1)加set关键字 2)去掉多余的逗号

    5.用来遍历数组或者集合
        <foreach collection="数组或者集合名" item="元素" separator="元素分隔符" open="以什么开始" close="以什么结尾">
                    #{元素}
                </foreach>

2.多表查询:*************************
    1)一对一查询:
        <resultMap id="queryOneToOneResultMap" type="Order" autoMapping="true">
            <!--   配置的是tb_order表和实体类Order的映射关系     -->
            <id column="oid" property="id"/>
            <result column="order_number" property="orderNumber"/>
            <!--
                配置tb_user表和实体类User的映射关系  private User user;
            -->
            <association property="user" javaType="User" autoMapping="true">
                <!--   配置的是tb_user表和实体类User的映射关系     -->
                <id column="id" property="id"/>
            </association>
         </resultMap>

    2)一对多:
        <resultMap id="queryOneToManyResultMap" type="User" autoMapping="true">
            <!-- 配置tb_user表和User实体类映射关系  -->
            <id column="id" property="id"/>
            <!--
                TODO:
                1.配置一对多使用的标签是collection
                2.collection标签常见的属性:private List<Order> orderList;
                    1) property="orderList" :表示存储多个订单对象的集合容器名
                    2) ofType="Order" : 属性值Order是存储多个订单容器集合List的泛型类型 List<Order>
            -->
            <collection property="orderList" ofType="Order" autoMapping="true">
                <!-- 配置tb_order表和Order实体类映射关系  -->
                <id column="oid" property="id"/>
            </collection>
        </resultMap>
3.注解实现增删改查:*************************
    @Select:查询
    @Insert:插入
    @Update:更新
    @Delete:删除
4.注解实现自增主键回填:
    在添加的方法上使用注解:@Options(useGeneratedKeys = true,keyColumn = "主键字段名",keyProperty = "主键成员变量名")

5.注解实现动态sql:
@SelectProvider(type = 工具类.class,method = "方法名")

猜你喜欢

转载自blog.csdn.net/anyi2351033836/article/details/125365122