0022-蚂蚁课堂每特学院2期mysql读写分离mybatis基础知识_第1页
0022-蚂蚁课堂每特学院2期mysql读写分离mybatis基础知识_第2页
0022-蚂蚁课堂每特学院2期mysql读写分离mybatis基础知识_第3页
0022-蚂蚁课堂每特学院2期mysql读写分离mybatis基础知识_第4页
0022-蚂蚁课堂每特学院2期mysql读写分离mybatis基础知识_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Mybatis一、课程目标Mybatis 介绍Mybatis 增删改查SQL 注入问题介绍Mybatis xml 与注解实现Mybatis 分页二、Mybatis 快速入门2.1 Mybatis 介绍MyBatis 是支持普通 SQL 查询,过程和高级的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数工设置以及对结果集的检索封装。MyBatis 可以使用简单的 XML 或注解用于配置和原始,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)成数库中的.JDBC- MyBatis-Hibernate2.2 Mybatis

2、 环境搭建2.2.1 添加 Maven 坐标.mybatismybatis3.4.4-connector-java5.1.212.2.2 建表2.2.3 添加 mybatis 配置文件2.2.4 定义表的实体类package com.entity; public claser privateid; private String name; privateage;/get,set方法CREATE TABLE users(idPRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age); INSERTO users(NAME, age) VALUES(Tom

3、, 12);INSERTO users(NAME, age) VALUES(Jack, 11);2.2.5 定义 userMapper 接口2.2.6 定义操作 users 表的 sql文件 userMapper.xml2.2.7mybatis.xml 文件中加载配置文件2.2.8mybatis.xml 测试方法import java.io.File; import java.io.IOException; import java.io.Reader;import.apache.ibatis.io.Resour; import.apache.ibatis.ses.SqlSes;import.a

4、pache.ibatis.ses.SqlSesFactory;import.apache.ibatis.ses.SqlSesFactoryBuilder; import com.itmayiedu.entity.User;public class TestMybatis public sic void main(String args) throws IOException String resource = mybatis.xml; SELECT *FROM users where id =#idpackage com.itmayiedu.mapper; import com.itmayie

5、du.entity.User; publicerface UserMapper public User getUser(id);2.2.3 增加案例Xml:代码:sic public void add() throws IOException String resource = mybatis.xml;/配置文件Reader reader = Resour.getResourceAsReader(resource);/ 获取会话工厂SqlSesFactory sqlSesFactory = new SqlSesFactoryBuilder().build(reader); SqlSesopen

6、Ses= sqlSesFactory.openSes();/ 查询String sql = com.itmayiedu.mapper.UserMapper.addUser;/ 调用api查询User usa = new User(); usa.setAge(19);usa.setName();reuslt = openSes.insert(sql, usa); System.out.prln(reuslt);INSERTO users(NAME, age) VALUES(#name, #age);/配置文件Reader reader = Resour.getResourceAsReader(r

7、esource);/ 获取会话工厂SqlSesFactory sqlSesFactory = new SqlSesFactoryBuilder().build(reader);SqlSesopenSes= sqlSesFactory.openSes();/ 查询String sql = com.itmayiedu.mapper.UserMapper.getUser;/ 调用api查询User user = openSes.selectOne(sql, 1); System.out.prln(user.toString();2.2.4 删除Xml:代码:三、sql 注入案例3.1 创建表+测试数

8、据3.2 jdbc 进行加载String username = yushengjun-1;String password = 12345;create table user_table(idPrimary key, usernamevarchar(30), passwordvarchar(30);inserto user_table values(1,yushengjun-1,12345); inserto user_table values(2,yushengjun-2,12345);sic public void delUser() throws IOException String re

9、source = mybatis.xml;/配置文件Reader reader = Resour.getResourceAsReader(resource);/ 获取会话工厂SqlSesFactory sqlSesFactory = new SqlSesFactoryBuilder().build(reader); SqlSesopenSes= sqlSesFactory.openSes();/ 查询String sql = com.itmayiedu.mapper.UserMapper.delUser; reuslt = openSes.delete(sql,1);System.out.pr

10、ln(reuslt); delete from users where id=#id3.3 将 username 的值设置为username= OR 1=1 - 或者 username or 1=13.4sql 注入解决办法第一步:编译sql第二步:执行sql优点:能预编译sql 语句String username = username= OR 1=1 - ; String password = 12345;/ String sql = SELECT id,username FROM user_table WHERE +/ username= + username + AND + passwo

11、rd=/ + password + ;String sql = SELECT id,username FROM user_table WHERE username=? AND password=?; Class.forName(com.jdbc.Driver);Connection con = DriverManager.getConnection(jdbc:/localhost:3306/test, root, root); PreparedSement s= con.prepareSement(sql);s.setString(1, username); s.setString(2, pa

12、ssword);System.out.prln(s.toString(); ResultSet rs = s.executeQuery(); while (rs.next() String id = rs.getString(1);因为-表示 SQL 注释,因此后面语句忽略;因为 1=1 恒成立,因此 username= OR 1=1 恒成立,因此 SQL 语句等同于:String sql = SELECT id,username FROM user_table WHERE + username= + username + AND + password=+ password + ; Class

13、.forName(com.jdbc.Driver);Connection con = DriverManager.getConnection(jdbc:/localhost:3306/test, root, root); PreparedSement s= con.prepareSement(sql);System.out.prln(s.toString(); ResultSet rs = s.executeQuery(); while (rs.next() String id = rs.getString(1); String name = rs.getString(2);System.ou

14、t.prln(id: + id + -name: + name);3.4 mybatis 中#与$区别动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前mybatis 会对其进行动态。mybatis 为提供了两种支持动态 sql 的语法:# 以及 $。在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别:select * from user where name = #name; select * from user where name = $name;其之后的结果均为select * from

15、user where name = zhangsan;但是 # 和 $ 在预编译中的处理是不一样的。# 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:select * from user where name = ?;而 $ 则只是简单的字符串替换,在动态阶段,该 sql 语句会被成select * from user where name = zhangsan;以上,# 的参数替换是发生在 DBMS 中,而 $ 则发生在动态过程中。那么,在使用过程中应该使用哪种方式呢?是,优先使用 #。因为 $ 会导致 sql 注入的问题。看下面的例子:select * from

16、 $tableName where name = #name在这个例子中,如果表名为user; delete user; -则动态之后 sql 如下:select * from user; delete user; - where name = ?;-之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对数据库造成损伤,极大可能导致服务器宕机。但是表名用参数传递进来的时候,只能使用 $ ,具体原因可以自己做个猜测,去验证。这也提醒在这种用法中要sql 注入的问题。String name = rs.getString(2);System.out.prln(id:

17、+ id + -name: + name);3.4.1 创建 UserTable3.4.2 创建 UserTable3.4.3userTableMapper.xml3.4.4 测试 SQL 注入public class TestLogybatis3 public sic void main(String args) throws IOException, SQLException, ClaotFoundException String resource = mybatis.xml;/配置文件SELECT id ,username as userName FROM user_table WHER

18、E username=$userName AND password=$passWordpackage com.itmayiedu.mapper;import com.itmayiedu.entity.UserTable; publicerface UserTableMapper public UserTable login(UserTable userTable);package com.itmayiedu.entity;public claserTable privateid;private String userName;private String passWord;3.4.5 总结优先

19、使用 #。因为 $ 会导致 sql 注入的问题四、Mybatis 注解使用Mybatis 提供了增删改查注解、select delete update4.1 建立注解 Mapper4.2 加入 mybatis.xmlimport.apache.ibatis.annoions.Param; import.apache.ibatis.annoionect; import com.itmayiedu.entity.User;publicerface UserTestMapper Select(select * from users where id = $id;) public User getUser(Param(id) String id);Reader reader = Resour.getResourceAsReader(resource);/ 获取会话工厂SqlSesFactory sqlSesFactory = new SqlSesFactoryBuilder().build(reader); SqlSesopenSes= sqlSesFactory.openSes();/ 查询String sql = com.itmayiedu.mapper.UserTableMapper.login;/ 调用api查询UserTable

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论