当前位置: 首页 > news >正文

MyBatis XML开发

目录👑

配置

写持久层代码

mapper接口

数据持久层的实现,.xml的形式。

select

字段映射

MyBatis配置驼峰命名⭐

起别名

结果映射

含参数查询

insert

delete

update


配置

需要配置MySQL驱动类、登录名、密码、数据库连接字符串。

这里是在application.yml中配置

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: **** # 如果密码password是纯数字的,需要加上" "否则会报错。driver-class-name: com.mysql.cj.jdbc.Drivermybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置打印 MyBatis⽇志map-underscore-to-camel-case: true #配置驼峰⾃动转换mapper-locations: classpath:mapper/*.xml 

 mapper-locations: classpath:mapper/*.xml 
  这个是设置创建mybatis XML文件的路径, 在resources下的mapper的所有.xml文件

写持久层代码

mapper接口

import com.bit.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
@Mapper
public interface UserInfoXmlMapper {List<UserInfo> selectAll();//alt+enter
}

数据持久层的实现,.xml的形式。

这是MyBatis 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.bit.mybatis.mapper.UserInfoXmlMapper"> <!-- 路径+类名,表示要实现的是谁--></mapper>

namespace的内容要和实现的mapper所在路径+接口名。

不一样可能就会出现绑定异常

MyBatisX插件可以将对应的xml和mapper接口关联起来,

点击小鸟就能互相跳转。

select

查询所有用户的具体实现

<?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.bit.mybatis.mapper.UserInfoXmlMapper"> <!-- 路径+类名,表示要实现的是谁--><select id="selectAll" resultType="com.bit.mybatis.model.UserInfo">select * from user_info
-- select id, username, password, age, gender, phone, delete_flag as deleteFlag ,create_time as createTime, update_time as updateTime from user_info;</select>
</mapper>

这里用到的数据库表和实体类都和上篇文章中用到的一样。

我们下载了MyBatisX插件后,在mapper接口的方法上按alt+enter,就会在对应xml的<mapper></mapper>标签之中生成

<select id="selectAll" resultType="com.bit.mybatis.model.UserInfo"></select>

select表示用来执行数据库查询操作,id对应接口中具体的方法,resultType对应返回的数据类型 也就是实体类的路径。

我们可以直接在select标签中写sql语句。

字段映射

MyBatis配置驼峰命名⭐
mybatis:configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置打印 MyBatis⽇志map-underscore-to-camel-case: true #配置驼峰⾃动转换

这和MyBatis注解开发中一样,配置了之后,mybatis会自动将数据库表中含下划线的字段名转换成小驼峰的形式,这样就能映射成功。

这是最推荐的方式。

起别名

在写sql语句时给含下划线的字段取一个别名

  <select id="selectAll" resultType="com.bit.mybatis.model.UserInfo">
--         select * from user_infoselect id, username, password, age, gender, phone,delete_flag as deleteFlag ,
create_time as createTime, 
update_time as updateTime 
from user_info;</select>

结果映射

<?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.bit.mybatis.mapper.UserInfoXmlMapper"> <!-- 路径+类名,表示要实现的是谁--><resultMap id="BaseMap" type="com.bit.mybatis.model.UserInfo">--><result column="delete_flag" property="deleteFlag"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result></resultMap><select id="selectAll" resultMap="BaseMap">select * from user_info</select> </mapper>

<resultMap>里column表示表中的字段,property中表示字段对应的名字。

select标签中resultMap的内容和要对应的resultMap中的id一样。

resultMap中的type对应返回的数据类型,也就是实体类的路径。

含参数查询

import com.bit.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
@Mapper
public interface UserInfoXmlMapper {UserInfo selectById(Integer id);
}
  <select id="selectById" resultType="com.bit.mybatis.model.UserInfo">select * from user_info where id = #{id};</select>
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
class UserInfoXmlMapperTest {@Autowiredprivate UserInfoXmlMapper userInfoXmlMapper;@Testvoid selectById() {System.out.println(userInfoXmlMapper.selectById(1));}
}

insert

import com.bit.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
@Mapper
public interface UserInfoXmlMapper {Integer insertUser(UserInfo userInfo);
}

如果insertUser的参数用@param重命名,比如insertUser(@Param("user")UserInfo userInfo),

sql语句中values后面就是(#{user.username},#{user.password},#{user.age})

<insert id="insertUser">insert into user_info(username, password,age) values (#{username},#{password},#{age})</insert>

测试

package com.bit.mybatis.mapper;import com.bit.mybatis.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
class UserInfoXmlMapperTest {@Autowiredprivate UserInfoXmlMapper userInfoXmlMapper;@Testvoid insertUser() {UserInfo userInfo = new UserInfo();userInfo.setAge(99);userInfo.setUsername("kdfj");userInfo.setPassword("809889");Integer result =  userInfoXmlMapper.insertUser(userInfo);System.out.println("受影响的条数:" + result);}
}

insert在xml中和用注释一样还是能获取到递增主键的值。

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into user_info(username, password,age) values (#{username},#{password},#{age})
</insert>

在insert中添加useGeneratedKeys="true" keyProperty="id",

@Test
void insertUser() {UserInfo userInfo = new UserInfo();userInfo.setAge(35);userInfo.setUsername("喜羊羊");userInfo.setPassword("eefd9");Integer result =  userInfoXmlMapper.insertUser(userInfo);System.out.println("受影响的条数:" + result + ",id:" + userInfo.getId());
}

尽管userInfo没有通过set方法来设置id,还是可以获取到id的值。

delete

import com.bit.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;
@Mapper
public interface UserInfoXmlMapper {Integer deleteById(Integer id);
}
<?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.bit.mybatis.mapper.UserInfoXmlMapper"><!-- 路径+类名,表示要实现的是谁--><delete id="deleteById">delete from user_info where id = #{id}</delete>
</mapper>

测试

package com.bit.mybatis.mapper;import com.bit.mybatis.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
class UserInfoXmlMapperTest {@Autowiredprivate UserInfoXmlMapper userInfoXmlMapper;@Testvoid deleteById() {Integer result =  userInfoXmlMapper.deleteById(2);System.out.println("受影响的条数:" + result);}
}

update

import com.bit.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;
@Mapper
public interface UserInfoXmlMapper {Integer updateById(String username,Integer id);
}
<update id="updateById">update user_info set username=#{username} where id = #{id}</update>
    @Testvoid updateById() {Integer result =  userInfoXmlMapper.updateById("小美",8);System.out.println("受影响的条数:" + result);


文章转载自:

http://hJ1Cv9Bs.kphsp.cn
http://YAvxRfJ1.kphsp.cn
http://P1GXa6Ws.kphsp.cn
http://ME11SZUY.kphsp.cn
http://rvp6LQu8.kphsp.cn
http://9KGrhDwl.kphsp.cn
http://m9d4Fx91.kphsp.cn
http://aAjbgX32.kphsp.cn
http://hKXdDYRP.kphsp.cn
http://wBlv5Ish.kphsp.cn
http://NFbQza8K.kphsp.cn
http://wUKBm2XZ.kphsp.cn
http://uW9UiKHV.kphsp.cn
http://qWfvwxCV.kphsp.cn
http://sfdefZdm.kphsp.cn
http://Q0U8BNRR.kphsp.cn
http://rQ4rA665.kphsp.cn
http://ndQi7FVK.kphsp.cn
http://Kx7UIkfw.kphsp.cn
http://CCkBaMkv.kphsp.cn
http://MISe63DO.kphsp.cn
http://p7F9JZfY.kphsp.cn
http://mtjaDvDf.kphsp.cn
http://rNSlZWMi.kphsp.cn
http://79nX9kZO.kphsp.cn
http://h8pV25ms.kphsp.cn
http://feU9bezJ.kphsp.cn
http://Zqdzf7vj.kphsp.cn
http://T2OfVYpI.kphsp.cn
http://Fe9DuIF6.kphsp.cn
http://www.dtcms.com/a/386042.html

相关文章:

  • 《拆解URP管线角色材质失效:从现象到底层的深度排障与优化》
  • 《URP管线中后处理效果的创新应用与优化实践》
  • Tomcat Servlet 执行流程源码解析
  • jenkins审批机器人功能概述-Telegram版
  • 苍穹外卖 —— 环境搭建
  • Jenkins运维之路(Jenkins流水线改造Day02-3-容器项目)
  • 【代码讲解】SO-ARM100 双场景演示:手柄驱动 Mujoco 仿真 + 实机控制
  • 进阶OpenCV --视频物体跟踪
  • ASP.NET 实战:用 DataReader 秒级读取用户数据并导出 CSV
  • 如何使用 Python 程序把 PDF 文件转换成长图 PNG 格式输出图片?
  • 从Dubbo到SpringCloud Alibaba:大型项目迁移的实战手册(含成本分析与踩坑全记录)(二)
  • vue3 + ts + uniappX 封装上传文件(image pdf)、预览文件功能
  • PDF/图像/音视频一体化处理方案
  • 【数据结构】 深入理解 LinkedList 与链表
  • Hadoop HDFS-高可用集群部署
  • 深入汇编底层与操作系统系统调用接口:彻底掰开揉碎c语言简单的一行代码-打印helloworld是如何从C语言点击运行到显示在屏幕上的
  • ARM3.(汇编函数和c语言相互调用及ARM裸机开发环境搭建)
  • LeetCode 380 - O(1) 时间插入、删除和获取随机元素
  • 9 基于机器学习进行遥感影像参数反演-以随机森林为例
  • DB Hitek宣布推出650V GaN HEMT工艺
  • 机器学习简单数据分析案例
  • [特殊字符] 欢迎使用 C++ Arrow 函数 - 革命性的新特性!
  • 外网访问分布式跟踪系统 zipkin
  • Base 发币在即:L2 代币能否撬动生态增长?
  • DRDR生态Token正式上线BitMart,开启全球化新篇章
  • Spring Boot 3 + EasyExcel 文件导入导出实现
  • 9.16总结
  • Android开机时间查看
  • 探针水平的表达矩阵转换为基因水平的表达矩阵是芯片数据分析中关键的一步
  • PHP基础-语法初步(第七天)