1、MyBatis快速上手
MyBatis是持久层框架(半成品软件),用于简化JDBC开发
MyBatis有两种使用方式,第一种是原始使用方式,第二种是mapper代理开发方式
1.1 原始使用方式
- 创建表,在表中添加数据;
- 创建maven项目,导入mybatis、mysql连接驱动、junit坐标;
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatisDemo1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--测试的坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--日志功能-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
</dependencies>
</project>
logback.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
-
编写mybatis核心配置文件,命名一般默认是mybatis-config;
-
编写SQL映射文件;
-
编码(定义实体类,加载核心配置文件获取SqlSessionFactory对象,获取SqlSession对象,执行SQL语句,释放资源)
1.2 mapper代理开发
针对mybatis基本使用中存在的硬编码问题(主要是执行SQL语句这一步,参数传入了字符串),利用mapper代理开发解决
-
定义与SQL映射文件同名的Mapper接口,同时Mapper接口和SQL映射文件放在同一目录下(一般把sql映射文件放在resource下,因此通过在resource下新建与Mapper接口一样的目录,再将sql映射文件放在该目录下即可);这一步是为了能在mybatis-config.xml使用包扫描的方式简化
-
设置SQL映射文件的namespace属性为Mapper接口全限定名;
-
在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的id,并保持参数类型和返回值类型一致;
注意看看mybatis-config.xml中的SQL映射文件的位置对不对,使用mapper代理开发的方式,mybatis-config.xml中加载映射文件可以使用包扫描的方式简化。
-
编码(通过SqlSession的getMapper方法获取Mapper接口的代理对象,调用对应方法完成sql的执行)。
package com.py;
import com.py.mapper.UserMapper;
import com.py.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
//mapper代理开发方式
public class Demo2 {
public static void main(String[] args) throws IOException {
//加载核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlsession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
//释放资源
sqlSession.close();
}
}
2、MyBatis进阶学习
2.1 核心配置文件详解
参考mybatis核心配置文件详解即可
2.2 MyBatis完成增删改查
第一节快速上手中使用的都是配置文件完成增删改查功能,除了使用配置文件,还可以使用注解完成增删改查功能。
2.2.1 配置文件完成增删改查
查询
-
查询所有
-
查询详情
(1)mybatis中参数占位符:
#{}——执行时会将其替换为?,可以防止SQL注入
${}——直接进行拼接,无法防止SQL注入
(2)SQL语句中特殊字符处理:当出现<或者其他特殊字符时,可以使用转义字符或者CDATA区处理
(3)parameterType可以省略
-
条件查询
多条件查询,传递参数的方式有三种:
(1)散装参数
(2)封装成对象
(3)用map封装
动态查询
<if>、<where>、<when>
问题:
查询时,当数据库的字段名和实体类的属性名不一致时,不能自动封装数据(一般都是数据库是下划线连接,实体类是驼峰命名如brand_name和brandName)
解决方式:
(1)起别名,对不一样的列名起别名,让别名和实体类的属性名一样即可,可以直接在SQL语句中起别名,也可以使用SQL片段
(2)用resultMap解决,首先定义resultMap标签,然后用resultMap替换resultType标签
添加
mybatis中:
openSession()默认开启事务,进行增删改后需要sqlSession.commit()手动提交事务;
openSession(true)可以设置为自动提交事务,相当于关闭事务;
使用<insert useGeneratedKeys=‘true’ keyProperty=‘id’> 返回添加数据的主键。
修改
- 修改全部字段
- 修改动态字段
删除
- 删除一个
- 批量删除
流程:编写Mapper接口方法(参数、返回值);编写SQL映射文件;执行
总结:当参数是collection、list、array以及多个参数时要使用@Param注解