Mybatis快速学习目录
Mybatis概念
- MyBatis是一款优秀的持久层框架,用于简化JDBC 开发
持久层
- 负责将数据到保存到数据库的那一层代码
- JavaEE三层架构:表现层、业务层、持久层
框架
- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
JDBC缺点
我们接下来会用Mybatis简化JDBC
MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
MyBatis 快速入门
用一个案例进行入门学习
查询user表中所有数据
- 首先创建user表
create database mybatis;
use mybatis;
drop table if exists tb_user;
create table tb_user(
id int primary key auto_increment,
username varchar (20),
password varchar (20),
gender char (1),
addr varchar (30)
);
INSERT INTO tb_user VALUES (1, 'zhangsan', '123','男','北京');
INSERT INTO tb_user VALUES (2,'李四','234','女','天津');
INSERT INTo tb_user VALUES (3, '土五.','11','为','西安');
- 创建模块
- pom.xml中导入Maven坐标(新手可以去官网复制)
mybatis依赖,mysql驱动,logback依赖
MyBatis中文网:https://mybatis.net.cn/getting-started.html
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
- 编写MyBatis核心配置文件(mybatis-config.xml)
根据自己项目进行修改参数
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件,自己改-->
<mapper resource="加载sql映射文件,写路径"/>
</mappers>
</configuration>
- 编写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="名称空间">
<select id="id是指向sql的唯一标识,不能重复" resultType="对应的返回结果的类型,将来包装成什么类型就写什么类型">
select * from tb_ user;
</select>
</mapper>
- 编码 (MybatisDemo.java)
- 定义pojo类 (User.java)
- 加载核心配置文件,获取SqlSessionFactory对象
- 获取 SqlSession对象,执行SQL语句
- 释放资源
public static void main(String[ ] args) throws IOException {
//1.加载mybatis的核心配置文件,获取SqlsessionFactory
string resource = "mybatis-config.xml";
Inputstream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它来执行sql
sqlsession sqlSession = sqlsessionFactory.openSession(;
//3.执行sql
List<User> users = sqlSession.selectList(statement: "名称空间.id");
system.out.println(users);
//4.释放资源
sqlSession.close();
Mapper代理开发
目的:解决原生方式中的硬编码简化后期执行SQL
- 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
- 设置SQL映射文件的namespace属性为Mapper接口全限定名
- 在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 编码
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sgl的执行
与上面的(MyBatis 快速入门)区别部分如下
定义一个接口(UserMapper.java)
public interface UserMapper {
List<User> selectAll(); //这里selectAll对应映射文件里的id
}
上面执行sql的地方改为获取UserMapper接口的代理对象(MybatisDemo.java)
//3. 获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
MyBatis核心配置文件
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
MyBatis核心配置文件的顶层结构如下:
简单介绍一个,其余用到时自行查看文档(https://mybatis.net.cn/configuration.html)
环境配置(environments)
MyBatis 可以配置成适应多种环境,但每个 SqlSessionFactory 实例只能选择一种环境。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注:
- 默认使用的环境 ID(比如:default=“development”)。
- 每个 environment 元素定义的环境 ID(比如:id=“development”)。
- 事务管理器的配置(比如:type=“JDBC”)。
- 数据源的配置(比如:type=“POOLED”)。
- 默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。
配置文件的各种细节
Mybatis三部曲
- 编写接口方法:Mapper接口
- 编写SQL语句: SQL映射文件
- 执行方法,测试
如何解决字段名和属性名不一致问题
数据库表的字段名称和实体类的属性名称不一样,不能自动封装数据
解决办法:resultMap:
在映射文件中写:
<resultMap id="userResultMap" type="user">
<result column="user_name" property="userName"/>
</resultMap>
id:唯一标识
type:映射的类型,支持别名
column:数据库表的列名
property:实体类的属性名
使用方法resultMap替换resultType属性
<select id="selectAll" resultMap="userResultMap">
select
*
from tb_user;
</select>
Mybatis如何接收来自数据库参数
参数占位符:
- #{ }:会将其替换为?,为了防止SQL注入
- ${ }:拼sql。会存在SQL注入问题
- 使用时机:
- 参数传递的时候:#{ }
- 表名或者列名不固定的情况下:${ }会存在SQL注入问题
参数类型:parameterType:可以省略
- 特殊字符处理:
- 转义字符
- CDATA区:<![CDATA[内容]]>
多条件查询
参数传递的三种方式:1.@Param 2.传对象 3.封装为Map集合
注解完成增删改查
使用注解开发会比配置文件开发更加方便
查询:@Select
添加:@lnsert
修改:@Update
删除:@Delete
比如查询,我们无需书写配置文件,直接使用注解
@Select("select * from tb_user where id = #{id}")
public User selectByld(int id);
注解完成简单功能
配置文件完成复杂功能
tips:
- 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
- 选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的式,完全取决于你和你的团队,永远不要拘泥于一种方式。
动态SQL
动态SQL与javase的逻辑基本相同,只是书写有所不同
后面会专门出一篇笔记讲解动态SQL
详细可以看https://mybatis.net.cn/dynamic-sql.html