Mybatis的搭建以及使用

news2024/12/23 15:02:17

一,如何搭建Mybatis

1,创建一张表和表对应的实体类

2.导入 MyBatis jar 包,mysql 数据库驱动包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
3. 创建 MyBatis 全局配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//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="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
4 定义对应的接口
public interface AdminDao{
Admin findAdminById(int id);
}
5 创建 sql 映射文件
<?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="接口的地址">
<select id="findAdminById" parameterType="int" resultType="com.ffyc.mybatis.model.Admin">
select * from admin where id = #{id} </select> </mapper>
6. 测试 MyBatis
读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
创建 SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
创建 SqlSession
SqlSession sqlSession = sessionFactory.openSession();
获得接口代理对象
sqlSession.getMapper(接口.class);
sqlSession .close();关闭

二,如何使用Mybatis框架

1,API 接口说明 

SqlSessionFactory 接口
使用 SqlSessionFactory 来创建 SqlSession,一旦创建 SqlSessionFactory 就
会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建
它,一个应用运行中也不建议多次创建 SqlSessionFactory。
SqlSession 接口
Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方
法,与数据库会话完成后关闭会话。

2,参数传递

单个参数直接传递

Admin selectAdmins(int id);

多个参数使用@Param(“id”)绑定

Admin selectAdmins(@Param(“account”)String account, @Param(“password”)String password);
如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如:
void insertAdmin(Admin admin);
<insert id="insertAdmin" parameterType="Admin">
insert into admin(id, account, password)
values (#{id}, #{account}, #{password})
</insert>

3,增删改查

增加

<insert id=" 唯一标识 " useGeneratedKeys=" 把新增加的主键赋值到自己定义的
keyProperty " keyProperty=“ 接收主键的属性 parameterType=" 参数类型 ">
insert into
                admin(account,password)values(#{account},#{password})
        </insert>
</mapper>
修改
<update id= " 唯一标识 " parameterType=“ 参数类型 ">
update
        admin set account= #{account},password= #{password} where
                id= #{id}
</update>
删除
<delete id= " 唯一标识 " parameterType= " 参数类型 " >
        delete from admin where id= #{id}
</delete>
查询
<select id=" 唯一标识 " resultType=" 返回结果集类型 ">
        select *
                from admin where id= #{id}
</select>

4,结果处理

简单类型输出映射
返回简单基本类型
<select id="findAdminInfoCount" resultType="int">
        select count(*) from admin
</select>

5,对象映射

       如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装
到POJO对象中.
       如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局
设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>

6,#{} ${}区别

#{}
是占位符,是采用预编译方式向sql中传值,可以防止sqL注入,

如果我们往sql中传值,使用#{}

${}
是将内容直接拼接到sql语句中,一般不用于向sql中传值,

一般用于向sql动态传递列名

区别:
底层实现不同
# { } 采用预编译方式 防止sql注入更加安全

${ } 采用字符串拼接,直按将值拼接到sql中

使用场景不国
# { } 一般用于向sql 中的列传值
$ { }一般用于向sql动态传递到列名 例如: 排序时 order by 后面的列名是可以改变

                                                        例如:select 后面的列名也可以自由选择

7,特殊处理定义 resultMap

定义 resutlMap
<resultMap id="adminResultMap" type="Admin">
    <id column="id" property="id"/>
    <result property="account" column="account" />
    <result property="password" column="password" />
</resultMap>
(1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为
“adminResultMap”
(2). resutlMap 的 type 属性是映射的 POJO 类型
(3). id 标签映射主键,result 标签映射非主键
(4). property 设置对象属性名称,column 映射查询结果的列名称
使用 resutlMap
<select id="findAdminInfoResultMap" resultMap="adminResultMap">
    SELECT id ,account,password FROM admin
</select>
(1). 本例的输出映射使用的是 resultMap,而非 resultType
(2). resultMap 引用了 adminResultMap

8,多表关联处理结果集

    <!--
        使用resultMap标签,对查询结果进行自定义映射
        type = "Admin" 最终返回结果的类型
    -->
    <resultMap id="adminMap" type="Admin">
        <id column="adminid" property="id"></id>
        <result column="account" property="account"></result>
    </resultMap>
     <select id="findAdmin" resultMap="adminMap">
        select id adminid , account from admin
    </select>


运行结果

9,嵌套查询

将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.
<association property="dept" javaType="Dept"
select="findDeptByID" column="dept_id">
</association>

(1). select:指定关联查询对象的 Mapper Statement ID 为 findDeptByID
(2). column="dept_id":关联查询时将 dept_id 列的值传入 findDeptByID,
并将 findDeptByID 查询的结果映射到 Emp 的 dept 属性中
(3).collection 和 association 都需要配置 select 和 column 属性,两者配置方法
相同

10,注解方式
常用注解标签
@Insert : 插入 sql , 和 xml insert sql 语法完全一样
@Select : 查询 sql, 和 xml select sql 语法完全一样
@Update : 更新 sql, 和 xml update sql 语法完全一样
@Delete : 删除 sql, 和 xml delete sql 语法完全一样
@Param
: 入参
@Results : 设置结果集合
@Result : 结果

使用Mybatis框架来进行数据库的查询操作

11,使用案例

查询所有信息
@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday")
})
List<Employee> getAll();

查询单个信息
@Select("select * from t_emp where emp_id=#{empId}")
@ResultMap(value="empMap")
Employee getById(@Param("empId") Integer empId);

插入信息
@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +
" )" values (#{empId}, #{empName}, #{empTel}, " +
" #{empEducation}, #{empBirthday}, #{fkDeptId}" +
" )")
int insert(Employee record);

删除信息
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);

12,Mybatis 动态 SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用
JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么
的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理
这种痛苦。
MyBatis 中用于实现动态 SQL 的元素主要有:
If
where
teim
set
choose(when,otherwise)
foreach
动态SQL实例:
    可以在SQL中添加逻辑判断
    if test 属性条件立 执行if标签体,不成立就不执行
    where标签 当where标签 if语句有条件成立时,就会动态添加where关键字
                还可以删除where后面紧跟着的关键字,例如 and,or

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICML 2024 顶级论文:机器学习有什么新进展?

在本周的文章中&#xff0c;我打算探讨在国际机器学习大会 ICML 上发表的论文&#xff0c;该大会目前于 2024 年 7 月 21 日至 27 日在奥地利首都维也纳举行。与其他顶级人工智能会议一样&#xff0c;每年都会有数千篇论文提交&#xff0c;但录取率相对较低&#xff08;过去三年…

JavaScript高阶 day-02

目录 一.构造函数 1.1 JS构造函数的实例成员和静态成员 1.1.1实例成员 1.1.2静态成员 1.2构造函数原型prototype 1.3对象原型 1.4 constructor构造函数 1.5原型链 1.6构造函数实例和原型对象三角关系 1.7原型链和成员的查找机制 1.7.1 Object.prototype.hasOwnPrope…

正高职称评审中专利与论文的权重比较

正高职称评审中&#xff0c;专利和论文的权重因地区、行业、单位以及具体评审政策的不同而有所差异。 一般来说&#xff0c;专利分不同类型&#xff0c;包括发明专利、实用新型专利和外观设计专利。发明专利申请授权过程中要进行实质审查&#xff0c;含金量最高&#xff0c;在…

通过ClearScript V8在.NET中执行复杂JavaScript逻辑

介绍 在现代网络开发中&#xff0c;爬虫技术已成为数据采集和分析的核心手段之一。通常&#xff0c;爬虫程序需要处理复杂的JavaScript逻辑&#xff0c;尤其是在面对动态加载的网页时。这时&#xff0c;传统的HTTP请求和HTML解析已经无法满足需求。为了应对这些挑战&#xff0…

高清无水印,2024年最佳免费录屏工具集合

如果你喜欢记录游戏的精彩瞬间&#xff0c;那班迪录屏你一定不陌生吧&#xff0c;它是一款主攻游戏录制的工具&#xff0c;这次我们一起来探索下除了它之外还有什么工具能实现我们电脑录屏操作呢。 1.福昕REC大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这个软件我推荐…

深度学习——分布式训练

目录 1. 前言2.分布式训练的分类3.不并行&#xff08;单机单卡&#xff09;4. 数据并行 DP和DDP4.1 异同点4.2 原理4.3 DP 实现&#xff08;单机多卡&#xff09;4.4 DDP 实现&#xff08;单机多卡&#xff0c;多机分布式&#xff09;4.4.1DDP 基本概念4.4.2 DDP之单机多卡4.4.…

知识付费小程序搭建

近期&#xff0c;我的一位教育培训机构的朋友巧妙运用了一款知识付费小程序&#xff0c;成功解锁了教育创新的新篇章。这个月&#xff0c;他的教学平台迎来了显著的增长&#xff0c;新增生源高达200人&#xff0c;这一成就令人瞩目。他巧妙地将线上教学的便捷性与线下互动的沉浸…

一个php快速项目搭建框架源码,带一键CURD等功能

介绍&#xff1a; 框架易于功能扩展&#xff0c;代码维护&#xff0c;方便二次开发&#xff0c;帮助开发者简单高效降低二次开发成本&#xff0c;满足专注业务深度开发的需求。 百度网盘下载 图片&#xff1a;

汉服文化平台网站

您好&#xff01;本篇论文将详细介绍汉服文化平台网站的设计与实现&#xff0c;该项目基于Java语言&#xff0c;采用SSM框架&#xff0c;结合MySQL数据库完成开发。如果您对汉服文化或本项目有任何兴趣或疑问&#xff0c;欢迎随时与我联系。 开发语言 Java 数据库 MySQL 技…

C#多项目统一版本号

问题 如果C#项目有个项目组合成&#xff0c;每次升级都需要修改csproj里面的版本号&#xff0c;处理起来比较麻烦 案例 common.targets 有如下两个项目&#xff0c;Main引用ClassLibrary1 namespace ClassLibrary1 {public class Class1{public void SayHello(){Console.W…

BSV区块链发布Golang软件开发工具包

​​发表时间&#xff1a;2024年8月8日 BSV区块链团队正式发布为Golang语言开发的软件开发工具包&#xff08;SDK&#xff09;。这个Golang SDK&#xff08;以下称Go SDK&#xff09;为开发可扩展的BSV区块链应用提供了一套升级且标准化的接口和工具。 请在GitHub上访问Go SDK…

1Panel应用推荐:MeterSphere开源持续测试工具

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

【protobuf入门学习(一)】 —— protobuf安装教程

目录 &#xff08;一&#xff09;protobuf 的基本介绍 1. 序列化概念 2. ProtoBuf 是什么 3. ProtoBuf 的使用特点 &#xff08;二&#xff09;protobuf 安装 2.1 protobuf ——Windows 1. 下载ProtoBuf编译器 2. 配置环境变量 3. 检查是否配置成功 2.2 protobuf —— L…

【数字时序】时钟树延迟偏差——CPPR adjustment

接上一篇文章Innovus的时序报告解读&#xff0c;新版的貌似多了一些信息&#xff0c;比如CPPR Adjustment和Derate。不太清楚这两个是什么概念&#xff0c;搜索之后转载2篇后端工程师的博客如下&#xff1a; 搜到个这个网站好像有很多后端相关的知识点分享一哈&#xff1a; Co…

Linux文件编程(进阶)

文章目录 Linux文件编程文件操作的基本元素&#xff08;文件在磁盘上的操作&#xff09;软链接和硬链接原理文件系统范围创建方式示例&#xff1a;在终端使用指令创建软硬链接软链接硬链接 删除源文件影响软链接和硬链接实现的具体原理link函数unlink函数代码示例&#xff1a;使…

【链栈的实现】--------本质为不带头结点的 头插法建立起来的单链表

1.链栈的基本属性与特征&#xff1a; 链栈是运算受限的单链表&#xff0c;只能在链表头部进行操作 2.链栈的相关基础操作汇总 初始化操作&#xff1a;操作结果:构造一个空栈 S。 InitStack(LinkStack *s)判定S是否为空栈&#xff1a; 初始条件:栈S 已存在 操作结果:若栈S为…

【Linux】全面解析进程:优先级、环境变量与地址空间

文章目录 1. 进程概念1.1 什么叫做进程&#xff1f;1.2 进程和程序的区别 2. linux下的进程2.1 task_struct 包含哪些内容2.2 访问&#xff08;查看&#xff09;进程信息2.3 通过系统调用获取进程标示符2.4 通过系统调用创建进程2.5 进程状态2.6 如何查看进程状态&#xff08;指…

鸿蒙开发5.0【基于CameraKit,通过avrecorder进行录像】

1 场景描述 录像是相机应用的最重要功能之一&#xff0c;录像是循环帧的捕获。本文通过CameraKit自定义相机并通过avrecorder进行录像。 2 效果图 3 自定义相机录像流程图 4 方案描述 4.1 整体描述&#xff1a; 总体可分为:1、相机输入&#xff0c;2、同时输出预览流录像流…

【Python机器学习】NLP分词——利用分词器构建词汇表(三)——度量词袋之间的重合度

如果能够度量两个向量词袋之间的重合度&#xff0c;就可以很好地估计他们所用词的相似程度&#xff0c;而这也是它们语义上重合度的一个很好的估计。因此&#xff0c;下面用点积来估计一些新句子和原始的Jefferson句子之间的词袋向量重合度&#xff1a; import pandas as pdse…

win10配置安装apache服务

Welcome! - The Apache HTTP Server Project