Mybatis基础知识学习1(初学者)

        初学者学习笔记,主要在于复习和熟练相关代码的应用,亦是增加思考。

        注:主要来源于自学网视频的学习笔记

一、MyBatis入门

          1.1、相关概念(理解) 

                         1.1.1、MyBatis:是一款一流的支持自定义的SQL,存储过程和高级映射的持久化框架。能够使用简单的xml格式或者注解进行配置,能够映射基本数据元素、Map接口和POJOs(普通java对象)到数据库中的记录。

                         1.1.2、框架:实际上框架是一个编码的半成品,它自动的塔建好了我们要进行操作的大部分设置。对于用户来讲,只是去填充必要的设置或者编码。

                         1.1.3、持久化:实现内存中的对象和数据库表中的记录的相互转化。框架和持久化相结合构成了持久化框架。

                                  之前的JDBC操作数据库的步骤是这样的:加载驱动----->创建连接----->创建执行语句----->执行SQL语句---->处理结果----->关闭连接

                                  使用框架,就可以省了许多代码

                         1.1.4、Mybatis执行过程示意图如下:

                

          1.2、MyBatis核心配置文件(手写)

                      (1)文件常用命名方式:SqlMapConfig.xml或Mybatis-config.xml

                      (2)以实现对User的CRUD以及分页查询,配置文件SqlMapConfig.xml或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>
    <!--配置别名-->
    <typeAliases>
        <!--配单个类的别名-->
        <!--<typeAlias type="com.study.entity.User" alias="user"></typeAlias>-->

        <!--配整个包的别名,包中所有类的首字母自动变成小写,就是对应的类别名-->
        <package name="com.study.entity"></package>
    </typeAliases>
    <!--模式配置有三种:开发模式(development_model)、测试模式(test_model)、线上模式(online_model)-->
    <environments default="development">
        <environment id="development">
            <!--设置事务模式,这个可以用别的替代-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"></property>
                <property name="username" value="${username}"></property>
                <property name="password" value="${password}"></property>
            </dataSource>
        </environment>
    </environments>
    <!--配置xml映射文件,这里是其位置-->
    <mappers>
        <mapper resource="com/study/mapper/UserMapper.xml"></mapper>
    </mappers>

    <!--<plugins>-->
        <!--&lt;!&ndash; 配置分页插件,需要在pom文件中引入依赖 &ndash;&gt;-->
        <!--<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
    <!--</plugins>-->
</configuration>

          1.3、MyBatis映射配置(手写)

                      (1)文件常用命名方式:xxxMapper.xml或xxxDao.xml

                      (2)以UserMapper.xml为例,手写其增删改查以及分页查询的简单配置(不带条件查询)。具体的步骤如下:

                                   1)在java.com.study.entity下创建User实体类;

                                               a.定义三个私有属性:Long stu_ID, String stu_name, String stu_password

                                               b.创建一个空构造器和一个带所有属性的构造器,同时实现所有属性的get和set方法,对外提供访问

                                               c.为了方便测试输出,重写其toString()方法

                                   2)在java.com.study.mapper下创建UserMapper接口,创建以下几个方法:

                                              

                                   3)在resources下创建配置文件(即1.2的内容);

                                   4)在java.com.study.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文件所在路径"
-->
<mapper namespace="com.study.mapper.UserMapper">
    <!--id的名字必须与mapper.java接口中的一样-->
    <select id="getUserList"  resultType="com.study.entity.User">
        select
        stu_ID,
        stu_name,
        stu_password
        from user
    </select>

    <select id="getUser" parameterType="java.lang.Long" resultType="com.study.entity.User">
        select
        stu_ID,
        stu_name,
        stu_password
        from user where stu_ID=#{stu_ID}
    </select>
    
    <!--
            如果需要返回插入记录的主键值,配置如下:
            (前提:主键必须是自增长的):useGeneratedKeys="true" keyProperty="主键名"
        -->
    <insert id="addUser" parameterType="com.study.entity.User" useGeneratedKeys="true" keyProperty="stu_ID">
        insert into user values (null,#{stu_name},#{stu_password})
    </insert>

    <update id="updateUser" parameterType="com.study.entity.User">
        update user set stu_name=#{stu_name},stu_password=#{stu_password} where stu_ID=#{stu_ID}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Long">
        delete from user where stu_ID=#{stu_ID}
    </delete>

    <select id="getUserPage" parameterType="java.util.Map" resultType="com.study.entity.User">
        select
        stu_ID,
        stu_name,
        stu_password
        from user limit #{pageNum},#{pageSize}
    </select>
</mapper>

                                   5)在java.com.study.test下创建UserTest测试类(可以把pom.xml文件中的测试依赖的<scope>test</scope>暂时注释掉);

                                               a.对应的创建不具有返回值不带任何参数的测试方法

                                               b.构造一个工具类MybatisUtil.java,主要是构造SqlSession对象使用。即1.3的内容)

                                               c.编写测试方法的内容,实现测试(一下图片整理了测试内容和结果)

 

          1.3、MyBatis的核心API(理解)

                      (1)传统方式是使用时在创建,但是存在不少的问题,如下:

                                               a.多次重复创建SqlSessionFactoryBuilder对象和SqlSessionFactoryBuilder对象,内存压力增大

                                               b.代码繁多

 

                      (2)我们可以通过整理创建工具类可以更加优化管理和使用,当然学习了spring框架之后又可以省略了,只需配置就行:

package com.study.utils;

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

import java.io.IOException;
import java.io.Reader;

public class MybatisUtil {
    //使用静态代码块实现了只创建一次factory,省了内存
    private static SqlSessionFactory factory;

    static {
        try {
            //1、创建SqlSessionFactoryBuilder对象,该对象的特点是用后即销毁
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

            //2、创建SqlSessionFactory对象
            String configFile = "Mybatis-config.xml";
            Reader reader = Resources.getResourceAsReader(configFile);
            factory = builder.build(reader);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //3、创建SqlSession对象
    public static SqlSession createSqlSession() {
        //true是默认提交事务,false是手动提交
        //添加、修改、删除必须提交事务,查询可以选择提交或者不提交
        return factory.openSession(false);
    }

    //4.关闭SqlSession对象
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

          1.4、接口映射方式CRUD(熟练掌握)

                      

二、MyBatis的入参和关联映射

          2.1、MyBatis的入参

                    2.1.1、在MyBatis框架中,所有的参数都是自动由框架填充到Map<String, Object>中。简要说明框架内置对象Map结构的执行过程。

                               (1)基本类型

                                             

                               (2)实体类型

                                            

                                           

                               (3)map类型

                                                        

                       2.1.2、在MyBatis框架中,参数的入参可以分为三类:基本类型入参,实体类入参、map类型入参。其中基本类型入参还可以分为单参数入参和多参数入参。如下表:

                                         

          2.2、关联映射:包括一对一、一对多、多对一(以部门表和员工表为例)

                       2.2.1、一对多:如一个部门对应多名员工。例:查询某个部门的所有员工

                                     1)创建DepartVo类,属性除了depart原有的,加上一个员工信息类属性:List<Employee>  employees;实现其get和set方法

                                     2)DepartMapper.xml映射配置文件的书写,重点在于学习collection节点

                                            

<?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">
<mapper namespace="com.study.mapper.DepartMapper">
  <resultMap id="departResultMap" type="com.study.vo.DepartVo">
    <id column="did" property="depid" />
    <result column="depname" property="depname" />
      <!--
           collection :处理一对多关联关键节点
               property:对应实体类中属性的名称(就是添加的List<Employee> employees属性名)
               ofType:描述该集合中每个元素的类型
      -->
      <collection property="employees" ofType="com.study.model.Employee">
          <id column="empid" property="empid" />
          <result column="empname" property="empname" />
          <result column="bsaralry" property="bsaralry" />
          <result column="hiredate" property="hiredate" />
          <result column="address"  property="address" />
          <result column="depid" property="depid" />
      </collection>
  </resultMap>
  <select id="getDepartDepname" parameterType="String" resultMap="departResultMap">
      select d.depid as did,d.depname,e.* from employee e,depart d where d.depid=e.depid and d.depname=#{depname}
  </select>
</mapper>

                       2.2.2、多对一:如多名员工对应一个部门。例:查询所有员工的部门信息

                                     1)创建EmployeeVo类,属性除了employee原有的,加上一个部门信息类属性:Depart depart;实现其get和set方法

                                     2)DepartMapper.xml映射配置文件的书写,重点在于association节点

<?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">
<mapper namespace="com.study.mapper.EmployeeMapper">
  <resultMap id="BaseResultMap" type="com.study.vo.EmployeeVo">
      <!--
          id节点:
              property:实体类中的oid(就是能够唯一识别一个对象的属性,一般是主键)
              column:结果集中的主键字段
          result节点:
              property:实体类中的属性名
              column:结果集中的字段名
       -->
    <id column="empid" property="empid" />
    <result column="empname" property="empname" />
    <result column="bsaralry" property="bsaralry" />
    <result column="hiredate" property="hiredate" />
    <result column="address"  property="address" />
    <result column="depid" property="depid" />
      <!--
          association节点:专门处理多对一和一对一关系的节点
              property:创建的属性名(即 Depart depart属性名)
              javaType:实体类名
       -->
      <association property="depart" javaType="com.study.model.Depart">
          <id property="depid" column="did"></id>
          <result property="depname" column="depname"></result>
      </association>
  </resultMap>
    <select id="getEmployeeList" resultMap="BaseResultMap">
        select e.*,d.depid as did,depname from employee e inner join depart d on e.depid=d.depid
    </select>
</mapper>

                       2.2.3、一对一:如一个员工对应一个员工档案。基础应用,和上一章举例基本类似

          2.3、动态SQL

                          

          2.4、通用mapper的用法

                       2.4.1、在idea里创建mapper通用配置文件(Mybatis-config.xml):settings--->editor---->code style---->file and templates--->根据需要设置各种模板

                       2.4.2、在idea里创建mapper通用映射配置文件(Mapper.xml);

                       2.4.3、Mybatis与spring结合练习反向工程生成,并练习多条件分页查询。

                                   (1)练习示意图:

                                                

                                   (2)练习完成后的源码(里面有详细说明):

                                              1)创建maven的普通java工程

                                                     

                                              2)修改配置文件:

                                                       aa.把素材的pom.xml自properties内容及其之后复制过去到项目替换对应部分内容

                                                       bb.创建main文件下与java同级resources文件;结构如下图

                                                       cc.修改配置文件generatorConfig.xml;如下图

                                                       dd.修改db.properties文件;如下图

                                                      

                                              3)其它配置文件及部分修改:

                                                    

                                              4)测试过程(简化表形式):

综合实例练习源码:https://download.csdn.net/download/preston555/13637472

猜你喜欢

转载自blog.csdn.net/preston555/article/details/110679440