1、准备数据模型,建库建表
CREATE DATABASE `mybatis-example`; USE `mybatis-example`; CREATE TABLE `t_emp`( emp_id INT AUTO_INCREMENT, emp_name CHAR(100), emp_salary DOUBLE(10,5), PRIMARY KEY(emp_id) ); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
2、pom.xml(添加依赖:mysql,mybatis)
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--junit5测试--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
3、Employee.java(pojo)
package com.atguigu.mybatis.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Employee { private Integer empId; private String empName; private Double empSalary; }
4、EmpMapper.java
package com.atguigu.mybatis.mapper; import com.atguigu.mybatis.pojo.Employee; import java.util.List; public interface EmpMapper { List<Employee> getEmployeeList(); Employee getEmployeeById(Integer empId); }
5、mybatis-config.xml(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表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --> <environments default="development"> <!-- environment表示配置Mybatis的一个具体的环境 --> <environment id="development"> <!-- Mybatis的内置的事务管理器 --> <transactionManager type="JDBC"/> <!-- 配置数据源 --> <dataSource type="POOLED"> <!-- 建立数据库连接的具体信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <!-- Mapper注册:指定Mybatis映射文件的具体位置 --> <!-- mapper标签:配置一个具体的Mapper映射文件 --> <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --> <!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --> <mapper resource="mapper/EmpMapper.xml"/> </mappers> </configuration>
6、EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace等于mapper接口类的全限定名,这样实现对应 --> <mapper namespace="com.atguigu.mybatis.mapper.EmpMapper"> <!-- 查询使用 select标签 id = 方法名 resultType = 返回值类型 标签内编写SQL语句 --> <select id="getEmployeeList" resultType="com.atguigu.mybatis.pojo.Employee"> <!-- #{empId}代表动态传入的参数,并且进行赋值!后面详细讲解 --> select emp_id empId, emp_name empName, emp_salary empSalary from t_emp </select> <select id="getEmployeeById" resultType="com.atguigu.mybatis.pojo.Employee"> select emp_id empId, emp_name empName, emp_salary empSalary from t_emp where emp_id = #{value} </select> </mapper>
7、MybatisTest.java
package com.atguigu.mybatis; import com.atguigu.mybatis.mapper.EmpMapper; 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 org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; public class MybatisTest { SqlSessionFactory sqlSessionFactory; SqlSession sqlSession; EmpMapper empMapper; @BeforeEach public void setup() throws IOException { // 获取资源流,读取"mybatis-config.xml"文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 使用资源流创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 使用SqlSessionFactory打开一个Session sqlSession = sqlSessionFactory.openSession(); // 使用Session获取EmpMapper的Mapper对象 empMapper = sqlSession.getMapper(EmpMapper.class); } // 在每个测试用例之后执行的清理方法 @AfterEach public void teardown() { sqlSession.close(); // 关闭SqlSession } @Test public void getEmployeeListTest() { empMapper.getEmployeeList().forEach(System.out::println); } //Employee(empId=1, empName=tom, empSalary=200.33) //Employee(empId=2, empName=jerry, empSalary=666.66) //Employee(empId=3, empName=andy, empSalary=777.77) @Test public void getEmployeeByIdTest() throws IOException { System.out.println(empMapper.getEmployeeById(1)); //Employee(empId=1, empName=tom, empSalary=200.33) } }
8、#{value}
在MyBatis中,#{value}是一种预编译的参数占位符,用于在SQL语句中插入参数值。它能够防止SQL注入攻击,提高SQL语句的安全性。当使用#{value}作为参数占位符时,MyBatis会将参数值直接插入到SQL语句中,并在执行时进行数据类型转换和字符转义处理。这种预编译的参数占位符可以有效地提高SQL语句的性能和安全性。
在MyBatis中,#{value}是一种预编译的参数占位符,用于在SQL语句中插入参数值。它能够防止SQL注入攻击,提高SQL语句的安全性。
当使用#{value}作为参数占位符时,MyBatis会将参数值直接替换到SQL语句中,并在执行时进行数据类型转换和字符转义处理。这样可以确保SQL语句的正确性和安全性,避免了手动拼接SQL语句的麻烦和潜在的安全风险。
需要注意的是,#{value}只适用于参数值是安全的情况下,如果参数值来自不可信的来源,应该使用其他安全措施来防止SQL注入攻击。
在MyBatis中,#{value}主要有以下作用:
- 参数占位符:#{value}用作SQL语句中的参数占位符,表示一个参数值的位置。在执行SQL语句时,MyBatis会将该占位符替换为实际的参数值。
- 防止SQL注入:使用#{value}可以有效地防止SQL注入攻击。MyBatis会对参数值进行预编译处理,确保参数值在SQL语句中的正确性和安全性。这样可以避免恶意用户通过拼接SQL语句来执行恶意操作。
- 自动类型转换:MyBatis会根据参数值的类型自动进行类型转换。无论参数值是Java的基本类型、包装类型还是其他自定义类型,MyBatis都能够正确处理并将其转换为SQL语句中对应的数据类型。
- 简化参数处理:使用#{value}可以简化参数的处理过程。开发者只需要关注SQL语句的编写,而不需要手动拼接参数值或处理参数值的转义问题。MyBatis会自动处理这些细节,提高了开发效率和代码的可读性。
综上所述,#{value}在MyBatis中起到了参数占位符、防止SQL注入、自动类型转换和简化参数处理的作用,提高了SQL语句的安全性和开发效率。
在MyBatis中,预编译占位符有三种,分别是:
- #{value}:这是最常用的预编译占位符,用于插入参数值,可以防止SQL注入攻击。
- ${value}:这是非预编译占位符,直接将参数值插入到SQL语句中,需要注意避免SQL注入攻击。
- #{}:这是参数占位符,用于插入参数值,但不会进行预编译处理,因此不能防止SQL注入攻击。
需要注意的是,在MyBatis中,使用#{value}是最安全和推荐的方式,因为它可以有效地防止SQL注入攻击,提高SQL语句的安全性。