Mybatis
获得Mybatis的方法:
在maven仓库(https://mvnrepository.com),搜索Mybatis,复制粘贴到pom.xml,maven会自动下载相关配置依赖
org.mybatis
mybatis
3.5.2
中文文档:https://mybatis.org/mybatis-3/zh/index.html
什么是Mybatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Question:持久层
持久化:有一些信息不能失效,而内存是断电即失效的,所以需要将数据从瞬时状态转换到持久状态,这个过程就是持久化
持久层:完成持久化工作的代码操作,就是持久层做的事,层界限十分清晰
区分持久化、持久层,持久化是一个动作,而持久层是一个名词,是一个概念
第一个Mybatis程序
思路:搭建环境 --> 导入Mybatis --> 编写代码 --> 测试
搭建环境:
1、创建数据库以及表,并添加数据
create database mybatis;
use mybatis;
create table user (
id int(8) not null primary key,
name varchar(10) default null,
pwd varchar(10) default null
)engine=InnoDB default charset=utf8;
insert into user values('95001','yzx','123123'), ('95002','jay','123123'),('95003','zs','123123'),
('95004','ls','123123');
SET SQL_SAFE_UPDATES= 0;
2、创建项目
1、使用idea创建一个空的maven项目
2、删除src,将该项目当做父工程使用,这样做的好处是,之后在此工程下新建的module无序重复导入依赖
cn.yzx
mybatis_learn
pom
1.0-SNAPSHOT
mybatis_01
3、导入依赖,至少需要导入三个依赖,才能满足需求
mysql
mysql-connector-java
8.0.17
org.mybatis
mybatis
3.5.2
junit
junit
4.11
3、创建一个模块
1、编写mybatis核心配置文件
根据官方提示,在resources下创建配置文件,名称可以修改,但建议一致
2、编写核心配置xml文件
3、编写mybatis工具类
在项目下创建utils包,创建utils工具类
最后根据官方提示,在工具类内编写以下固定代码
//创建SqlSessionFactory并获取SqlSession的工具类
public class mybatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
String resource = "mybatis-config.xml"; //从resource读取文件
InputStream inputStream = Resources.getResourceAsStream(resource); //使用流读取文件
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //创建sqlSessionFactory对象
}catch (Exception e){
e.printStackTrace();
}
}
//获取SqlSession的方法
public statis SqlSession getsqlSession() {
return sqlSessionFactory.openSession();
}
}
这样一个mybatis工具类就写好了,SqlSession就和JDBC中PreparedStatement对象一样,用于执行sql语句
4、编写代码
实体类
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
Mapper接口
public interface userMapper {
List findAll();
}
接口实现类,在mybatis中,接口实现类被摒弃了,转而使用配置文件
配置文件
5、测试
在test下建立目录结构一致的包,随后建立对应test类
public class userMapperTest {
@Test
public void test01() {
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
此时会报一个错误:这个错误要死死的记住,绑定异常
org.apache.ibatis.binding.BindingException: Type interface cn.yzx.dao.userMapper is not known to the MapperRegistry.
原因是没有在核心配置文件中注册
之后还会出现另一个错误:资源过滤问题,此时打包会发现target中是没有对应xml文件的
The error may exist in cn/yzx/dao/userMapper.xml
解决方法是在pom.xml文件中,加上以下代码
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
之后就能正常运行了
target中也有了对应xml文件
CRUD
查:
1、查全部
resultType是返回值类型,查全部本质上也是一个一个的查询,最后装到list中,所以返回值是User对象
2、查单个
parameterType是参数类型
增:
要特别注意,在Mybatis中,所有增删改操作,都默认关闭自动提交事务,所以最后需要手动提交事务!!,若不想手动提交,需要在获取sqlSession时,带上参数
可见,openSession方法是有重载形式的,而且自动提交事务默认是关闭的
改:
删:
万能的Map集合
使用Map集合达到单条件修改的效果
设置sql参数时,只需要设置;需要修改的参数以及区别的条件即可,因为参数为map时,传入的是key的值,所以参数名称可以不需要和实体类一致,且参数个数可以自定义
@Test
public void test06(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
Map map = new HashMap();
map.put("id",95001);
map.put("name","yangzixian");
mapper.updateBySingle(map);
sqlSession.commit();
sqlSession.close();
}
修改成功
模糊查询
方式一,在定义sql语句时进行模糊设置
@Test
public void test07(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List byMoreInfo = mapper.findByMoreInfo("w");
for (User user : byMoreInfo) {
System.out.println(user.toString());
}
sqlSession.close();
}
此时传参,只需要正常设置条件即可
方式二,在定义sql语句时不进行模糊条件设置
@Test
public void test07(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List byMoreInfo = mapper.findByMoreInfo("%w%");
for (User user : byMoreInfo) {
System.out.println(user.toString());
}
sqlSession.close();
}
此时传参需要将通配符加上