美文网首页
Mybatis入门

Mybatis入门

作者: 小杨小杨神采飞杨 | 来源:发表于2020-04-14 14:18 被阅读0次

    Mybatis

    获得Mybatis的方法:

    在maven仓库(https://mvnrepository.com),搜索Mybatis,复制粘贴到pom.xml,maven会自动下载相关配置依赖

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    

    中文文档: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无序重复导入依赖

    <groupId>cn.yzx</groupId>
    <artifactId>mybatis_learn</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules> <!--之后的module都会在该父工程下-->
        <module>mybatis_01</module>
    </modules>
    

    ​ 3、导入依赖,至少需要导入三个依赖,才能满足需求

    <!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
    

    3、创建一个模块

    ​ 1、编写mybatis核心配置文件

    官方建议的配置文件名称

    根据官方提示,在resources下创建配置文件,名称可以修改,但建议一致

    ​ 2、编写核心配置xml文件

    <!--核心配置文件-->
    <configuration>
        <!--配置,可多套配置,default表示默认使用配置-->
        <environments default="development">
            <environment id="development"><!--id为不重复单一标识符-->
                <transactionManager type="JDBC"/>
                <dataSource type="mybatis">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?
                    useUnicode=true&amp; 
                    characterEncoding=utf8&amp; 
                    serverTimezone=GMT&amp; 
                    useSSL=true"/>
                    <!--设置允许使用编码-->
                    <!--设置编码-->
                    <!--mysql8.0之后,需要设置时区-->
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    

    ​ 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<User> findAll();
    }
    

    接口实现类,在mybatis中,接口实现类被摒弃了,转而使用配置文件

    配置文件

    <?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="cn.yzx.dao.userMapper">
        <!--方法名以及结果集类型-->
        <select id="getUserList" resultType="cn.yzx.pojo.User">
            select * from user;
        </select>
    </mapper>
    

    ​ 5、测试

    ​ 在test下建立目录结构一致的包,随后建立对应test类

    public class userMapperTest {
        @Test
        public void test01() {
            SqlSession sqlSession = mybatisUtil.getsqlSession();
            userMapper mapper = sqlSession.getMapper(userMapper.class);
            List<User> 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文件中,加上以下代码

    <!--防止资源导出失败-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    

    之后就能正常运行了

    正常运行结果

    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<String,Object> map = new HashMap<String,Object>();
        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<User> 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<User> byMoreInfo = mapper.findByMoreInfo("%w%");
        for (User user : byMoreInfo) {
            System.out.println(user.toString());
        }
    
        sqlSession.close();
    }
    

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

    相关文章

      网友评论

          本文标题:Mybatis入门

          本文链接:https://www.haomeiwen.com/subject/hvzzmhtx.html