网站模板 wordpress,网站发布之后上传文件路径变了,wordpress已卸载插件数据,漯河网站建设网站建设文章目录 一. MyBatis XML配置文件1. 配置链接字符串和MyBatis2. 写持久层代码方法定义Interface方法实现xml测试 3. 增删改查增:删改查 二. 开发规范(mysql)三. 其他查询操作1. 多表查询2. #{} 和 ${}(面试题)使用区别 排序功能like查询 三. 数据库连接池 一. MyBatis XML配置… 文章目录 一. MyBatis XML配置文件1. 配置链接字符串和MyBatis2. 写持久层代码方法定义Interface方法实现xml测试 3. 增删改查增:删改查 二. 开发规范(mysql)三. 其他查询操作1. 多表查询2. #{} 和 ${}(面试题)使用区别 排序功能like查询 三. 数据库连接池 一. MyBatis XML配置文件
MyBatis开发有两种方式:
注解XML 使⽤Mybatis的注解⽅式主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能建议使⽤XML来配置映射语句也就是将SQL语句写在XML配置⽂件中.
1. 配置链接字符串和MyBatis
添加配置:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncodingutf8useSSLfalseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis:# 配置 mybatis xml 的⽂件路径在 resources/mapper 创建所有表的 xml ⽂件mapper-locations: classpath:mapper/**.xml在resources路径下, 创建mapper文件, 在mapper文件下创建**.xml文件, 以xml结尾的文件 和mapper-locations: classpath:后的路径对应即可
2. 写持久层代码 方法定义Interface 方法实现xml
MyBatis的固定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接口所对应的路径--
mapper namespacecom.bite.mybatis.mapper.UserInfoXmlMapper/mapper查询:
?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.bite.demo.mapper.UserInfoXMLMapperselect idqueryAllUser resultTypecom.bite.demo.model.UserInfoselect * from userinfo/select
/mappermapper 标签: 需要指定 namespace属性, 表示命名空间, 值为mapper接口的全限定名, 即包名.类名 select查询标签, 用来执行数据库的查询操作
id : 是和接口中定义的方法名resultType : 是返回的数据类型
测试 3. 增删改查
增: insert idinsertUserinsert into userinfo (username, password, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})/insert返回自增id: 接口定义不变, 设置useGeneratedKeys 和keyProperty属性 insert idinsertUser useGeneratedKeystrue keyPropertyidinsert into userinfo (username, password, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})/insert删 delete iddeleteUserdelete from userinfo where id #{id}/delete改 update idupdateUserupdate userinfo set username #{username} where id #{id}/update查
和注解一样, 映射也有三种解决办法: 1和3和注解一样 ** xml结果映射:** resultMap idBaseMap typecom.bite.demo.model.UserInfoid columnid propertyid/idresult columndelete_flag propertydeleteFlag/resultresult columncreate_time propertycreateTime/resultresult columnupdate_time propertyupdateTime/result/resultMap二. 开发规范(mysql)
阿里巴巴java开发手册的规范: 1. 2. 3.
三. 其他查询操作
1. 多表查询
准备工作 创建一个文章表 文章表的uid, 对应上述用户表的id
-- 创建⽂章表
DROP TABLE IF EXISTS articleinfo;
CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT 0正常, 1删除,create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now() ) DEFAULT charset utf8mb4;-- 插⼊测试数据INSERT INTO articleinfo ( title, content, uid ) VALUES ( Java, Java正文, 1 );sql: 查询id1的作者的相关信息
selectta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender
fromarticleinfo ta
left join userinfo tb onta.uid tb.id
whereta.id 1实体类:
Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;//用户相关信息private String username;private Integer age;private Integer gender;
}
接口定义:
Mapper
public interface ArticleInfoMapper {Select(SELECT ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender FROM articleinfo ta LEFT JOIN userinfo tb ON ta.uid tb.id WHERE ta.id #{id})ArticleInfo queryUserByUid(Integer id);}测试类:
SpringBootTest
class ArticleInfoMapperTest {Autowiredprivate ArticleInfoMapper articleInfoMapper;Testvoid queryUserByUid() {articleInfoMapper.queryUserByUid(1);}
}2. #{} 和 ${}(面试题)
使用
传递Integer类型的参数 #{ }: 结果: 我们输⼊的参数并没有在后⾯拼接id的值是使⽤ ? 进⾏占位. 这种SQL我们称之为**“预编译SQL”** ${ }: 结果: 这次的参数是直接拼接在SQL语句中, 叫做即时SQL 两种方法都不会报错传递String类型的参数 #{ } KaTeX parse error: Double superscript at position 213: …串作为参数时,需要添加引号 ̲, ⽤{} 不会拼接引号 ’ ‘, 导致程序报错 就需要我们手动添加’ ’
区别
1. #{} 和${} 的区别就是预编译SQL和即时SQL的区别 预编译SQL编译⼀次之后会将编译后的SQL语句缓存起来后⾯再次执⾏这条语句时不会再次编译 (只是输⼊的参数不同),省去了解析优化等过程,以此来提⾼效率 2. $ { }存在sql注入问题(重点) SQL注⼊是通过操作输⼊的数据来修改事先定义好的SQL语句以达到执⾏代码对服务器进⾏攻击的⽅法。 例如, 如果使用${}, 传递的参数为’ or 1’ 1, 返回的数据用List接收, 就会发生 输入一个用户名, 就拿到了全部用户的数据, 这是非常不安全的 可以看出: ⽤于查询的字段尽量使⽤ #{} 预查询的⽅式
排序功能
排序功能就是${} 的使用场景 mapper实现: 可以实现逆序返回的功能 如果使用#{}: 使用#{}, 将参数带入到sql中, 如果是字符串类型, 会自动加上’ , 此时sql语句就变成: select * from userinfo order by id ‘desc’, 语法错误
那么在完成排序功能时, 使用${ }, 也是存在sql注入的问题的, 所以一般需要排序的场景, 用户并不是自己输入的, 而是通过按钮等方式, 就行选择, 就避免了sql注入的问题 like查询 三. 数据库连接池 Hikari : SpringBoot默认使⽤的数据库连接池 从Spring打印的日志就可以看出来 Druid 如果我们想把默认的数据库连接池切换为Druid数据库连接池,只需要引⼊相关依赖即可 dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-3-starter/artifactIdversion1.2.21/version/dependency如果SpringBoot版本为2.X,使⽤druid-spring-boot-starter依赖 dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.17/version/dependency