网站集群系统 如何做域名解析,网站设计目标与背景,做网站官网,地方网站自助建站文章目录 什么是MybatisMybatis的作用是什么 Mybatis 怎么使用注解的方式注解的多种使用Options注解ResultType注解 XML的方式update标签 #{} 和 ${}符号的区别#{}占位${}占位 ${}占位的危险性(SQL注入)数据库连接池 什么是Mybatis
首先什么是Mybatis呢#xff1f;Mybatis是一… 文章目录 什么是MybatisMybatis的作用是什么 Mybatis 怎么使用注解的方式注解的多种使用Options注解ResultType注解 XML的方式update标签 #{} 和 ${}符号的区别#{}占位${}占位 ${}占位的危险性(SQL注入)数据库连接池 什么是Mybatis
首先什么是Mybatis呢Mybatis是一个持久层框架也就是用来操作数据库的一个框架我们在最原始的时候使用jdbc进行数据库的操作这使得我们会有大量的重复操作需要进行那么Mybatis把这些重复的操作进行了集合使得我们的代码更见的简单并且对于我们jdbc中需要连接数据库的这个操作也进行了优化使用配置文件的方式来使得我们的操作变得更加的简单。
Mybatis的作用是什么
那么看了上面之后我们也就知道了Mybatis框架的作用了也就是简单易用代码简单提供了很多强大且方便的功能帮助我们可以更好更快更方便的编写代码。操纵数据库。
Mybatis 怎么使用
那么有了上面的概念之后我们来讲述一下Mybatis该怎么使用首先我们要想使用Mybatis那么我们就要先将Mybatis配置到我们的Spring中也就是说要导入依赖导入什么依赖呢如下 dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter-test/artifactIdversion3.0.3/versionscopetest/scope/dependency当然这些还是不够因为我们只是把Mybatis引入了进来但是我们还是不能使用我们可以想一下我们在使用jdbc的时候除了把jar包引入进来之后我们还做了什么工作吗我们还有的工作就是使用jdbc给我们提供的接口来与我们的目标数据库建立了连接那么我们这里也是需要建立连接的那么连接如何建立呢
spring:application:name: Spring_Mybaitsdatasource:url: jdbc:mysql://127.0.0.1:3308/mybatis_test?characterEncodingutf8useSSLfalseusername: rootpassword: ”写上自己的密码“driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:# 配置 mybatis xml 的文件路径在 resources/mapper 创建所有表的 xml 文件mapper-locations: classpath:mybatis/**Mapper.xmlconfiguration: # 配置打印 MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #配置驼峰自动转换这就是我们配置文件的书写格式我们发现我们的配置文件内定义了我们mybatis的日志信息并且害配置了mybatis如果进行了xml中写的话那么我们也配置了该xml文件的路径信息。那么配置好后我们来看看如何来写代码吧
注解的方式
首先是注解的方式我们的Mybatis写sql代码实在接口类中写的因此我们要先定义一个接口代码并且这个接口代码我们需要使用Mapper注解来修饰代码如下
package com.example.spring_mybaits.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Update;
import java.util.List;
Mapper
public interface UserInfoMapper {
}这里我们定义了一个接口并且使用了Mapper注解进行了修饰那么接下来我们要来写代码了那么代码该怎么去写呢那么代码的书写我们先从最简单的查询所有数据开始吧如何查询所有的数据呢我们来写一下代码首先先在接口中写一个select方法的声明
package com.example.spring_mybaits.mapper;import org.apache.ibatis.annotations.*;import java.util.List;Mapper
public interface UserInfoMapper {ListUserInfo selectAllUser();
}第二步实现
package com.example.spring_mybaits.mapper;import org.apache.ibatis.annotations.*;import java.util.List;Mapper
public interface UserInfoMapper {Select( select * from userinfo)ListUserInfo selectAllUser();
}第三步进行测验 我们需要进行实现test方法那么如何快速的实现test方法呢我们要进行 首先点击Generate 弹出下面的这个页面 然后点击Test 然后在下面选择你要进行测验的方法然后光有这些也不够我们的测试代码也是需要进行进一步的书写的。
package com.example.spring_mybaits.mapper;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
SpringBootTest
class UserInfoMapperTest {AutowiredUserInfoMapper userInfoMapper;Testvoid selectAllUser() {ListUserInfolistuserInfoMapper.selectAllUser();for (UserInfo u:list) {System.out.println(u);}}
}我们通过查看上面的测试代码我们不难发现我们实现的接口在这里使用了Autowired注解进行了修饰那么这个注解我们之前讲过这相当于是把spring容器中存储的Bean给注入了进去那么既然如此我们就可以调用这个接口中的方法了。
注解的多种使用
Options注解
这个注解可以帮助我们获取到查询到的目标主键比如说我们使用insert插入了一行然后我们想知道插入的这一行所被分配到的自动递增的Id是多少我们可以通过Options注解进行实现。这个注解的使用方式如下首先这个注解我们需要传递进去两个参数代码如下我们来分别说一下他们的作用 Options(useGeneratedKeys true,keyProperty id)Integer InsertId(Integer id,Integer age,String username,String password);useGeneratedKeys :它可以是的Mybatis使用JDBC的getGeneratedKeys方法取出由数据库内部生成的主键 keyProperty 指定能够唯一识别的对象属性MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值默认值未设置unset 注意注意 设置 useGeneratedKeystrue 之后, ⽅法返回值依然是受影响的⾏数, ⾃增id 会设置在上 述 keyProperty 指定的属性中
ResultType注解
在我们注解方式去实现的时候我们需要注意到一些特殊的情况比如说我们想要设置其返回的形式通常适用于我们在写查询语句的时候进行的我们来看一下示例代码
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.ResultType;public interface UserMapper {Select(SELECT * FROM users)ResultType(User.class)ListUser getAllUsers();
}那么这里的映射其实就是将结果进行映射那么这时候会有疑问假如说我们要进行复杂查询的话我们要对多个结果进行映射的话该怎么做呢那么这时候需要用到新的注解叫做Results那么我们来举个例子
Results({Result(property id, column id),Result(property name, column name),Result(property email, column email)})它的名字和它的用法很像指的就是多个result的集合。那么它的一个样例代码如下
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;public interface UserMapper {Select(SELECT id, name, email FROM users)Results({Result(property id, column id),Result(property name, column name),Result(property email, column email)})ListUser getAllUsers();
}XML的方式
除了使用上述注解的方式之外我们还可以使用XML的方式那么XML的方式该怎么实现呢我们首先要先对前面的一个知识点做一个说明那就是我们在配置文件中的下面的这个属性我们可以根据意思去揣测出来这个意思是指路径 mapper-locations: classpath:mybatis/**Mapper.xml那么这个路径其实就是我们的xml文件所配置的路径那么接下来我们来写一下xml中的格式。首先是XML中的一些配置
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.spring_mybaits.mapper.UserInfoMapper
/mapper那么我们来讲解一下这个配置首先第一个mapper他是一个标签我们接下来写的所有标签都是在这个标签内部进行写的其次就是namespace这个英文的直译就是命名空间也就是我们这个xml文件是对那一个java文件所进行的连接那么接下里我们来用几个例子来写一下吧
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.spring_mybaits.mapper.UserInfoMapper update idupdateUserUPDATE userinfo set username#{username},id#{id1},age#{age} WHERE id#{id};/update
/mapperInteger updateUser(Integer id,String username,Integer id1,Integer age);然后我们用上面写的知识首先在方法的声明这里鼠标右键点击一下 在弹出的页面中选择Generate 然后选择test 然后在生成的test方法中实现我们的测试方法。 Testvoid updateUser() {UserInfo userInfonew UserInfo();userInfo.id11;userInfo.age21;userInfo.phone520134;userInfo.usernamezyficl;int d userInfoMapper.updateUser(2, userInfo.username,userInfo.id, userInfo.age );System.out.println(d);}通过上面我们来回答一下上面代码中可能出现的部分疑问
update标签
首先就是update标签通过这标签的内容我们可以指导这个标签中需要有一个参数那就是id这个id的值就是我们具体要实现的一个方法的名称然后我们以此作为类推我们可以知道其实我们的select标签也是同样的用法。 那么我们有了上面的了解后相信就可以写出比较简单的一些数据库sql语言的操作了那么这些操作包括但不限于增删查改但是接下来还有一些比较复杂的操作也是需要我们学习的比如说复杂查询排序等包括一些动态的添加动态的查找等那么我们来一起学习一下这些该怎么进行那么接下来我们来讲一下本节重点知识那就是#和$符号的区别。
#{} 和 ${}符号的区别
那么在讨论区别之前我们需要先讨论一下他们的作用那么他们的作用是什么呢他们的作用其实都是对sql语句加上参数也就是一个占位符但是他们在实现上又有区别我们下面可以来看一下分别使用这两个符号的话会有什么不同
#{}占位
这是一个安全的占位当我们使用这个占位的时候我们发现我们打印出的日志中对于占位的内容并没有补充也就是说此时的占位并不是直接补充的。我们输⼊的参数并没有在后⾯拼接id的值是使⽤ ? 进⾏占位. 这种SQL 我们称之为预编译SQL
${}占位
当我们把占位符更改一下更改为${}占位后我们再来看一下此时我们的代码会变成什么样子的呢 这时候我们发现我们的代码变成了占位符的直接拼接不像上面的那种使用占位符进行拼接那么这种方式我们叫做即时SQL。这也就是这两个的区别
${}占位的危险性(SQL注入)
$ 占位符用于直接替换字符串这种方式不进行参数转义因此存在SQL注入的风险。它通常用于传递表名、列名等SQL片段但绝不应该用于传递用户输入的数据。那么什么时sql注入呢比如说下面的这个语句
SELECT * FROM userinfo where id?;这里的问号是我们需要填写的内容那么既然如此假如说我们使用的时$占位符的话我们是不是也就是可以传进去这样一个内容呢
SELECT * FROM userinfo where id1;DELETE userinfo;因为那个表示并不是一个单一的字符因此我们完全可以将这个内容改成这个样子也正因此当我们执行的时候我们就会发现完了sql语句被注入了因此这样就会导致我们发生一个难以想象的一个损失。比如说被删库等操作。因此我们在实际开发中会尽量避开使用$符号。但是话又说回来了为什么我们要保留这个符号呢其实原因也很简单因为有些地方我们不可避免的要使用这个符号就比如说排序查询 使用 ${sort} 可以实现排序查询, ⽽使⽤ #{sort} 就不能实现排序查询了 除此之外还有别的吗当然还有也就是我们的模糊查询like查询
Select(select id, username, age, gender, phone, delete_flag, create_time,
update_time from userinfo where username like %#{key}% )
ListUserInfo queryAllUserByLike(String key);但是这里我们会陷入一个非常纠结的地方那就是如果我们使用$符号会有sql注入的风险可是不适用的话又不能达到我们的需求那这个该怎么办呢我们需要借助一个方法来进行实现这个方法就是concat方法这个方法的作用是什么呢这个方法的作用是进行字符串的拼接也就是说我们可以使用字符串拼接的方式来避免这个风险那么样例如下
Select(select id, username, age, gender, phone, delete_flag, create_time,
update_time from userinfo where username like concat(%,#{key},%))
ListUserInfo queryAllUserByLike(String key);数据库连接池
池化技术相信我们都已经了解过了池化技术相当于一个中间商一样我们对有无池化技术来用一张图来说明一下 这张图可以有效的说明有无池化技术的区别。 没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏SQL语句, SQL 语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐较消耗资源 使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection对象, 当客⼾ 请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏SQL, SQL语句执⾏完, 再把 Connection归还给连接池 那么我们的连接池有哪些呢如下 常⻅的数据库连接池 • C3P0 • DBCP • Druid • Hikari 我们来看一下我们的Mybaits的日志信息我们是可以发现的 在这里我们发现我们的Mybaits使用的一个数据库连接池是一个hikari那么这其实也是可以更改的。 如果我们想把默认的数据库连接池切换为Druid数据库连接池, 只需要引⼊相关依赖即可 文章转载自: http://www.morning.yxlpj.cn.gov.cn.yxlpj.cn http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.lbbyx.cn.gov.cn.lbbyx.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.ggmls.cn.gov.cn.ggmls.cn http://www.morning.nyzmm.cn.gov.cn.nyzmm.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.lbbrw.cn.gov.cn.lbbrw.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn http://www.morning.addai.cn.gov.cn.addai.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.jfjpn.cn.gov.cn.jfjpn.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.zydr.cn.gov.cn.zydr.cn http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.xpmwt.cn.gov.cn.xpmwt.cn http://www.morning.qsy39.cn.gov.cn.qsy39.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.lpbrp.cn.gov.cn.lpbrp.cn http://www.morning.qgmwt.cn.gov.cn.qgmwt.cn http://www.morning.qwmsq.cn.gov.cn.qwmsq.cn http://www.morning.lnyds.cn.gov.cn.lnyds.cn http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.rqbr.cn.gov.cn.rqbr.cn http://www.morning.mxptg.cn.gov.cn.mxptg.cn http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn http://www.morning.lmrcq.cn.gov.cn.lmrcq.cn http://www.morning.lfqnk.cn.gov.cn.lfqnk.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.pqcsx.cn.gov.cn.pqcsx.cn http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn http://www.morning.jjwt.cn.gov.cn.jjwt.cn http://www.morning.xpqyf.cn.gov.cn.xpqyf.cn http://www.morning.yqfdl.cn.gov.cn.yqfdl.cn http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.bpmdg.cn.gov.cn.bpmdg.cn http://www.morning.pqryw.cn.gov.cn.pqryw.cn http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn http://www.morning.pynzj.cn.gov.cn.pynzj.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.fxqjz.cn.gov.cn.fxqjz.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.srzhm.cn.gov.cn.srzhm.cn http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn http://www.morning.hxpff.cn.gov.cn.hxpff.cn http://www.morning.rqkck.cn.gov.cn.rqkck.cn http://www.morning.rkfxc.cn.gov.cn.rkfxc.cn http://www.morning.lyjwb.cn.gov.cn.lyjwb.cn http://www.morning.lwrks.cn.gov.cn.lwrks.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn http://www.morning.pwwjs.cn.gov.cn.pwwjs.cn http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn http://www.morning.wfbnp.cn.gov.cn.wfbnp.cn http://www.morning.qkqgj.cn.gov.cn.qkqgj.cn http://www.morning.zmwd.cn.gov.cn.zmwd.cn http://www.morning.jnrry.cn.gov.cn.jnrry.cn http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn http://www.morning.ysbrz.cn.gov.cn.ysbrz.cn http://www.morning.ytnn.cn.gov.cn.ytnn.cn http://www.morning.nlrp.cn.gov.cn.nlrp.cn http://www.morning.bfwk.cn.gov.cn.bfwk.cn http://www.morning.gqbks.cn.gov.cn.gqbks.cn http://www.morning.zxfr.cn.gov.cn.zxfr.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.ndcf.cn.gov.cn.ndcf.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.hkysq.cn.gov.cn.hkysq.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn http://www.morning.gjlst.cn.gov.cn.gjlst.cn http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn