Mybatis03学习笔记

目录

使用注解开发

设置事务自动提交

mybatis运行原理

注解CRUD

lombok使用(偷懒神器,大神都不建议使用)

复杂查询环境(多对一)

复杂查询环境(一对多)

动态sql环境搭建

动态sql常用标签

    


使用注解开发

注解本质是反射机制,使用注解可以使得代码内容得到简化,注解可以取代注册文件UUserMapper.xml

如下面定义接口,在接口上方定义注解写sql语句

public interface UserMapper {
    @Select("select * from user")
    List<User> getUsers();
}

需要在核心配置文件绑定接口

设置事务自动提交

基于源码

 

我们可以设置事务自动提交

SqlSession  sqlSession=sqlSessionFactory.openSession(true);

mybatis运行原理

 

注解CRUD

查询所有用户

接口

@Select("select * from user")
List<User> getUsers();

测试

@Test
public void getUsers(){
    SqlSession sqlSession= MybatisUtils.getSqlSession();
    UserMapper mapper=sqlSession.getMapper(UserMapper.class);
    List<User> users=mapper.getUsers();
    for(User user:users){
        System.out.println(user);
    }
    sqlSession.close();
}

根据id查询用户

接口

@Select("select * from user where id=#{35342}")
    User getUserById(@Param("35342") int id);

测试

public void getUsers(){
    SqlSession sqlSession= MybatisUtils.getSqlSession();
    UserMapper mapper=sqlSession.getMapper(UserMapper.class);

    User userById=mapper.getUserById(1);
    System.out.println(userById);
    sqlSession.close();
}

增加用户

接口

@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{pwd})")
    int addUser(User user);

测试

SqlSession sqlSession= MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(12,"hello","Ssdd"));


修改用户信息

接口

@Update("UPDATE USER set NAME=#{name},PWD=#{pwd} where id=#{id}")
int updateUser(User user);

测试

SqlSession sqlSession= MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(12,"ttt","12443"));

删除用户

接口

@Delete("delete from user where id=#{id}")
int delUser(int id);

测试

SqlSession sqlSession= MybatisUtils.getSqlSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
mapper.delUser(12);

接口总的代码:

package com.dao;

import com.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

public interface UserMapper { 
    @Select("select * from user")
    List<User> getUsers();
//    通过id查询
@Select("select * from user where id=#{35342}")
    User getUserById(@Param("35342") int id);
@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{pwd})")
    int addUser(User user);
@Update("UPDATE USER set NAME=#{name},PWD=#{pwd} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int delUser(int id);
}

测试总的代码:

import com.dao.UserMapper;
import com.pojo.User;
import com.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class test {
    @Test
    public void getUsers(){
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        UserMapper mapper=sqlSession.getMapper(UserMapper.class);
        List<User> users=mapper.getUsers();
        for(User user:users){
            System.out.println(user);
        }
        User userById=mapper.getUserById(1);
        System.out.println(userById);
        mapper.updateUser(new User(12,"ttt","12443"));
        mapper.addUser(new User(12,"hello","Ssdd"));
        mapper.delUser(12);
        sqlSession.close();
    }
}

关于@Params()注解:

有多个参数则所有参数前一定要加上@Params()

lombok使用(偷懒神器,大神都不建议使用)

自动帮我们优化一些变量,但是会淡化我们对源码的理解

使用:导入jar包,在实体类上方加注解即可

@Data取代getter和setter方法

@AllArgsConstructor生成所有有参构造

@NoArgsConstructor生成所有无参构造

@ToString

如可以帮助我们写get,set,toString方法等

 

复杂查询环境(多对一)

实体类准备

//多对一
@Data
@ToString
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}
@Data
@ToString
public class Teacher {
    private int id;
    private String name;
   
}

tid是一个外键,用通常的方法:写接口-配置的xml文件-测试类查询student表信息,,这种方法查出来无法查到具有复制属性的tid

因此我们应该在Student.xml文件中通过某种方式关联上复杂属性tid才能查出来,下面有两种方式:

1.类似子查询方式

 Test.java代码:

public void testStudent(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    StudentMapper mapper1=sqlSession.getMapper(StudentMapper.class);
    List<Student> studentList=mapper1.getStudent();
    for(Student student:studentList){
        System.out.println(student);
    }
    sqlSession.close();

}

Student.xml代码:

<!--通过子查询方式-->
    <select id="getStudent" resultMap="StudentTeacher" >
        select * from student
    </select>
    <!--    结果集查询-->
    <resultMap id="StudentTeacher" type="com.pojo.Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
    <!--        复制的属性tid是外键,要单独处理-->
        <association property="teacher" column="tid" javaType="com.pojo.Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="com.pojo.Teacher">
        select * from teacher where id=#{id}
    </select>

2.结果集映射方式

 Test.java代码不变,Student.xml代码:

<!--    通过结果嵌套处理-->
    <select id="getStudent" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t where s.tid=t.id;
    </select>
    <resultMap id="StudentTeacher2" type="com.pojo.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="com.pojo.Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>

查询结果:

 

复杂查询环境(一对多)

实体类准备

//一对多
@Data
@ToString
public class Student {
    private int id;
    private String name;
    private int tid;
}

@Data
@ToString
public class Teacher {
    private int id;
    private String name;
    //一个老师拥有的学生集合
    private List<Student> students;
}

   TeacherMapper接口代码:

//获取指定老师下的所有学生
Teacher getTeacher(@Param("tid") int id);

  TeacherMapper.xml代码

<!--    方式一按结果嵌套查询-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid,s.name sname,t.name tname,t.id tid
        from student s,teacher t
        where s.tid=t.id and t.id=#{tid}
    </select>

    <resultMap id="TeacherStudent" type="com.pojo.Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
<!--        实体类teacher还有一个学生集合的属性,javaType指定属性的类型
复杂属性我们要单独处理,集合中泛型得到信息用ofType获取, private List<Student>-->
        <collection property="students" ofType="com.pojo.Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
<!--    方式二按子查询-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select * from mybatis.teacher where id=#{tid}
    </select>
    <resultMap id="TeacherStudent" type="com.pojo.Teacher">
        <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
    </resultMap>

    <select id="getStudentByTeacherId" resultType="com.pojo.Student">
        select * from mybatis.student where tid=#{tid}
    </select>

测试代码

public void test() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println(teacher);
    sqlSession.close();
}

查询结果:

 关于type,resultType, ofType,javaType:

1.type在resultMap标签中使用

2.resultType用于select标签中,表示sql语句返回的对应在Java中的类型

2.ofType用来指定映射到List或集合中的pojo的类型,泛型中的约束类型

3.javaType是用来指定实体类的属性的类型

动态sql环境搭建

这部分相当于回顾之前所学

编写获取UUID的工具类

public class IDutils {
    public static String getId(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
//    @Test
//    public void test(){
//        System.out.println(IDutils.getId());
//    }
}

编写java映射数据库ORM实体类

public class Blog {
    private String id;
    private String title;
    private String author;
    private Date createTime; //属性和字段不一致
    private int views;
}

编写添加接口BlogMapper

public interface BlogMapper {
    int addBlog(Blog blog);
}

BlogMapper.xml注册sql文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.BlogMapper">
    <insert id="addBlog" parameterType="com.pojo.Blog">
        insert into mybatis.blog(id,title,author,create_time,views)
        values(#{id},#{title},#{author},#{createTime},#{views});
    </insert>
</mapper>

测试代码:

public class Test {
    @org.junit.Test
    public void addInitBlog(){
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
        Blog blog=new Blog();
        blog.setId(IDutils.getId());
        blog.setTitle("MyBATIS如此简单");
        blog.setAuthor("狂");
        blog.setCreateTime(new Date());
        blog.setViews(9999);
        mapper.addBlog(blog);

        blog.setId(IDutils.getId());
        blog.setTitle("java如此简单");
        mapper.addBlog(blog);
        
        blog.setId(IDutils.getId());
        blog.setTitle("spring如此简单");
        mapper.addBlog(blog);

        blog.setId(IDutils.getId());
        blog.setTitle("vue如此简单");
        mapper.addBlog(blog);

        sqlSession.close();
    }
}

测试结果:

 

动态sql常用标签

<if>标签测试

接口

List<Blog> queryBlogIF(Map map);

对应注册文件

if标签如果满足标签内部的条件,就执行

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.BlogMapper">
    <insert id="addBlog" parameterType="com.pojo.Blog">
        insert into mybatis.blog(id,title,author,create_time,views)
        values(#{id},#{title},#{author},#{createTime},#{views});
    </insert>
    <select id="queryBlogIF" parameterType="map" resultType="com.pojo.Blog">
        select * from mybatis.blog where 1=1
        <if test="title !=null">
            and title=#{title}
        </if>
        <if test="author !=null">
            and author=#{author}
        </if>
    </select>
</mapper>

测试代码

public class Test {
    @org.junit.Test
    public  void queryBlogIF(){
        SqlSession sqlSession=MybatisUtils.getSqlSession();
        BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
        List<Blog> blogs=mapper.queryBlogIF(new HashMap());
        for(Blog blog:blogs){
            System.out.println(blog);
        }
    }
}

choose(when,otherwise)

<select id="queryBlogChoose" parameterType="map" resultType="com.pojo.Blog">
    select * from mybatis.blog
    <choose>
        <when test="title!=null">
            title=#{title}
        </when>
        <when test="author!=null">
            and author=#{author}
        </when>
        <otherwise>
            and views=#{views}
        </otherwise>
    </choose>
</select>

测试代码

@org.junit.Test
public void queryBlogChoose(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
    Map map=new HashMap();
    List<Blog> blogs=mapper.queryBlogIF(map);
    for(Blog blog:blogs){
        System.out.println(blog);
    }
    sqlSession.close();

}

trim(where,set)

1.where元素只会在至少一个子元素的条件返回sql子句的情况下才去插入where子句,而且若语句开头为and或者or,where元素会自动将其去掉,如:

 

2.set+<update>标签

接口

int updateBlog(Map map);

xml代码

<update id="updateBlog" parameterType="map">
    update mybatis.blog
    <set>
        <if test="title!=null">
            title=#{title},
        </if>
        <if test="author!=null">
            author=#{author}
        </if>
    </set>
    where id=#{id}
</update>

测试代码

public void updateBlog(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
    Map map=new HashMap();
    map.put("title","vue如此简单2"); //相当于显示条件,只查找title="java如此简单"的记录
    map.put("id","0ae64f7aa9c94d2e8b10046d902dc4cd");
    mapper.updateBlog(map);
    sqlSession.close();
}

运行结果:

 解决代码冗余<sql>标签和<include>标签

将重复的代码提取出来用sql标签包装,在需要使用的地方用include标签使用

<foreach>标签

接口

List<Blog> queryBlogForEach(Map map);

xml代码

<select id="queryBlogForEach" parameterType="map" resultType="com.pojo.Blog">
    select * from mybatis.blog
    <where>
        <foreach collection="ids" item="id" open="and (" close=")" separator="or">
            id=#{id}
        </foreach>
    </where>
</select>

测试代码

@org.junit.Test
public void queryBlogForEach(){
    SqlSession sqlSession=MybatisUtils.getSqlSession();
    BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);
    Map map=new HashMap();
    ArrayList<Integer> ids=new ArrayList<Integer>();//存放interger的一个列表list
    ids.add(1);
    ids.add(2);
    map.put("ids",ids);
    List<Blog> blogs=mapper.queryBlogForEach(map);
    for(Blog blog:blogs){
        System.out.println(blog);
    }
    sqlSession.close();
}

    

运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/12307.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据实战 --- 淘宝用户行为

目录 开发环境 数据描述 功能需求 数据准备 数据清洗 用户行为分析 找出有价值的用户 开发环境 HadoopHiveSparkHBase 启动Hadoop&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup hiveserver2 1>/dev/null 2>…

生成树端口选举

所有交换机运行RSTP,SW1优先级4096,SW2优先级4096,SW3优先级8192,SW1的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW1的G0/0/3、G0/0/4接口通过手动模式加入Eth-Trunk 2,SW2的G0/0/1、G0/0/2接口通过手动模式加入Eth-Trunk 1,SW3的G0/0/1、G0/0/2接口通过手动模式…

【Python】Python读写.xlsx文件(基本操作、空值补全等)

【Python】Python读写.xlsx文件&#xff08;Pandas&#xff09; 文章目录 【Python】Python读写.xlsx文件&#xff08;Pandas&#xff09;1. 介绍2. Pandas读写xlsx文件2.1 基本操作2.1.1 实现任务2.1.2 代码2.1.3 结果 2.2 进阶操作2.2.1 写操作2.2.2 查看数据表的基本信息2.2…

电脑有自带的录屏功能吗?电脑录屏如何录人脸

案例&#xff1a;所有电脑都有自带的录屏功能吗&#xff1f; “在网上了解到电脑有录屏功能&#xff0c;但是我在我的电脑上又找不到。想问问小伙伴们是所有的电脑都有自带的录屏功能吗&#xff1f;怎样才能找到电脑自带的录屏功能&#xff1f;” 在日常使用电脑时&#xff0…

Python 无监督学习实用指南:1~5

原文&#xff1a;Hands-on unsupervised learning with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关…

封装通用el-form表单(2种方式)

1、序言 项目地址&#xff1a;git clone form-demo: 封装通用el-form 一个后台管理系统最常见的是表单&#xff0c;表单最常见的是输入框、下拉选择、日期选择、单选、复选框等等&#xff0c; 系统添加若干模块&#xff0c;就复制粘贴若干个el-form、el-form-item&#xff0c;有…

重学Java设计模式-行为型模式-责任链模式

重学Java设计模式-行为型模式-责任链模式 内容摘自&#xff1a;https://bugstack.cn/md/develop/design-pattern/2020-06-18-重学 Java 设计模式《实战责任链模式》.html#重学-java-设计模式-实战责任链模式「模拟618电商大促期间-项目上线流程多级负责人审批场景」 责任链模…

Shell 脚本编程

1. shell 概述 &#x1f95e; shell 是一个命令行解释器&#xff0c;它能接受应用程序、用户 的命令&#xff0c;然后调用操作系统内核。 ⭐ 还是一门 功能强大的编程语言&#xff0c;易编写、易调试、灵活性强。 2. shell入门 &#xff08;1&#xff09;脚本格式 &#x1f…

js中 = 等号赋值的问题,Js中对象的引用问题,深浅拷贝

js "" 赋值符号 在js中 “”对于基本数据类型是赋值符号&#xff0c;比较&#xff08; 或 &#xff09;的时候是值&#xff1b;对于引用数据类型-对象来说 是地址引用&#xff0c;比较的时候是比较的地址。 基本数据类型和引用数据类型的比较 let a 3; let b a;…

离散数学_九章:关系(1)

关系 9.1关系及其性质 1、二元关系 2、集合A上的关系 3、n元素集合 有多少个关系&#xff1f; 4、关系的性质 1. 自反 2. 对称 3. 反对称 4. 传递 5、关系的组合 关系的合成 关系的幂 9.1关系及其性质 1、二元关系 设A和B是集合&#xff0c;一个从 A 到 B 的二元关…

stm32当中GPIO输出知识点汇总(GPIO的八种模式及其原理)

一、GPIO工作模式. 1. 四种输入模式 GPIO_Mode_IN_FLOATING 浮空输入模式 GPIO_Mode_IPU 上拉输入模式 GPIO_Mode_IPD 下拉输入模式 GPIO_Mode_AIN 模拟输入模式 2. 四种输出模式 GPIO_Mode_Out_OD 开漏输出模式 GPIO_Mode_Out_PP 推挽输出模式 GPIO_Mod…

CentOS7-部署Tomcat并运行Jpress

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1、简述静态网页和动态网页的区别 静态网页&#xff1a; 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进…

目标检测基础之IOU计算

目标检测基础之IOU计算 概念理解——什么是IOUdemo后记 概念理解——什么是IOU IOU 交并比&#xff08;Intersection over Union&#xff09;&#xff0c;从字面上很容易理解&#xff1a;计算交集在并集的比重。从网上截张图看看 I O U A ∩ B A ∪ B IOU \frac{A \cap B}…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试 安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQL BenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测&#xff08;固定事务数量&#xff09;TPC-C压测&#xff08;固定时长&#xff09;生成测…

[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

文章目录 一、前言二、SQL Server 主从同步的原理介绍三、具体的搭建过程3.1 准备工作3.1.1 卸载旧版本&#xff08;如果有&#xff0c;可选&#xff0c;非必须&#xff09;3.1.2 安装 Docker3.1.3 验证本地 Docker 是否安装成功 3.2 创建 Docker 网络3.3 创建主从节点的 SQL S…

[Linux系统]系统安全及应用一

系统安全及应用 一、账号安全基本措施1.1系统账号清理1.1.1将非登录用户的shell设为/sbin/nologin1.1.2锁定长期不使用的账号1.1.3删除无用的账号1.1.4锁定账号文件文件chattr1.1.5查看文件校验和md5sum 1.2密码安全控制1.2.1设置密码有效期 1.3历史命令限制1.3.1 减少记录命令…

C语言笔记 | 一元三次方程

文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 在 1545 年&#xff0c;意大利学者卡丹所写的《关于代数的大法》中&#xff0c;提出了一元三次方程的求根公式。人们将其称为卡丹公式。对于标准型的一…

港科夜闻|国务院港澳办主任夏宝龙在香港科大考察期间,表示对学校开展创科工作的鼓励及希望...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、国务院港澳办主任夏宝龙在香港科大考察期间&#xff0c;表示对学校开展创科工作的鼓励及希望。考察期间&#xff0c;夏宝龙主任参观了香港科大的空气动力学和声学实验中心&#xff0c;以及香港科大先进显示与光电子技术国…

4个 Python 库来美化你的 Matplotlib 图表

Matplotlib是一个被广泛使用的Python数据可视化库&#xff0c;相信很多人都使用过。 但是有时候总会觉得&#xff0c;Matplotlib做出来的图表不是很好看、不美观。 今天我就给大家分享四个美化Matplotlib图表的Python库&#xff0c;它们可以轻松让你的Matplotlib图表变得好看…

( “树” 之 DFS) 404. 左叶子之和 ——【Leetcode每日一题】

404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1]…