一小时快速入门MyBatis(知识结构清晰)
创始人
2024-03-30 09:22:41
0

文章目录

  • MyBatis简介
  • MyBatis初始配置
  • 将idea连接数据库,获取sql语句补全
  • Mapper映射
  • 代理开发
  • 查询数据的方法:
  • 动态sql语句
  • 添加和修改数据
  • 删除数据
  • 注解开发
  • 总结:
  • 补充:MyBatis其他配置

MyBatis简介

MyBatis是一个持久层框架,用来简化JDBC开发。

JDBC开发主要存在两个缺点:
一是硬编码,sql语句写在代码中,不利于修改。
二是操作繁琐,需要手动将查询结果放入实体类(实体类过于繁琐)。

MyBatis通过配置文件,取代手动初始化和连接数据库的代码,同时统一管理sql语句。
通过对应的API简化了几乎所有的JDBC代码。

MyBatis初始配置

在pom.xml中导入jar包

    org.mybatismybatis3.5.11

创建mybatis-config.xml配置文件,官网示例如下:





其中,property是四个关键属性,这里不多赘述。

mapper填写映射配置文件(xml格式)的路径。

将idea连接数据库,获取sql语句补全

在这里插入图片描述
填写对应的数据库名称和密码
在这里插入图片描述

Mapper映射

映射是指,一个工程需要很多sql语句,对于每个sql语句单独编写相应的代码,开发效率过低。
mybatis将所有的sql语句写在配置文件中,进行统一管理。
为了精确的定位每个sql语句,就需要映射。
官网配置文件样例:





其中,命名空间和select标签中的语句需要修改。
上面配置文件的含义是:namespace空间中,有名称为id=selectBlog的查询语句,这语句返回一个类名为Blog的类。
注:sql语句中的某些字符写在xml中会报错,例如"<"。解决方案有转义字符(<)和CDATA区。

代理开发

代理开发是创建一个接口,接口的url对应配置文件的namespace,接口的方法对应配置文件中每一个sql语句。

在不使用代理开发时,执行sql语句的代码如下(官网示例):

try (SqlSession session = sqlSessionFactory.openSession()) {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}

在使用代理开发时,执行 sql语句的代码如下:

try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
}

可以看出,使用使用代理开发的方法,首先声明了一个映射器类(接口),这个映射器类对应的就是一个XML的mapper标签,然后调用对应的方法(selectBlog)即可。
这种写法避免了强制类型转换,且避免了字符串 没有补全且容易出错的问题。

查询数据的方法:

  1. 单个占位符:
    在mapper中编写sql语句时加上占位符,占位符可以替换成相应的变量

        
    

    占位符有两种格式,一种是#{},另一种是${}
    在mapper接口中添加对应的接口即可

    public interface studentMapper {
    //    ListselectAll();List selectByName(String name);
    }
    
  2. 多个条件查询:
    方法1:
    再接口处定义多个参数,通过注解和xml文件映射
    sql语句:

        
    

    接口:

    //使用@Param注解
    List selectByCondition(@Param("name") String name,@Param("age")int age);
    

    调用:

    //直接传参即可
    Listx=mapper.selectByCondition("张三",18);
    

    方法2:
    直接传入一个类(JavaBean),表示参数:

    //直接传参即可
    Listx=mapper.selectByCondition(selectStudent);
    //selectStudent中的参数会作为查询的参数
    

    方法3
    map传参

  3. resultMap映射查询结果
    为了解决sql表和实体类中名称不一致,可以使用resultMap进行结果映射。
    下面代码将sql表上x列的查询结果映射到了y变量上。

        
    

动态sql语句

动态sql靠Mybatis提供的标签实现,这里介绍标签
where标签用来替换sql语句中的where关键词
if标签用来判断sql语句中那些条件需要执行。
例如:
有如下sql代码:

    

在执行sql时,如果两个参数均为null,语句也可以执行。

Listx=mapper.selectByCondition(null,null);

添加和修改数据

编写接口:

void insertStudent(student student);

编写sql语句:

    insert into student(student_number,name,gender,age,department)values(#{student_number},#{name},#{gender},#{age},#{department});

测试程序:

        student st=new student();//此处给st赋值mapper.insertStudent(st);

返回添加数据的主键:


修改数据使用update标签即可,动态修改使用set标签和if标签

删除数据

  1. 单个删除

        delete from studentwhere name=#{name}
    
  2. 批量删除
    编写xml配置:

        delete from studentwhere name in(#{name});
    

    foreach表示遍历names数组中的每个数值,将所有遍历过的元素替换到sql语句中(替换name),并使用逗号隔开。

    接口:
    传入一个names数组。

    void deleteStudents(@Param("names") String[] names);
    

    测试类:

            String []names=new String[2];names[0]="张三";names[1]="张四";mapper.deleteStudents(names);
    

注解开发

注解开发是将sql语句写在接口的注解中,从而不需要配置xml配置文件。
注解开发不适用于复杂sql,因此还是配置xml文件比较常用。
常用的有四种注解,分别对应增删查改:

@select
@delete
@update
@insert

示例:

@Select("select * from student")
public Student selectAll();

总结:

MyBatis开发流程:
编写接口->编写sql语句->执行sql语句。

补充:MyBatis其他配置

注意:配置文件标签书写顺序需要遵守

configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器)dataSource(数据源)databaseIdProvider(数据库厂商标识)mappers(映射器)

类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:



当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:



每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。

相关内容

热门资讯

落户政策居然考虑放开! 怎么,我能落户北京了? 大家好,我是孙少睡,这是我的第467篇楼市评论。 很多人的第一反应肯定是有没...
股市必读:ST泉为股东因涉嫌违... 截至2025年12月26日收盘,ST泉为(300716)报收于9.96元,下跌0.8%,换手率0.9...
日本公布犯罪白皮书:2024年... 日本法务省19日公布的2025年版犯罪白皮书显示,日本2024年刑事犯罪案件数量明显上升,其中性犯罪...
中央广电总台副台长王晓真,黑龙... 据央视新闻报道,12月28日,中央广播电视总台《2026年春节联欢晚会》分会场发布。黑龙江哈尔滨、浙...
聚焦全国财政工作会议丨明年财政... (央视财经《经济信息联播》)明年是“十五五”规划的开局之年,财政政策将聚焦哪些关键领域精准发力? ...
原创 中... 12月26日,中国对美国实施了一次重磅反制,针对美国政府前不久批准的111亿美元对台军售,中方决定出...
徐杰11分王少杰遭驱逐 张宁缺... [搜狐体育战报]北京时间12月28日消息,2025-26赛季CBA常规赛继续第7轮角逐。王少杰第三节...
《今日说法》主持人李晓东买茶叶... 12月28日,《今日说法》栏目主持人李晓东发布视频称,此前“被骗1000元买茶叶”事件迎来新进展:该...
3-0领先终于能休息了!莫德里... 在意甲第17轮的一场焦点战中,AC米兰迎战维罗纳。比赛进行到第70分钟时,AC米兰在3-0领先的情况...