Mybatis框架整合详解(从数据库创建—到—框架搭建—再到—输出) 3

简介: Mybatis框架整合详解(从数据库创建—到—框架搭建—再到—输出)

连表查询

连表查询分为一对多、多对一和多对多,连表查询的话就只能使用resultMap属性来查询。

子表多对一

要先在子表的bean层添加主表对象并且进行封装

private Grade grade=new Grade();
    public Grade getGrade() {
        return grade;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
多对一MapperXML层

resultMap标签的        id属性下面用自己命名,type属性映射子表实体类的地址

resultMap标签的        id标签要和数据库id对应,property是和实体类对应column和数据库对应,

result标签也一样

association标签        property属性对应刚才实体类添加的主表实体类的名称,javaType属性映射父表实体类的地址

<?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.xinxi2.dao.StudentMapper">
    <resultMap id="StudentMap" type="com.xinxi2.bean.Student">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="bigname" column="bigname"></result>
        <result property="riqi" column="riqi"></result>
        <result property="age" column="age"></result>
        <association property="grade" javaType="com.xinxi2.bean.Grade">
            <id property="gradeID" column="GradeID"></id>
            <result property="gradeName" column="GradeName"></result>
        </association>
    </resultMap>
    <select id="getList"  resultMap="StudentMap">
        SELECT s.id,name,bigname,age,g.GradeName FROM `student` s,grade g
        where s.GradeID=g.GradeID
    </select>
</mapper>
多对一测试类
StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);
            List<Student> list=studentMapper.getList();
            for (Student student1:list){
                //getGrade()是父类对象的get方法后面的getGradeName()方法是父类的班级名称的get方法
                System.out.println(student1.getName()+student1.getGrade().getGradeName());
            }

父表一对多

要先在父表的bean层添加子表列表方法并且进行封装,因为一个班级有多个学生

private List<Student> studentList=new ArrayList<>();
    public List<Student> getStudentList() {
        return studentList;
    }
    public void setStudentList(List<Student> studentList) {
        StudentList = studentList;
    }
一对多MapperXML层

一对多和多对一的sql语句都不用动,resultMap标签type属性和下面的互换一下

collection标签        property属性对应刚才实体类添加的子表实体类列表的名称,ofType属性映射子表实体类的地址

<?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.xinxi2.dao.GradeMapper">
    <resultMap id="GradeMap" type="com.xinxi2.bean.Grade">
        <id property="gradeID" column="GradeID"></id>
        <result property="gradeName" column="GradeName"></result>
        <collection property="studentList" ofType="com.xinxi2.bean.Student">
            <id property="id" column="id"></id>
            <result property="name" column="name"></result>
            <result property="bigname" column="bigname"></result>
            <result property="riqi" column="riqi"></result>
            <result property="age" column="age"></result>
        </collection>
    </resultMap>
    <select id="getGradeList" resultMap="GradeMap">
        SELECT s.id,name,bigname,age,g.GradeName FROM `student` s,grade g
        where s.GradeID=g.GradeID
    </select>
</mapper>
多对一测试类
GradeMapper gradeMapper=sqlSession.getMapper(GradeMapper.class);
            List<Grade> list=gradeMapper.getGradeList();
            for (Grade grade:list){
                System.out.println(grade.getGradeName());//输出班级name
                for (Student student1:grade.getStudentList()){
                    System.out.println(student1.getName()+student1.getBigname());
                }
            }

动态Sql

动态Sql更方便业务实现,mybatis提供了许多标签来使用,使代码更加的简便

where标签
<select id="getListbyStudent" resultType="com.xinxi2.bean.Student" parameterType="com.xinxi2.bean.Student">
        select * form student
        <where>
            <if test="name!=null">
                and name=#{name}
            </if>
            <if test="bigname!=null">
                and bigname=#{bigname}
            </if>
        </where>
    </select>

and一定要加在条件前面,mybatis会自动添加where 和 and,带#{}的name是实体类里面的,不带的是数据库的

set标签
<update id="updateStudent" parameterType="com.xinxi2.bean.Student">
    update student
    <set>
        <if test="name!=null">
            name=#{name},
        </if>
        <if test="bigname!=null">
            bigname=#{bigname},
        </if>
    </set>
    where id=#{id}
</update>

set标签多数用于修改,而set标签是在条件后面加英语符号的”,“。

foreach标签

接口:

List<Student> getListbyList(List<String> list);//参数是列表

实现类:

<select id="getListbyNames" resultType="com.xinxi2.bean.TSysUser">
        SELECT * FROM `t_sys_user` where realName in
        <foreach collection="list" open="(" separator="," close=")" item="goods">
            #{goods}
        </foreach>
    </select>

foreach标签 collection属性对应接口的参数列表,open列表遍历完的开头,separator是列表中格格元素之间的分隔符,open列表遍历完的结尾,item集合中元素迭代时的别名。

trim标签

trim标签说白了就是可以自定义动态sql,前面的where标签和set标签都可以使用trim来自定义。

自定义where
<select id="getListbyStudent01" resultType="com.xinxi2.bean.Student" parameterType="com.xinxi2.bean.Student">
        select * form student
        <trim prefix="where" prefixOverrides="or|and">
            <if test="name!=null">
                and name=#{name}
            </if>
            <if test="bigname!=null">
                and bigname=#{bigname}
            </if>
        </trim>
    </select>

自定义update

<update id="updateListbyStudent02" parameterType="com.xinxi2.bean.Student">
        update student
        <trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
            <if test="name!=null">
                and name=#{name},
            </if>
            <if test="bigname!=null">
                and bigname=#{bigname},
            </if>
        </trim>
    </update>

trim属性

prefix 给sql语句拼接的前缀
suffix 给sql语句拼接的后缀
prefixOverrides 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

(完)

相关文章
SQL XML Java
32 0
|
29天前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
70 12
|
2月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
152 0
|
3月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
276 0
|
5月前
|
人工智能 数据挖掘 API
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
546 21
基于neo4j数据库和dify大模型框架的rag模型搭建——后续补充
|
5月前
|
Java 数据库 Docker
基于neo4j数据库和dify大模型框架的rag模型搭建
基于neo4j数据库和dify大模型框架的rag模型搭建
1159 35
|
6月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
302 14
|
7月前
|
Oracle 关系型数据库 Java
|
7月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
8月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
796 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡