首页 > 其他分享 >13.Mybatis

13.Mybatis

时间:2023-04-19 10:36:40浏览次数:43  
标签:username 13 String user sql Mybatis id name

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-** → **Hibernate**

2.2 Mybatis 环境搭建

2.2.1 添加 Maven 坐标

 <dependencies>
 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
 <dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
 <version>3.4.4</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.21</version>
 </dependency>
 </dependencies>

2.2.2 建表

    CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
    INSERT INTO users(NAME, age) VALUES('Tom', 12);
    INSERT INTO users(NAME, age) VALUES('Jack', 11);

2.2.3 添加 mybatis 配置文件

 <?xml version= "1.0" encoding= "UTF-8" ?>
 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis- 3 - config.dtd">
 <configuration>
 <environments default= "development" >
 <environment id= "development" >
 <transactionManager type= "JDBC" />
 <dataSource type= "POOLED" >
 <property name= "driver" value= "com.mysql.jdbc.Driver" />
 <property name= "url" value= "jdbc:mysql://localhost:3306/test" />
 <property name= "username" value= "root" />
 <property name= "password" value= "root" />
 </dataSource>
 </environment>
 </environments>
 </configuration>

2.2.4 定义表的实体类

 package com.entity;

 public class User {

 private int id;

 private String name;

 private int age;

 //get,set方法

 }

2.2.5 定义 userMapper 接口

 package com.itmayiedu.mapper;

 import com.itmayiedu.entity.User;

 public interface UserMapper {

 public User getUser(int id);

 }

2.2.6 定义操作 users 表的 sql 映射文件 userMapper.xml

    <?xml version= "1.0" encoding= "UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis- 3 - mapper.dtd">
    <mapper namespace= "com.itmayiedu.mapper.UserMapper" >
    <select id= "getUser" parameterType= "int"
    resultType= "com.itmayiedu.entity.User" >
    SELECT * FROM users where id =#{id}
    </select>
    </mapper>

2.2.7mybatis.xml 文件中加载配置文件

 <mappers>
 <mapper resource= "mapper/userMapper.xml" />
  </mappers>

2.2.8mybatis.xml 测试方法

 import java.io.File;

 import java.io.IOException;

 import java.io.Reader;

 import org.apache.ibatis.io.Resources;

 import org.apache.ibatis.session.SqlSession;

 import org.apache.ibatis.session.SqlSessionFactory;

 import org.apache.ibatis.session.SqlSessionFactoryBuilder;

 import com.itmayiedu.entity.User;

 public class TestMybatis {

     public static void main(String[] args) throws IOException {

         String resource = "mybatis.xml";


         // 读取配置文件

         Reader reader = Resources.getResourceAsReader(resource);

         // 获取会话工厂

         SqlSessionFactory sqlSessionFactory = new

         SqlSessionFactoryBuilder().build(reader);

         SqlSession openSession = sqlSessionFactory.openSession();

         // 查询

         String sql = "com.itmayiedu.mapper.UserMapper.getUser";

         // 调用api查询

         User user = openSession.selectOne(sql, 1);

         System.out.println(user.toString());

     }

 }

2.2.3 增加案例

  Xml:

 <insert id= "addUser" parameterType= "com.itmayiedu.entity.User" >

 INSERT INTO users(NAME, age) VALUES(#{name}, #{age});

    </insert>

    代码:

 static public void add() throws IOException{

 String resource = "mybatis.xml";

 // 读取配置文件

 Reader reader = Resources. getResourceAsReader (resource);

 // 获取会话工厂

 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

 SqlSession openSession = sqlSessionFactory.openSession();

 // 查询

 String sql = "com.itmayiedu.mapper.UserMapper.addUser";

 // 调用api查询

 User userPa = new User();

 userPa.setAge(19);

 userPa.setName("张三");

 int reuslt = openSession.insert(sql, userPa);

 System. out .println(reuslt);

  }

2.2.4 删除

  Xml:

 <delete id= "delUser" parameterType= "int" >

 delete from users where id=#{id}

  </delete>

  代码:

 static public void delUser() throws IOException{

 String resource = "mybatis.xml";

 // 读取配置文件

 Reader reader = Resources. getResourceAsReader (resource);

 // 获取会话工厂

 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

 SqlSession openSession = sqlSessionFactory.openSession();

 // 查询

 String sql = "com.itmayiedu.mapper.UserMapper.delUser";

 int reuslt = openSession.delete(sql,1);

 System. out .println(reuslt);

  }

三、 sql 注入案例

3.1 创建表 + 测试数据

   create table user_table(

   id int Primary key,

   username varchar(30),

   password varchar(30)

   );

   insert into user_table values(1,'yushengjun-1','12345');

   insert into user_table values(2,'yushengjun-2','12345');

3.2 jdbc 进行加载

String username = "yushengjun-1";
String password = "12345";


String sql = "SELECT id,username FROM user_table WHERE " + "username='" + username + "'AND " + "password='"
+ password + "'";
Class. **_forName_** ("com.mysql.jdbc.Driver");
Connection con = DriverManager. **_getConnection_** ("jdbc:mysql://localhost:3306/test", "root", "root");
PreparedStatement stat = con.prepareStatement(sql);
System.out.println(stat.toString());
ResultSet rs = stat.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
System.out.println("id:" + id + "---name:" + name);

 }

3.3 将 username 的值设置为

    username=' OR 1=1 --

    因为--表示SQL注释,因此后面语句忽略;

    因为1=1恒成立,因此 username='' OR 1=1 恒成立,因此SQL语句等同于:

3.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 " + "password='"
// + password + "'";
String sql = "SELECT id,username FROM user_table WHERE username=? AND password=?";
Class. **_forName_** ("com.mysql.jdbc.Driver");
Connection con = DriverManager. **_getConnection_** ("jdbc:mysql://localhost:3306/test", "root", "root");
PreparedStatement stat = con.prepareStatement(sql);
stat.setString(1, username);
stat.setString(2, password);
System.out.println(stat.toString());
ResultSet rs = stat.executeQuery();
while (rs.next()) {
String id = rs.getString(1);


String name = rs.getString(2);
System.out.println("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 user where name = 'zhangsan';

 但是 #{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符? 代

 替,变成如下的 sql 语句:

 select * from user where name = ?;

 而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成

 select * from user where name = 'zhangsan';

 以上,#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。

 那么,在使用过程中我们应该使用哪种方式呢?

 答案是,优先使用 #{}。因为 ${} 会导致 sql 注入的问题。看下面的例子:

 select * from ${tableName} where name = #{name}

 在这个例子中,如果表名为

 user; delete user; --

 则动态解析之后 sql 如下:

 select * from user; delete user; -- where name = ?;

 --之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对

 数据库造成重大损伤,极大可能导致服务器宕机。

 但是表名用参数传递进来的时候,只能使用 ${} ,具体原因可以自己做个猜测,去验证。这也提醒

 我们在这种用法中要小心sql注入的问题。

3.4.1 创建 UserTable

package com.itmayiedu.entity;
public class UserTable {
private int id;
private String userName;
private String passWord;

 }

3.4.2 创建 UserTable

package com.itmayiedu.mapper;
import com.itmayiedu.entity.UserTable;
public interface UserTableMapper {
public UserTable login(UserTable userTable);
}

3.4.3userTableMapper.xml

<?xml version= _"1.0"_ encoding= _"UTF-8"_ ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis- 3 - mapper.dtd">
<mapper namespace= _"com.itmayiedu.mapper.UserTableMapper"_ >
<select id= _"login"_ parameterType= _"com.itmayiedu.entity.UserTable"_
resultType= _"com.itmayiedu.entity.UserTable"_ >
SELECT id ,username as userName FROM user_table WHERE
username=${userName} AND password=${passWord}
</select>

  </mapper>

3.4.4 测试 SQL 注入

public class TestLoginMybatis3 {

public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {

String resource = "mybatis.xml";
// 读取配置文件


Reader reader = Resources. **_getResourceAsReader_** (resource);
// 获取会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession openSession = sqlSessionFactory.openSession();
// 查询
String sql = "com.itmayiedu.mapper.UserTableMapper.login";
// 调用api查询
UserTable userTable = new UserTable();
userTable.setUserName("'' OR 1=1 -- ");
userTable.setPassWord("12345");
List<UserTable> listUserTable = openSession.selectList(sql, userTable);
for (UserTable ub : listUserTable) {
System.out.println(ub.getUserName());
}
}
}

3.4.5 总结

 优先使用 #{}。因为 ${} 会导致 sql 注入的问题

四、 Mybatis 注解使用

  Mybatis提供了增删改查注解、@select @delete @update

4.1 建立注解 Mapper

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.itmayiedu.entity.User;
public interface UserTestMapper {
@Select("select * from users where id = ${id};")
public User getUser(@Param("id") String id);
}

4.2 加入 mybatis.xml

  <mapper class="com.itmayiedu.mapper.UserTestMapper" />

4.3 运行测试

 public class TestMybatis3 {

 public static void main(String[] args) throws IOException {

 String resource = "mybatis.xml";

 // 读取配置文件

 Reader reader = Resources. getResourceAsReader (resource);

 // 获取会话工厂

 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

 SqlSession openSession = sqlSessionFactory.openSession();

 // 调用api查询

 UserTestMapper userTestMapper=openSession.getMapper(UserTestMapper.class);

 System. out .println(userTestMapper.getUser("2"));

 }

 }

五、 Generator 使用

 Generator 逆向生成 使用

标签:username,13,String,user,sql,Mybatis,id,name
From: https://www.cnblogs.com/salixleaf/p/17143246.html

相关文章

  • 动力节点2023版MyBatisPlus教程【进阶篇】
    来自B站动力节点最新版的MybatisPlus教程,整理了笔记——第四章高级篇4【高级篇】4.1主键策略4.1.1主键生成策略介绍首先大家先要知道什么是主键,主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。当然对于表数据中的主键,我们可以自己设计生成规则,生成主键。......
  • 电源接口 C13,C14
    一般来说我们会把PC电源的交流输入接口称之为AC接口,但这最多只能算是一个统称,实际上它们有更准确的叫法。在多数PC电源上采用的比较常见的C14接口,配套电源线上的则是C13接口,而C20接口则多见于额定功率1000W或以上级别的产品,配套电源线上的则是C19接口,从这里我们也可以看出C13/C14......
  • Educational Codeforces Round 113 (Rated for Div. 2)
    题目链接B核心思路这个题目我觉得很好。首先分析下吧,如果有人需要执行操作二那么我们肯定就是给他们都打上平局是最优的。那么如果有人需要执行操作一呢,那么我们就可以把这些需要执行操作1的都搞一起。然后是他们成一个环。这样肯定就保证了每个人都会赢上一次。C核心思路......
  • 本地访问正常,部署之后出现mybatis访问数据库失败
     问题:本地访问一切正常,部署到阿里云之后出现mybatis访问数据库失败,反正就是无法连接到数据库,jdbc连接失败。{"timestamp":"2023-04-18T14:03:49.341+0000","status":500,"error":"InternalServerError","message":"nestedex......
  • 逆向工程MBG(MyBatis Generator)
    概述MyBatisGenerator(MBG)是MyBatisMyBatis的代码生成器。它将为所有版本的MyBatis生成代码。它将内省一个数据库表(或许多表)并生成可用于访问表的工件。这减少了设置对象和配置文件以与数据库表交互的初始麻烦。MBG寻求对大部分简单的CRUD(创建、检索、更新、删除)数据库......
  • day13_手动构建Springboot项目
    SpringBoot项目-手动构建1.创建maven项目在idea中创建一个maven项目,正常填写项目的坐标信息。如下图所示:输入项目的基本信息之后,点击finish,就可以创建一个maven项目。但是这个maven项目目前并不是springboot项目,我们还需要做如下两步操作。2.pom.xml配置1).在pom.xml中......
  • CF 1360E-Polygon,1300,思维题
    CF1360E-Polygon如果一个1不是在最右边或最下边,则一定有一个1在他的紧邻着的下边或右边,否则不合法。太妙了。#include<iostream>usingnamespacestd;constintN=1e2+10;intT,n;chara[N][N];intmain(){cin>>T;while(T--){......
  • Apple iWork(Pages、Numbers、Keynote)13.0 - 文档、电子表格、演示文稿
    请访问原文链接:https://sysin.org/blog/apple-iwork-13/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org苹果今天将其专为iOS和macOS设备设计的iWork应用套件更新为版本12(sysin),引入了许多新功能和改进功能。文档、电子表格、演示文稿,尽可集思广益。Pages......
  • 开发神器-idea 插件 mybatisPlus
    1.idea安装过程File-->settings-->Plugins-->Marketplace搜索MyBatisPlus安装后重启idea 2.好处一:Mapper或者Dao--->xml方便切换  3.好处二:快速生成 Controller、Service、ServiceImpl、Mapper、Entity 、xml等文件第一找到Other,第二配置数据库链接......
  • Mybatis 批量更新(foreach成多条sql) 为什么比 java 中反复执行单条插入语句效率高?
    使用MyBatis的批量更新功能可能比逐行更新更高效。使用批量更新可以将多个更新操作合并为一个批处理操作,并将所有操作发送给数据库一次(只需建立一次连接),从而减少了数据库的IO操作和网络开销,提高了系统的性能。mybatis批量更新的方法:https://cloud.tencent.com/developer/arti......