目录
-
MyBatis 是什么?
-
mybatis是一套位于dao层,封装了jdbc,使用了ORM对象关系映射的框架。
-
1.mybatis入门 -查询所有
-
创建Maven工程(jar), 添加坐标
-
创建pojo (javabean)
-
创建UserDao接口
-
创建UserDao映射文件 (xml配置文件)
-
创建MyBatis核心配置文件SqlMapConfig.xml (xml配置文件)
-
编写java代码测试
// 1.读取核心配置文件
// 2.创建构建器 SqlSessionFactoryBuilder
// 3.使用构建器创建工厂 SqlSessionFactory工厂
// 4.问工厂要对象 SqlSession对象
// 5.问对象要代理对象 UserDao的代理对象
// 6.调用方法
// 7.关闭对象 SqlSession对象
<!--1. 添加依赖-->
<dependencies>
<!--MyBatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!--lombok 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
2.规范
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml(UserDao.xml)文件中的namespace必须和mapper(Dao)接口的全限定名相同。
Type interface com.itheima.dao.UserDao is not known to the MapperRegistry.
2、Mapper.xml文件中select,update等的标签id的值必须和mapper(Dao)接口的方法名相同
Invalid bound statement (not found): com.itheima.dao.UserDao.findAll
3、Mapper.xml文件中select,update等的标签的parameterType必须和mapper(Dao)接口的方法的形参类型对应
4, Mapper.xml文件中select,update等的标签的resultType必须和mapper(Dao)接口的方法的返回值类型对应
5, Mapper.xml文件的文件名尽量和mapper(Dao)接口的名字一样
6, Mapper.xml文件的路径尽量和mapper(Dao)接口的路径在同一层目录
3.使用Mybatis完成CRUD
-
在Dao接口定义方法
-
在Dao映射文件配置
1.新增用户
// 1.读取核心配置文件
// 2.创建构建器 SqlSessionFactoryBuilder
// 3.使用构建器创建工厂 SqlSessionFactory工厂
// 4.问工厂要对象 SqlSession对象
// 5.问对象要代理对象 UserDao的代理对象
// 6.调用方法
// 7.提交事务,增删改必用
// 8.关闭对象 SqlSession对象
2.获取新增用户 id的返回值
-
方式一 标签SelectKey获取主键
-
方式二:属性配置
3.新增用户 id 的返回值(字符串类型)
字符串类型的主键通常就是UUID生成的一串32个字符的字符串。 数据库合并!
4.修改用户
// 1.读取核心配置文件
// 2.创建构建器 SqlSessionFactoryBuilder
// 3.使用构建器创建工厂 SqlSessionFactory工厂
// 4.问工厂要对象 SqlSession对象
// 5.问对象要代理对象 UserDao的代理对象
// 6.调用方法
// 查询数据
// 修改数据
// 执行修改动作
// 7.提交事务,增删改必用
// 8.关闭对象 SqlSession对象
5.删除用户
6.模糊查询
模糊查询要添加 % , 有两种办法来处理: 1. 在外面传递进来参数|数据的时候,先把这个%跟查询的参数 拼接到一起, 那么到xml里面取值的时候,直接使用#{username}来取值即可 2. 不在外面拼接 % ,选择在 xml 拼接 %
#{}与${}的区别【面试】
-
#{}
-
可以防止sql注入
-
会对sql语句进行预编译|解析,传递什么参数进来,仅仅是顶替占位
#{}
而已。 -
一般使用的都是这个#{}
-
#{} 背后会自动的拼接上 ' '
-
-
${}
-
不能防止sql注入
-
不会对sql语句进行预先编译,传递什么参数进来,不会仅仅认为这数据,会和sql语句做拼接之后再解析SQL语句 ' or '1=1'
-
一般比较少用这个,能使用#{}就先使用这个#{}
-
${} 不会拼接上 ' ' 所以有时候,我们需要做一些order by 这样的列名指定,需要的是准确的列名,而不是 '列名'
-
如果只有一个简单参数的话,那么名字只能用${value}不能使用其他的名字
-
一般来说,只要 #{} 能用的,基本都用它,只要它不能用的时候,再想想这个 ${}
增删改查
-
增加
<insert id="" parameterType="" resultType="" keyProperty="" useGeneratedKeys="true">
sql语句
</insert>
-
更新
<update id="" parameterType="" resultType="" >
sql语句
</update>
-
删除
<delete id="" parameterType="" resultType="" >
sql语句
</delete>
-
查询
<select id="" parameterType="" resultType="" >
sql语句
</select>
4.抽取SqlSessionFactory
package com.jcli.utils;
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;
/*
这是专门用来创建SqlSession的工具类
1. 对外提供一个方法,这个方法供其他人来获取SqlSession
2. 对外提供一个方法,这个方法供其他人来收尾(commit & close)
3. 使用静态代码块来创建SqlSessionFactory
*/
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//1. 读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2. 创建构建器SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 使用构建器创建SqlSessionFactory工厂
sqlSessionFactory = builder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 问工厂要SqlSession对象
*
* @return
*/
public static SqlSession getSession() {
//4. 问工厂要SqlSession对象
return sqlSessionFactory.openSession();
}
/**
* 关闭SqlSession
*
* @param session
*/
public static void close(SqlSession session) {
//8. 关闭SqlSession
session.close();
}
/**
* 提交并且关闭
*
* @param session
*/
public static void commitAndClose(SqlSession session) {
//8. 关闭SqlSession
session.commit();
session.close();
}
}
5.Mybatis的参数parameterType
1.传递简单类型
#{任意字段}或者${value}
2.传递pojo对象类型
#{javaBean属性名}或者${javaBean属性名}
3.传递的包装的pojo
#{属性名.属性名} 或者${属性名.属性名}
6.Mybatis的参数 resultType
-
输出简单类型 直接写
java类型名
eg: int -
输出pojo对象 直接写
pojo类型名
eg: User -
输出pojo列表类型 写
列表里面的泛型的类型
eg: List<User> 写User -
ResultMap
-
解决查询出来的结果的列名和javaBean属性不一致的请求
mybatis01传送门: