东莞微信网站建设信息,网站建设公司江西,wordpress媒体库创建文件夹,宁波led网站建设文章目录 一、什么是MyBatis二、Mybatis入门案例三、配置SQL提示四、数据库连接池四、lombok五、mybatis基础操作5.1 根据id删除5.2 预编译SQL5.3 新增员工5.4 更新员工5.5 查询员工#xff08;用于页面回显#xff09;5.6 条件查询 七、XML映射文件八、动态SQL8.1 if语句8.2… 文章目录 一、什么是MyBatis二、Mybatis入门案例三、配置SQL提示四、数据库连接池四、lombok五、mybatis基础操作5.1 根据id删除5.2 预编译SQL5.3 新增员工5.4 更新员工5.5 查询员工用于页面回显5.6 条件查询 七、XML映射文件八、动态SQL8.1 if语句8.2 foreach语句8.3 sql/include语句 小结 一、什么是MyBatis
MyBatis是一款优秀的持久层框架用于简化JDBC的开发
二、Mybatis入门案例
使用MyBatis查询所有用户的数据
三、配置SQL提示 四、数据库连接池
数据库连接池是个容器负责分配管理数据库连接Connection 它允许应用程序重复使用一个现有的数据库连接而不是在重新建立一个 释放空间时间超过最大空闲时间的连接来避免因为没有释放连接而引起的数据库连接遗漏 如果没有连接池每次访问数据库时候需要开启一个新的连接用完需要关闭比较浪费资源有了数据库连接池程序在初始化的时候会在这个容器中创建一定量的连接对象后面客户端在访问数据库时候会在连接池中来获取连接用完之后再归还就可以做到连接的复用而不用每次都新建一个在关闭
数据库连接池的优势
资源重用提升系统响应速度避免数据库连接遗漏
标准接口DataSource
官方提供的数据库连接池接口由第三方组织实现此接口功能获取连接 Connection getConnection() throws SQLException Springboot默认Hikari追光者
Druid德鲁伊
Druid连接池是阿里巴巴开源的数据库连接池项目功能强大性能优秀是Java语言最好的数据库连接池之一
四、lombok
lombok是一个使用的Java类库能够通过注解的形式自动生成构造器getter/setterequalshashcodetostring等方法并可以自动化生成日志变量简化Java开发提高效率
注解作用Getter/Setter为所有的属性提供get/set方法ToString给雷自动生成toString方法。EqualsAndHashCode根据类所拥有的非静态字段自动重写equals方法和hashCode方法Data注解在类生成setter/getter、equals、canEqual、hashCode、toString方法如为final属性则不会为该属性生成setter方法。NoArgsConstructor生成无参的构造方法。AllArgsConstructor生成包含类中所有字段的构造方法。 需要在pom.xml中加入lombok依赖
五、mybatis基础操作
准备工作
准备数据表emp创建一个新的springboot工程引入起步依赖mybatismysql驱动lombok配置文件中引入数据库的连接信息创建Emp实体类采用驼峰命名法准备Mapper接口EmpMapper
5.1 根据id删除
在mapper接口中写入代码如下
Mapper
public interface EmpMapper {
// 根据id删除Delete(delete from mybatis.emp where id #{id})public void delect(Integer id);
}在测试类中调用如下
SpringBootTest //整合单元测试的类
class SpringbootMybatisApplicationTests {Autowiredprivate EmpMapper empMapper;Testpublic void test(){int delete empMapper.delect(17);System.out.println(delect)}
}返回值为1受影响的行数 5.2 预编译SQL 性能更高 更安全防止SQL注入
只需要编译一次后面直接把参数传进去就可以执行所以性能更高 5.3 新增员工
在mapper接口中写入代码如下
// 新增员工Insert(insert mybatis.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime}))public void insert(Emp emp);在测试类中测试如下 useGeneratedKeys是否要获取到返回来的数据 keyProperty返回来的数据往那个地方封装
5.4 更新员工
在mapper接口中写入代码如下
// 更新员工Update(update mybatis.emp set username #{username},name #{name},gender #{gender},image #{image} ,job #{job},entrydate #{entrydate},dept_id #{dept_id},create_time #{createTime},update_time #{updateTime})public void update(Emp emp);在测试类中测试如下 5.5 查询员工用于页面回显
在mapper接口中写入代码如下
// 根据id查询员工Select(select * from mybatis.emp where id #{})public Emp getById(Integer id);在测试类中测试如下 运行结果如下 但是运行结果中其中dept_idcreat_timeupdate_time 并没有结果
原因是因为没有进行数据封装 开启mybatis自动映射开关 在application配置文件中
5.6 条件查询
// 条件查询员工Select(select * from mybatis.emp where name like concat(%,#{name},%) and gender #{gender} and entrydate between #{begin} and #{end} order by update_time desc )public ListEmp list(String name , Short gender , LocalDate begin , LocalDate end);运行结果
七、XML映射文件
规范
XML映射文件的名称与Mapper接口名称保持一致并且将XML映射文件和Mapper接口放置在相同包下同包同名XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中sql语句的id与Mapper接口中的方法名一致并保持返回类型一致 以xml定义sql语句例如 先加上xml约束
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!-- nampespace 绑定Mapper接口的全名--
mapper namespacecom.itzhangxx.mapper.EmpMapper!-- 条件查询员工--select idlist resultTypecom.itzhangxx.Pojo.Empselect * from mybatis.emp where name like concat(%,#{name},%) and gender #{gender} andentrydate between #{begin} and #{end} order by update_time desc/select
/mapper八、动态SQL
8.1 if语句
随着用户的输入或外部条件的变化而变化的SQL语句称为动态SQL
mapper namespacecom.itzhangxx.mapper.EmpMapper!-- 条件查询员工--select idlist resultTypecom.itzhangxx.Pojo.Empselect *from mybatis.empwhereif testname ! nullname like concat(%, #{name}, %)/ifif testgender ! nulland gender #{gender}/ifif testbegin ! null and end ! nulland entrydate between #{begin} and #{end}/ifwhereorder by update_time desc/select
/mapper这样就可以动态的满足需求的再进行SQL的查找
优化上面更新员工代码 原SQL
Update(update mybatis.emp set username #{username},name #{name},gender #{gender},image #{image} ,job #{job},entrydate #{entrydate},dept_id #{dept_id},create_time #{createTime},update_time #{updateTime})public void update(Emp emp);改造后如下 update idupdate2update mybatis.empsetif testusername ! nullusername #{username},/ifif testname ! nullname #{name},/ifif testgender ! nullgender #{gender},/ifif testimage ! nullimage #{image},/ifif testjob ! nulljob #{job},/ifif testentrydate ! nullentrydate #{entrydate},/ifif testdeptId ! nulldept_id #{dept_id},/ifif testupdateTime ! nullupdate_time #{updateTime},/if /set/updateif用于判断条件是否成立使用test属性进行条件判断如果条件为true则拼接SQLwhere只用于在子元素有内容的情况下才插入where子句而且会自动取出子句的开头的AND 或 ORset动态的在行首插入set关键字会删除额外的逗号用于update中
8.2 foreach语句
如果想要删除多个员工数据的话就可以使用foreach语句进行遍历 例如 delete iddeleteByIddelete from mybatis.emp where id inforeach collectionids itemid open( separator, close)#{id}/foreach/delete测试如下传入11121314 Testpublic void testDeleteById(){ListInteger ids Arrays.asList(11,12,13,14);empMapper.deleteById(ids);return ;}然后实际执行的sql语句如下
delete from mybatis.emp where id in(11,12,13,14)属性含义collection要遍历的集合item遍历出来的元素separator分隔符open遍历开始前拼接的片段close遍历结束后的拼接的片段
8.3 sql/include语句
在查找中不建议使用select * 会降低代码效率但是输入全部字段的话也会有大量重复的所以 使用sql定义相同的SQL并且设定唯一标识使用include调用这个唯一标识即可 实现效果如下 sql idselectAllselect id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_timefrom mybatis.emp/sql!-- 条件查询员工--select idlist resultTypecom.itzhangxx.Pojo.Empinclude refidselectAll/includewhereif testname ! nullname like concat(%, #{name}, %)/ifif testgender ! nulland gender #{gender}/ifif testbegin ! null and end ! nulland entrydate between #{begin} and #{end}/if/whereorder by update_time desc/select重点规范
XML映射文件的名称与Mapper接口名称保持一致并且将XML映射文件和Mapper接口放置在相同包下同包同名XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中sql语句的id与Mapper接口中的方法名一致并保持返回类型一致
语句含义if用于判断条件是否成立使用test属性进行条件判断如果条件为true则拼接SQLwhere只用于在子元素有内容的情况下才插入where子句而且会自动取出子句的开头的AND 或 ORset动态的在行首插入set关键字会删除额外的逗号用于update中foreach按照规范进行遍历sql使用sql定义相同的SQL并且设定唯一标识include使用中按照唯一标识进行调用定义的SQL
小结
写本文主要是为了分享我的学习过程也是给自己记个笔记哪里忘记了回来再看一眼也可以很快的回想起来