mybatis快速入门

1.配置mybatis环境

mybatis简介和入门以及配置问题可以去官网

https://mybatis.net.cn/getting-started.html

1.1 创建Maven项目

这个是创建的maven项目和最终完成项目的目录结构    

1.2 导入pom.xml文件相关依赖

导入相关依赖

pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis_project</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version> 3.5.6</version></dependency><!-- mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!-- junit 依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!-- 添加slf4j日志api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.20</version></dependency><!-- 添加logback-classic依赖 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- 添加logback-core依赖 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency></dependencies></project>

1.3 创建mybatis-config.xml和logback.xml配置文件

mybatis-config.xml是mybatis核心配置文件,用于解决JDBC硬编码问题,也可以直接去mybatis官网ctrl c+v

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!-- 数据库连接信息--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis_2?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value=""/></dataSource></environment></environments><mappers><!-- 加载SQL 映射文件-->
<!--        <mapper resource="zh/mapper/UserMapper.xml"/>-->
<!--        <mapper resource="zh/mapper/BrandMapper.xml"/>--><!--包扫描方式--><package name="zh.mapper"/></mappers>
</configuration>
  • <mappers>标签用于加载SQL映射文件,映射文件是指每个Mapper独立的配置文件,如果有多个Mapper配置文件,可以用单独每个文件扫描方式,也可以用包扫描方式。
  • <dataSource>标签是用来存储数据库连接信息,可以看看以前的JDBC代码

日志文件:logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--CONSOLE :表示当前的日志信息是可以输出到控制台的。--><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern></encoder></appender><logger name="zh" level="DEBUG" additivity="false"><appender-ref ref="Console"/></logger><!--level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。--><root level="DEBUG"><appender-ref ref="Console"/></root>
</configuration>

1.4 创建数据库

目前只用到了一个Brand表

SQL语句:

create database mybatis_2;
use mybatis_2;
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(-- id 主键id           int primary key auto_increment,-- 品牌名称brand_name   varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered      int,-- 描述信息description  varchar(100),-- 状态:0:禁用  1:启用status       int
) DEFAULT charset =utf8;
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),('小米', '小米科技有限公司', 50, 'are you ok', 1);SELECT * FROM tb_brand;

成功创建数据库以及Brand表

1.5 在pojo包下创建实体类

Brand实体类:

package zh.pojo;public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态:0:禁用  1:启用private Integer status;public Brand() {}public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.ordered = ordered;this.description = description;this.status = status;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}

1.6 创建Mapper接口

package zh.Mapper;import zh.pojo.Brand;import java.util.List;
import java.util.Map;public interface BrandMapper {/*查询所有*/List<Brand> selectAll();
}

1.7 创建同名 Mapper.xml文件

官网有模板

在resources目录下BrandMapoper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="zh.Mapper.BrandMapper"><select id="selectAll" resultType="zh.pojo.Brand">select * from tb_Brand;</select>
</mapper>
  • namespace 是名称空间,应该改成接口的地址
  • id是标签的唯一标识,应该和接口的方法名一致
  • resultType会改成resultMap防止出现测试结果出现null

resultMap标签:

  <resultMap id="BrandResultMap" type="zh.pojo.Brand"><!--id:对主键字段映射column: 数据库的字段名property:实体类的属性名result: 对其他字段映射column: 数据库的字段名property:实体类的属性名--><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap>
  • 注意:Mapper接口和同名xml文件应该要放在同一目录下,但由于maven项目习惯把Java文件和配置文件分开。所以我们在resources目录下创建一个Mapper接口所在的包的同名目录,再在该目录下创建同名xml文件。
  • 创建好文件后编译maven 可以看到在target目录下者两个文件已经在一起了
  • 推荐在idea下载一个mybatisX插件,可以让接口和xml文件之间转换更加方便

  • 此时xml文件中的sql的表名会爆红,解决方式就是在idea添加数据源

可以看到表名已经正常,现在mybatis框架的所有环境已经配置好了

2.创建测试类

环境配置完毕后就可以创建测试类了。先写好测试类里的准备工作。

package zh.test;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.After;
import org.junit.Before;
import org.junit.Test;
import zh.Mapper.BrandMapper;
import zh.Mapper.BrandMapper;
import zh.pojo.Brand;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class mybatisTest {private SqlSession sqlSession;private BrandMapper brandMapper;private SqlSessionFactory sqlSessionFactory;@Beforepublic void init() throws IOException {//1.加载mybatis核心配置文件获取SqlSessionFactory,直接去官网找String resource = "mybatis-config.xml";//得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);//根据配置文件信息,创建会话工厂sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.获取sqlSession 用于执行sqlsqlSession = sqlSessionFactory.openSession(true); //自动提交事务//创建代理对象brandMapper = sqlSession.getMapper(BrandMapper.class);}@Afterpublic void destroy() {//提交事务//sqlSession.commit();//关闭sqlSession,释放资源sqlSession.close();}
}
  • 在测试类MybatisTest中,首先添加init()方法,并使用@Before 注解修饰。JUnit4 使Java5中的@Before注解,用于初始化,init0方法对于每一个测试方法都要执行一次。 在init()方法中,先根据MyBatis 配置文件构建SqlSessionFactory, 再通过SqlSessionFactory 创建SqlSession。
  • 接着添加destroy()方法,并使用@After注解修饰。用于释放资源。destroy()方法对于每个测试方法都要执行 一次。
  • 在测试类 MybatisTest中每一个用@Test注解修饰的方法称为测试方法,它们的调用顺序@Before→@Test→@After。

2.1 查询用户

  • 查询所有品牌信息

BrandMapper接口:

    List<Brand> selectAll();

BrandMapper.xml:

    <select id="selectAll" resultMap="BrandResultMap">select *from tb_brand;</select>

测试方法

@Testpublic void testSelectAll() {List<Brand> brands = brandMapper.selectAll();for (Brand b : brands) {System.out.println(b);}}

结果可以看见所有品牌信息都查询出来了

  • 通过Id查询信息

跟上面的一样在UserMapper.xml文件中写sql语句,接口中写方法,测试类中写测试代码

后面的案例都是先展示sql语句和接口中的方法,再展示测试代码

    <!--参数占位符1. #{}:会将其替换为?,为了防止SQL注入2. ${}: 拼sqL。会存在SQL注入问题--><select id="selectById" parameterType="int" resultMap="BrandResultMap">select *from tb_brandwhere id = #{id};</select>//接口中的方法Brand selectById(Integer id);

解释一下#{}和${}占位符的区别

    @Testpublic void testSelectById() {//接收参数int id = 1;//执行sqlBrand brand = brandMapper.selectById(id);System.out.println(brand);}

结果为:

  • 多参数条件查询
  • 多参数可以分成三种方式查询,分别为@Param注解,封装对象,封装Map集合
  • 正常写sql如果传入的参数少于sql中的参数会导致sql拼接错误,这里我们直接采用动态sql标签解决,这里用到了<where>和<if>标签
<!--动态SQL动态条件查询* if:条件判断* test: 逻辑表达式问题:*恒等式* <where> 替换where 关键字--><select id="selectByCondition" resultMap="BrandResultMap">select * from tb_brand<!--    where true --><where><if test="status!=null">status= #{status}</if><if test="brandName != null and brandName!=''">and brand_name like #{brandName}</if><if test="companyName!= null and companyName!=''">and company_name like #{companyName};</if></where></select>/*条件查询参数接收1.散装参数:如果方法中有多个参数,需要使用@Param("SQL参数占位符名称" 实体类属性)2.对象参数:对象的属性名称要和参数占位符名称一致3. map集合参数
* *///散装参数//List<Brand> selectByCondition(@Param("status") int status,@Param("brandName") String brandName,@Param("companyName") String companyName);//将参数封装成Brand对象//List<Brand> selectByCondition(Brand brand);//将参数封装成map集合List<Brand> selectByCondition(Map map);
    @Testpublic void testSelectByCondition() {//接收参数int status = 1;String brandName = "华为";String companyName = "华为";//处理参数   也可以在sql语句中用concat拼接brandName = "%" + brandName + "%";companyName = "%" + companyName + "%";//封装对象/*Brand brand = new Brand();brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setStatus(status);*///封装mapMap map = new HashMap();//key对应sql的参数名,value对应接受的参数//map.put("status",status);map.put("brandName", brandName);map.put("companyName", companyName);//执行sql//List<Brand> brands = brandMapper.selectByCondition(status, brandName, companyName);// List<Brand> brands = brandMapper.selectByCondition(brand);List<Brand> brands = brandMapper.selectByCondition(map);System.out.println(brands);}

结果:

为了更好的熟悉动态sql,再来一个选择单个条件查询,用到了<choose><when>标签

    <!-- 利用where标签和choose标签完成单个条件查询--><select id="selectBySingleCondition" resultMap="BrandResultMap">select * from tb_brand<where>  <!-- 不需要写otherwish --><choose> <!-- 相当于switch --><when test="status!=null">  <!-- 相当于case-->status= #{status}</when><when test="brandName != null and brandName!=''">brand_name like #{brandName}</when><when test="companyName!= null and companyName!=''">company_name like #{companyName};</when></choose></where></select>/*单条件动态sql*/List<Brand> selectBySingleCondition(Brand brand);
    @Testpublic void testSelectBySingleCondition() {//接收参数int status = 1;String brandName = "华为";String companyName = "华为";//处理参数brandName = "%" + brandName + "%";companyName = "%" + companyName + "%";//封装对象Brand brand = new Brand();//brand.setStatus(status);//brand.setBrandName(brandName);brand.setCompanyName(companyName);//执行sqlList<Brand> brands = brandMapper.selectBySingleCondition(brand);System.out.println(brands);}

结果:

2.2 添加用户

和上面一样进行添加品牌信息,这里有一个细节是因为id是自增,所以不需要传入id参数,我们用getId()方法实现主键返回

    <!-- 添加数据--><insert id="Add" useGeneratedKeys="true" keyProperty="id" >insert into tb_brand(brand_name, company_name, ordered, description, status)VALUES (#{brandName},#{companyName},#{ordered},#{description},#{status})</insert>void Add(Brand brand);
@Testpublic void testAddBrand() {String brandName = "农夫山泉矿泉水";String companyName = "农夫山泉";int ordered = 99;String description = "农夫山泉有点甜";int status = 1;//封装对象Brand brand = new Brand();brand.setBrandName(brandName);brand.setStatus(status);brand.setDescription(description);brand.setOrdered(ordered);brand.setCompanyName(companyName);//执行sqlbrandMapper.Add(brand);System.out.println(brand.getId());}

结果:

可以看到控制台输出了主键,Brand表也添加成功

2.3 修改用户

修改品牌信息时不一定所有信息都要修改,可能只需要修改一部分,可以用动态sql解决,用到了<set>和<if>标签

<!-- 动态sql完成数据更新 --><update id="update">update tb_brand<set><if test="brandName!=null and brandName!=''">brand_name = #{brandName},</if><if test="companyName!=null and companyName!=''">company_name = #{companyName},</if><if test="ordered!=null ">ordered = #{ordered},</if><if test="description!=null and description!=''">description = #{description},</if><if test="status!=null">status=#{status},</if></set>where id = #{id};</update>int update(Brand brand);//返回int类型时为了再控制台提示是否更新成功
    @Testpublic void testUpdate() {String brandName = "东方树叶";String companyName = "农夫山泉";int ordered = 200;String description = "农夫山泉有点甜";int status = 0;int id = 4;//封装对象Brand brand = new Brand();brand.setBrandName(brandName);brand.setStatus(status);//brand.setDescription(description);brand.setOrdered(ordered);//brand.setCompanyName(companyName);brand.setId(id);//执行sqlint cnt = brandMapper.update(brand);System.out.println(cnt);}

结果:

控制台没问题,数据库也没问题,修改成功。

2.4 删除用户

  • 删除单个品牌
    <!-- 删除单个--><delete id="deleteById">delete from tb_brand where id= #{id};</delete>int deleteById(int id); 返回int类型时为了再控制台提示是否删除成功
@Testpublic void testDeleteById() {int id = 5;//执行sqlint cnt = brandMapper.deleteById(id);if(cnt>0 ) System.out.println("删除成功");else System.out.println("删除失败");}

结果 :

控制台 和数据库都没问题,可以看到id为5的品牌已经被删除

  • 批量删除

有时我们会进行批量删除的业务,这时就要再次用到动态sql,用到<foreach>标签

<!-- 批量删除--><delete id="deleteByIds">delete from tb_brand where id in<foreach collection="list" item="id" separator="," open="(" close=")">#{id}</foreach></delete>void deleteByIds(List<Integer> ids);
@Testpublic void testDeleteByIds(){List<Integer> ids=new ArrayList<>();ids.add(6);ids.add(7);brandMapper.deleteByIds(ids);}

结果:

可以看到id为6,7的品牌一起被删除了,批量删除成功。

mybatis增删改差已经全部完成了。

Mybatis入门 基于XML实现增删改查(包含动态SQL标签的使用)相关推荐

  1. mybatis从零基础到增删改查数据库

    本文是mybatis框架一个初步的入门总结,最全的最好的资料应该参考这个:http://mybatis.github.io/mybatis-3/zh/index.html 本文在Eclipse下搭建一 ...

  2. MyBatis的Mapper 代理的增删改查操作(三)

    沉迷于黑与白世界中的人,无论怎么挣扎,都逃不过被同化的命运.前世看见了什么,那么今世便是什么. 上一章简单介绍了MyBatis的命名空间方式的增删改查操作(二),如果没有看过,请观看上一章. 一. M ...

  3. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

  4. Mybatis实现简单的数据库增删改查操作

    简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...

  5. android 入门 006(sqlite增删改查)

    android 入门 006(sqlite增删改查) package cn.rfvip.feb_14_2_sqlite;import android.content.Context; import a ...

  6. 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))...

    仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...

  7. ORM框架之Mybatis(一)基于mapper配置增删改查

    Mybatis是现在非常流行的SSM框架中的M部分,Mybatis也是一个主流的ORM框架,在项目中用来处理持久层数据. 一.Mybatis框架介绍及使用 1.1 mybatis框架概述: mybat ...

  8. MyBatis研习录(06)——基于注解的增删改查操作

    C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...

  9. (day2-spring和mybatis学习)-->重点增删改查

    在how2j上学SSM,整理一下笔记 Spring是一个基于IOC和AOP的结构J2EE系统的框架 (1).IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是 ...

  10. Mybatis 实现共通的增删改查

    基于之前写的一套SpringMvc+Mybatis+Maven开源框架,实现了通过配置model层注解的方式,在项目启动的时候自动创建更新表结构. 如果没看过的可以看下那篇文章的博客地址:Mybati ...

最新文章

  1. Android学习——R文件丢失异常原因汇总
  2. Q币才是腾讯真正的世界级产品
  3. 从产品的适用性以及费用方面考虑
  4. java opennlp_使用opennlp进行文档分类
  5. shell实例第18讲:利用gzexe加密shell脚本
  6. php页面代码简化,php代码如何简化
  7. python人工智能入门优达视频_机器学习:优达教你搭建Python 环境的正确姿势
  8. lisp如何将度分秒转换为弧度_重磅干货!如何利用Stata进行空间冷热点分析 | 社论前沿...
  9. -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  10. ExpressionFuncTObject, bool与FuncTObject, bool的区别
  11. 设计模式学习之--Singleton(单例)模式
  12. 线下广告投放方案_本地餐饮该怎样做好广告投放?传统广告投放的弊端和痛点...
  13. linux下载flink安装包
  14. Python学习笔记--字符串及其常见操作
  15. python文件(.py)转换为可执行文件(.exe)操作
  16. 数据库用户配额问题ORA-01536: space quota exceeded for tablespace 'TFR_DATA' #
  17. slack下载 csdn、_找出老板是否可以下载Slack DM
  18. 最小树形图 之 朱刘算法【模板】
  19. 第 3-7 课:延伸——Flutter Android Studio 开发环境的搭建
  20. 23计算机考研22408上岸武汉理工大学经验贴

热门文章

  1. Python面向对象编程-类和实例
  2. 山东大学校内网盘开发日志4-目前开发思路
  3. CTF竞赛进阶 (一) 密码学
  4. c语言数组转换树存储结构,c语言, 一棵具有n个结点的完全二叉树以数组存储,试写一个非递归 算法实现对 该树的前序遍历。...
  5. centos lvm管理2t以上硬盘
  6. [UOJ#405/LOJ#2863][IOI2018]组合动作(交互)
  7. 访问服务器本地端口/网址
  8. 什么是绝对URL、相对URL
  9. PHP:firebase/php-jwt生成jwt和验证
  10. 基于Python绘制一个摸鱼倒计时界面