Mybatis入门

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_logo

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文件

存在xml

CRUD

查:

​ 1、查全部

xml

resultType是返回值类型,查全部本质上也是一个一个的查询,最后装到list中,所以返回值是User对象

​ 2、查单个

xml

parameterType是参数类型

增:

xml

要特别注意,在Mybatis中,所有增删改操作,都默认关闭自动提交事务,所以最后需要手动提交事务!!,若不想手动提交,需要在获取sqlSession时,带上参数

SqlSessionFactory原码

可见,openSession方法是有重载形式的,而且自动提交事务默认是关闭的

不开启自动提交事务
开启自动提交事务

改:

xml

删:

xml

万能的Map集合

使用Map集合达到单条件修改的效果

xml

设置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();
}
结果

修改成功

模糊查询

image-20200414181549343.png

方式一,在定义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();
}

此时传参需要将通配符加上

你可能感兴趣的:(Mybatis入门)