MyBatis应用实战

1.认识MyBatis


什么是MyBatis?

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。

MyBatis还是一个半自动化的ORM框架,区别于Hibernate,hibernate是全自动化的ORM实现。

持久化:数据由内存中的瞬态状态转化为数据库中的持久状态过程。

ORM(Object Relational Model):这是一种理念,在对象模型和关系型数据库之间建立起对应关系,并且提供一种机制,可以让Javabean对象操作数据库中的表的数;操作指的是:增删改查,事务。

2、使用MyBatis


约定>配置>编码

添加MyBatis的依赖到项目中的pom.xml

<!--添加依mybaties赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

创建MyBatis的配置文件mybatis-config.xml 配置项的顺序要严格按照以下顺序来写

configuration (配置)
    properties (属性)
    settings (设置)
    typeAliases (类型别名)
    environments (环境配置)
         environment (环境变量)
            transactionManager (事务管理器)
            dataSource (数据源)
    mappers (映射器)
<?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="database.properties" />


    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>

        <setting name="autoMappingBehavior" value="NONE"/>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>


    <!--配置mubatis的运行环境-->
    <!--给实体类取别名-->
    <typeAliases>
        <package name="com.niit.demo.pojo"/>
        <package name="com.niit.demo.vo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">

    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${driverName}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </dataSource>
</environment>
</environments>
    <!--配置SQL映射文件-->
    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
        <mapper resource="mapper/CourseMapper.xml"/>
        <mapper resource="mapper/TypeMapper.xml"/>
    </mappers>
</configuration>

创建SQL映射文件StudentMapper.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">
<mapper namespace="com.niit.demo.mapper.StudentMapper">
    <select id="queryStudents" resultType="Student">
     select * from cs_student
 </select>
    <select  id="queryStudentByName" parameterType="string" resultType="Student">
        select *from cs_student where stu_name like concat('%',#{stuName},'%');  <!--$不会进行类型转换-->
    </select>
    <select id="queryStudentByCondition" parameterType="Student" resultType="Student">
        select  * from cs_student where stu_name like concat('%',#{stuName},'%')and grade=#{grade}
    </select>
    <select id="queryStudentByParam" resultMap="stuMap">
 select  * from cs_student where stu_name like concat('%',#{stuname},'%')and gender=#{gender}
    </select>
    <!--自定义java实体类对象和数据库表之间的映射关系-->
    <resultMap id="stuMap" type="Student">
        <id property="stuId" column="stu_id"/>
        <result property="stuPass" column="stu_pass"/>
        <result property="stuNumber" column="stu_number"/>
        <result property="stuName" column="stu_name"/>
        <result property="stuClass" column="stu_class"/>
        <result property="stuAccount" column="stu_account"/>
    </resultMap>
</mapper>

编写测试类的代码,实现一个MyBatis对数据库的操作

package test;

import com.niit.demo.mapper.StudentMapper;
import com.niit.demo.mapper.TypeMapper;
import com.niit.demo.pojo.Course;
import com.niit.demo.pojo.Student;

import com.niit.demo.vo.TypeVo;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

//学习Mybatis,基于Junit的单元测试
public class Mybatis {
    @Test
    public void fisetExcute() throws IOException {
        //加载配置文件,初始化上下文
        InputStream is = Resources.getResourceAsStream("mybaties-config.xml");
        //创建SQLSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //创建SQLSession打开会话,与数据库建立一次会话
        SqlSession sqlSession = factory.openSession();
        //  List<Student> stus=sqlSession.selectList("StudentMapper.queryStudents");
        //  List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudents();

        //List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudentByName("四 ");
        //  Student stu_condition=new Student();
        //  stu_condition.setStuName("王");
        //  stu_condition.setGrade("大二");

        //  List<Student> stus=sqlSession.getMapper(StudentMapper.class).queryStudentByCondition(stu_condition);

        List<Student> stus = sqlSession.getMapper(StudentMapper.class).queryStudentByParam("王", "1");
        for (Student stu : stus) {
            System.out.println("姓名:" + stu.getStuName() + "年级:" + stu.getGrade() + "地址:" + stu.getAddress() +
                    "pass:" + stu.getStuPass() + "Number:" + stu.getStuNumber() +
                    "telphone:" + stu.getTelphone() + "性别:" + stu.getGender());
        }

    }

测试结果

==>  Preparing: select * from cs_student where stu_name like concat('%',?,'%')and gender=?
==> Parameters: 王(String), 1(String)
<==    Columns: stu_id, stu_account, stu_pass, stu_number, stu_name, faculty, grade, stu_class, gender, telphone, address
<==        Row: 6, wangwu, 123456, 20220213123, 王五, 信息工程学院, 大二, CS1, 1, 15123456789, 太原市中心医院
<==        Row: 8, wang, 123456, 20220213125, 王文英, 信息工程学院, 大四, SE1, 1, 15123456789, 宁夏大学
<==      Total: 2
姓名:王五年级:null地址:nullpass:123456Number:20220213123telphone:null性别:null
姓名:王文英年级:null地址:nullpass:123456Number:20220213125telphone:null性别:null

使用Mapper接口实现sql调用

1. 接口文件名称应该与映射文件的文件名称完全一致。
2. 接口中的方法名与映射文件中某一个标签的 id 值要对应
3. 映射文件中的 namespace 的值应该与接口文件的完全限定名一样
4. 映射文件中的数据返回类型应该匹配具体结果的类型,和返回的数量存储集
合没有关系。例如,无论你是返回一个用户还是用户列表,对于映射文件中
的语句,返回值类型都应该是 User 而不是 list.
package com.niit.demo.mapper;

        import com.niit.demo.pojo.Student;
        import org.apache.ibatis.annotations.Param;

        import java.util.List;

public interface StudentMapper {
    //方法名要和映射文件中查询的id要一模一样
    List< Student> queryStudents();
    //根据学生姓名模糊查询
    List<Student> queryStudentByName(String stuName);

    List<Student>  queryStudentByCondition(Student student);
    //借助@param注解来完成多参数入参
    List<Student> queryStudentByParam(@Param("stuname") String stuName,@Param("gender") String gender);


}
XXXMapper.xml 中的配置说明
 1. 1. mapper 标签:
            2.   1. namespace: 命名空间 = Mapper 接口完全限定名
            3. mapper 元素的子标签:
            4. 1. select 标签。 主要用于执行查询操作
                  2. 1. id 属性:对应 mapper 接口中的方法名。(他和 namespace 共同作为当前元素
                          在整个项目中唯一的标识)
                      2. resulType 属性:指定查询结果的返回值类型,一般就是实体类的别名。或者
                         是基本数据类型,再或者就是 string 类型
                        3. parameterType 属性:入参类型 一般就是实体类的别名。或者是基本数据类
                            型,再或者就是 string 类型

3.MyBatis的映射文件

SQL映射文件:XXXMapper.xml
1. mapper: 根节点元素,有一个属性 namespace,mybatis 通过 namespace 中的完全限定名来找到与
之绑定的 DAO 接口。并且与子元素的 Id 共同作为全局唯一的标识。
2. resultMap: 映射返回的结果。也就是用来实现 ORM 。相关的: resultType( 有不同 ), 自定义映射关系
3. sql: 对于经常使用,反复执行的 sql 语句可以放到 Sql 标签中,供其他语句引用。
4. insert update delete select 增、改、删、查。
5. 内置的基本数据类型对应的别名 :
别名           映射类型         别名             映射类型
string           String             double              Double
byte             Byte                float                  Float
long             Long               boolean            Boolean
short            Short              date                  Date
int                Integer            map                  Map
integer         Integer            hashma            HashMap
arraylist        ArrayList          list                   List

 3.1、单条件查询--一个参数如何入参

1.接口方法上定义带一个形参的抽象方法

 List<Student> queryStudentByName(String stuName);
2. 映射文件中的节点配置 parameterType (入参类型),在 sql 语句中使用 #{ 变量名 } 来取值
注意 :在映射文件中取参,可以使用 #{} , 也可以使用 ${} , #{} 相当于preparedStatement, ${} 相当于 Statement
<select id="queryStudentsByName" resultType="Student" 
parameterType="string">
 select * from student where StudentName like concat(#{stuName},'%') 
</select>

3.2 多参数入参

方法一:封装成对象入参  适合超过3个参数时,本质是把对象转换成map方式存储的数据  key=属性名,value=属性对应的值

1.接口方法上定义一个参数,使用具体的类的定义

List<Student>  queryStudentByCondition(Student student);

2.映射文件中根据类的属性名去获取参数的值

 <select id="queryStudentByCondition" parameterType="Student" resultType="Student">
        select  * from cs_student where stu_name like concat('%',#{stuName},'%')and grade=#{grade}
    </select>

方法二:使用注解@Param进行多参数入参   三个参数以内的方法

1.接口方法上定义参数并且使用@Param()注解标识

List<Student> queryStudentByParam(@Param("stuname") String stuName,@Param("gender") String gender);

2.映射文件使用#{}去取值

 <select id="queryStudentByParam" resultMap="stuMap">
 select  * from cs_student where stu_name like concat('%',#{stuname},'%')and gender=#{gender}
    </select>

3.3、自定义映射结果集

mybatis 是基于半自动化的 ORM 映射的框架,内部已经完善了 Object--Relational 之间的映射。

在显示学生信息的同时显示当前学生所在年级名称该如何映射?

使用resultMap可以自定义映射关系

上述问题可以使用以下步骤完成

1.添加实体类,添加属性stuId来存储学生姓名,作为扩展属性

public class Student {
 private  Long stuId;//学生id对应cs_student表中的主键id

public Long getStuId() {
        return stuId;
    }

    public void setStuId(Long stuId) {
        this.stuId = stuId;
    }
}

2.修改Mapper映射文件,使用 resultMap 自定义映射结果

 <!--自定义java实体类对象和数据库表之间的映射关系-->
    <resultMap id="stuMap" type="Student">
        <id property="stuId" column="stu_id"/>
        <result property="stuPass" column="stu_pass"/>
        <result property="stuNumber" column="stu_number"/>
        <result property="stuName" column="stu_name"/>
        <result property="stuClass" column="stu_class"/>
        <result property="stuAccount" column="stu_account"/>
    </resultMap>
resultType resultaMap 区别
1. 共同点:本质上都是map类型的数据, 不能同时出现,只能选其中一个
2. 区别:
 resultType :
当数据库查询的结果在实体类的属性中可以找到名字相同的属性,就可以完成自动映
射。通常都是基本类型或者复杂的类型
resultMap:
 当数据库中返回的字段与实体类中的属性不一致时,需要手动映射。
复杂的多表联合查询时,需要定制化的需求时,需要自由的控制映射结果时。

3.4、mybais的自动映射级别

MyBatis 自动映射分级别,可以使用 autoMappingBehavior 来进行设置,一般情况下默认
是: PARTIAL
PARTIAL 除了一对一和一对多关系之外的映射可以全部自动映射。
NONE 禁止使用自动映射
FULL 全部自动映射
使用自动映射的充分必要条件:
查询结果 字段和属性名 完全一致 的情况下才可以自动映射。
开启自动映射
mybatis-config.xml 文件中的 settings 标签下配置自动映射级别
<setting name="autoMappingBehavior" value="NONE"/>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值