【 配置连接字符串和MyBatis 】


注意,这行代码代表着xml必须在mapper文件夹的下面(路径必须保持一致)
配置完文件后,需要写持久层代码
添加 mapper 接⼝:

添加 UserInfoXMLMapper这样的xml文件:

单元测试:

以下是对以上标签的说明:
<mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为 mapper 接⼝的全限定名,包括全包名.类名。
<select> 查询标签:是⽤来执⾏数据库的查询操作的:
id :是和mapper接⼝中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法,id和 mapper 接⼝中定义的⽅法必须一样
resultType :是返回的数据类型,也就是开头我们定义的实体类
【xml实现的步骤】
1.引入依赖
2.完善配置(数据库配置,mapper xml配置)
3.定义接口
4.写xml实现
5.测试
【注意】

日志中右箭头代表我们输给mybatis的数据
左箭头代表mybatis返回给我们的数据
【增(Insert)】



此外,如果使用**@Param**注解来传参,则必须利用对象引用去绑定参数关系


【 删(Delete) 】



【 改(Update) 】



【 查(Select) 】
【方式1:取别名】

【方式2:映射】

【方式3:配置文件】

【#{} 和 ${}区别】【重点】
#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别
1. 更安全(防⽌SQL注⼊) 【重点】
$存在SQL注入的问题
SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的
由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些 SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击
2.SQL类型不同
#使用的是占位方式,属于预编译SQL
$使用的是直接替换方式,属于即时SQL
区别是,预编译SQL的性能要比即时SQL更高
3.排序只能使用$
⼀些场景, #{} 不能完成, ⽐如 排序功能, 表名, 字段名作为参数时, 这些情况需要使⽤${}
这是因为#{} 会根据参数类型判断是否拼接引号,如果参数类型为String, 就会加上 引号,如果不想加上引号,就要使用${}
//模糊查询虽然${}可以完成, 但因为存在SQL注⼊的问题,所以通常使⽤mysql内置函数concat来完成