mybatis

Posted xue_yun_xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis相关的知识,希望对你有一定的参考价值。

一、别名的配置

别名 就是给类起一个小名,便于使用
integer 就是java.lang.Integer 的 别名

parameterType="integer"
parameterType="java.lang.Integer"

在这里插入图片描述

自定义别名

1、在mybatis 配置文件声明

<!--
        typeAliases 必须放到  <environments 之前  
               xml 的约束 规定当前 xml 可以使用哪些 标签,标签的顺序,不可以随意更改
    -->    
    <typeAliases>
        <!--
                com.qfedu.entity.Student 取别名  student
        -->
       <!-- <typeAlias type="com.qfedu.entity.Student" alias="student"></typeAlias>-->


        <!--
            使用 package 扫描包下对应的实体类 为所有的实体类 取别名
                com.qfedu.entity.Student  student  ,Student
        -->
        <package name="com.qfedu.entity"/>

    </typeAliases>

2使用

 <!--

        resultType="student" 引用 别名
    -->
    <select id="findAllStudent" resultType="Student">
        select id,name,age,sex,height from student_tb
    </select>

resultMap配置结果类型

当实体类中的字段和数据库中的字段不匹配时,我们可以有两种方式解决
-1.使用sql语句的 as 修改查询结果的名称
-2.使用resultMap,可以实现多个sql语句共用

resultMap作用
-1.当实体类中的字段和数据库中的字段不匹配时
-2.解决一对多,一对一问题

第一种方式:

 <!--
      实体类属性 和 数据库属性 不一致  
      第一种方案 使用 sql 别名
      
         使用别名 resultType="student2"
    -->
    <select id="findAllStudent2" resultType="student2">


        select id studentId,name studentName,sex studentSex,age studentAge ,height studentHeight  from   student_tb

    </select>

第二种方式:

<!--
       实体类属性 和 数据库属性 不一致
      第一种方案 使用 resultMap
      <resultMap 作用就是将实体类中的属性  查询结果中的列名映射
                    id="studentmap2" 唯一map id
                    type="Student2" 要映射为那个类型的对象
           <id property="studentId" column="id"></id>
                        <id  指的是主键列
                        property="studentId" 实体类中的属性 对应主键
                        column="id"  查询结果/数据表列名
            <result   代表普通的列
                    property="studentName"   实体类中的普通属性
                     column="name"   查询结果/数据表普通列名
                     javaType="" 对应 实体类改属性的 类型    可以不写
                     jdbcType="" 对应数据表中 该列的类型      可以不写
    -->

    <resultMap id="studentmap2" type="Student2">
        <id property="studentId" column="id"></id>
        <result property="studentName" column="name"></result>
        <result property="studentAge" column="age"></result>
        <result property="studentSex" column="sex"></result>
        <result property="studentHeight" column="height" ></result>
    </resultMap>


    <!--
        resultMap="studentmap2"引用自定义map 
    -->
    <select id="findAllStudent2" resultMap="studentmap2" >


        select id ,name ,sex ,age  ,height   from   student_tb

    </select>
import com.qfedu.entity.Student2;

import java.util.List;

public interface Student2Dao {

    /**
     * 查询所有学生
     * @return
     */
    List<Student2> findAllStudent2();
}

测试:

/**
     * 查询所有学生 使用resultMap
     */
    @Test
    public void findAllStudent2Test(){

        Student2Dao student2Dao = sqlSession.getMapper(Student2Dao.class);

        List<Student2> studentList2=  student2Dao.findAllStudent2();


        for (Student2 student2 : studentList2) {

            System.out.println("student2:"+student2);
        }

    }

三、mybatisConfig.xml配置文件

1、properties

在resource 中创建mysql.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/java2102?useSSL=false
jdbc.username=root
jdbc.password=123456

2、typeAliases别名

使用

<!--
        引入配置文件
      -->
    <properties resource="mysql.properties"></properties>

    <!--
        typeAliases 必须放到  <environments 之前
               xml 的约束 规定当前 xml 可以使用哪些 标签,标签的顺序,不可以随意更改
    -->
    <typeAliases>
        <!--
                com.qfedu.entity.Student 取别名  student
        -->
       <!-- <typeAlias type="com.qfedu.entity.Student" alias="student"></typeAlias>-->


        <!--
            使用 package 扫描包下对应的实体类 为所有的实体类 取别名
                com.qfedu.entity.Student  student  ,Student
        -->
        <package name="com.qfedu.entity"/>

    </typeAliases>

    <!--配置mybatis环境
        default="mysql" 选择哪一个环境
    -->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源
               POOLED 连接池形式
            -->
            <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>

3、mappers映射器配置

 <!--
         <mappers> 配置
    -->
    <mappers>
        <!--
            告诉mybatis 要根据配置文件StudentDao.xml 的配置 生成 对应的接口实现类
        -->

        <!--第一种 声明mapper  resource xxx.xml -->
       <!-- <mapper resource="com/qfedu/dao/StudentDao.xml"></mapper>
        <mapper resource="com/qfedu/dao/Student2Dao.xml"></mapper>-->

        <!-- 第二种 声明mapper   xxx....xxDao-->
      <!--  <mapper class="com.qfedu.dao.StudentDao"></mapper>
        <mapper class="com.qfedu.dao.Student2Dao"></mapper>-->


        <!-- 第三种 声明mapper <package
          mybatis  将包com.qfedu.dao 下所有的接口生成对应的对象
           -->
        
        <package name="com.qfedu.dao"/>

    </mappers>

4、开启驼峰映射


    <!--
        mapUnderscoreToCamelCase 开启驼峰映射写法 ,默认是关闭的  
            mybatis 会自动将 student_info 的列名 自动 映射到实体类 属性 studentInfo
                            student_info_version                    studentInfoVersion
    -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

多参数使用

 /**
     * 根据性别 和年龄 查选
     *
     * 多参数查询 传递
     *    在mybatis 中 如果有多个参数 并且使用 #{参数名} 必须在方法中为参数声明 别名 @Param("sex")
     *               findStudentBySexAndAge(@Param("sex") String sex,@Param("age") int age);
     *               
     *               也可以使用 arg0 arg1 或者 param1  param2
     *    如果是传多个属性(参数)
     *          也可以直接传对象
     *                      findStudentBySexAndAge(Student student);
     *          也可以直接传对象
     *                      findStudentBySexAndAge(Map map);
     * @param sex
     * @param age
     * @return
     */
    List<Student> findStudentBySexAndAge(@Param("sex") String sex,@Param("age") int age);
 <!--
        多参数查询 传递

        findStudentBySexAndAge(String sex,int age);
        内置参数应用
            sex   arg0  param1
            age   agr1  param2

        findStudentBySexAndAge(@Param("sex") String sex,@Param("age") int age);
    -->
    <select id="findStudentBySexAndAge" resultType="student">

        select id,name,age,sex,height from student_tb where sex = #{sex} and age = #{age}
    </select>

测试:

 /**
     * 多条件查选
     * 查询性别为 M 年龄为20 的人
     */
    @Test
    public void findStudentBySexAndAgeTest(){

        List<Student> studentList = studentDao.findStudentBySexAndAge("M", 20);

        for (Student student : studentList) {
            System.out.println("student:"+student);
        }
    }

以上是关于mybatis的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段