MyBatis简介和使用

环境:

  • jdk1.8

  • mysql8.0.27

  • maven3.6.1

  • idea

1.简介

1.1、什么是MyBatis

  • MyBatis 是一款优秀的持久层框架

  • 它支持自定义 SQL、存储过程以及高级映射。

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • MyBatis本是apache的一个开源项目iBatis,2010年这个项目且改名为MyBatis。

  • 2013年11月迁移到Github。

如何获得Mybatis

        maven仓库

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
</dependency>

1.2、持久化

把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。 持久化是将程序数据在持久状态和瞬时状态间转换的机制。 JDBC就是一种持久化机制。文件IO也是一种持久化机制。

为什么需要持久化?

1. 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度

2. 代码重用性高,能够完成大部分数据库操作

3.松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码

1.3、持久层

dao层 server层 controller层

  • 完成持久化工作的代码块

  • 层界限十分明显

1.4、为什么需要MyBatis

  • 帮忙程序员将数据存入到数据库中

  • 传统的jdbc太复杂了,简化代码,使得代码不那么繁琐,使用框架,自动化,方便

优点:

  • 简单易学

  • 灵活

  • sql和代码的分离,提高了可维护性。

  • 提供映射标签,支持对象与数据库的orm字段关系映射

  • 提供对象关系映射标签,支持对象关系组建维护

  • 提供xml标签,支持编写动态sql

  • 使用的人多!!!

2、第一个MyBatis程序

搭建环境--->导入Mybatis--->编写代码--->测试

2.1、搭建环境

搭建数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`(
  `id` INT(20) NOT NULL PRIMARY KEY,
  `name` VARCHAR(30) DEFAULT NULL,
  `pwd` VARCHAR(30) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,'lwh','123456'),
(2,'张三','123456'),
(3,'李四','123456');

新建项目

  1. 新建一个普通的maven项目

  2. 删除src目录(作为父工程)

  3. 导入maven依赖

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>

2.2、创建一个模板

  • 编写mybatis的核心配置文件

1、核心配置文件

  • mybatis-config.xml

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

2、环境配置(environments)

MyBatis 可以配置成适应多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

学会使用配置多套运行环境!

MyBatis默认的事务管理器就是jdbc,连接池:POOLED

3、属性(properties)

我们可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

编写一个配置文件

db.properties

4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字

  • 意在降低冗余的全限定类名书写

  • 可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

  • 扫描实体类的包,它的默认别名就是这个类的类名,首字母小写

5、设置(settings)

用的最多的为日志,其他设置可见mybatis文档

6、映射器(mappers)

注意点:

  • 接口和它的Mapper配置文件必须同名!

  • 接口和它的Mapper配置文件必须在同一个包下!

<?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 核心配置文件-->
<configuration>
    <!--  引入外部配置文件  -->
    <properties resource="db.properties" />
    <!--  给实体类起别名  -->
    <typeAliases>
        <package name="com.zyy.pojo"/>
    </typeAliases>
    <settings>
        <!--  标准的日志工厂实现  -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--    environment 元素体中包含了事务管理和连接池的配置-->
    <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 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。-->
    <!--   每一个Mapper.xml都需要在mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/lwh/dao/UserMapper.xml"/>
        <!--  方式二:使用class文件绑定注册  -->
        <mapper class="com.lwh.dao.UserMapper"/>
        <!--  方式三:使用扫描包进行注入绑定  -->
        <package name="com.lwh.dao"/>
    </mappers>
</configuration>
  • 编写mybatis工具类

  • package com.lwh.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;
    
    // SqlSessionFactory ---> sqlSession
    public class MyBatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
        /**
         * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
         * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
         * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
         */
        static {
            // 使用MyBatis第一步获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
        public static SqlSession getSqlSession() {
            return sqlSessionFactory.openSession();
        }
    }

2.3、编写代码

  • 实体类

  • public class User {
        private int id;
        private String name;
        private String pwd;
    
    
        public User() {
        }
    
        public User(int id, String name, String pwd) {
            this.id = id;
            this.name = name;
            this.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;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", pwd='" + pwd + '\'' +
                    '}';
        }
    }

  • Dao接口

  • package com.lwh.dao;
    
    import com.lwh.pojo.User;
    import java.util.List;
    import java.util.Map;
    
    public interface UserDao {
        // 查询全部用户
        List<User> list();
        // 根据id查询用户
        User getUserById(@Param("id") int id);
        // insert一个用户
        int addUser(User user);
        // update一个用户
        int updateUser(User user);
        // delete一个用户
        int deleteUser(@Param("id") int id);
    }

  • 接口实现类(由原来的UserDaoImpl转为一个Mapper配置文件)

  • <?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">
    <!--namespace=绑定一个对应的Mapper接口-->
    <mapper namespace="com.lwh.dao.UserDao">
        <select id="list" resultMap="UserMapper">
            select * from t_user
        </select>
        <select id="getUserById" resultType="user" parameterType="int">
            select * from t_user where id = #{id}
        </select>
        <insert id="addUser"  parameterType="user">
            insert into t_user values(#{id},#{username},#{password},#{age},#{gender},#{email})
        </insert>
        <update id="updateUser" parameterType="user">
            update t_user
            set username = #{username}, password = #{password}, age = #{age}, gender = #{gender}, email = #{email}
            where id = #{id};
        </update>
        <delete id="deleteUser" parameterType="int">
            delete from t_user where id = #{id};
        </delete>
    </mapper>

    2.4、测试

  • 注意点:

  • 报错org.apache.ibatis.binding.BindingException: Type interface com.lwh.dao.UserDao is not known to the MapperRegistry. (检查核心配置文件下的mapper映射路径是否正确)

  • 报错Caused by: java.io.IOException: Could not find resource com/lwh/dao/UserMapper.xml(在pom.xml文件下添加build配置resources,来防止我们资源导出失败的问题)
  •  <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>

    junit测试

  • package com.lwh;
    
    import com.lwh.dao.UserDao;
    import com.lwh.pojo.User;
    import com.lwh.utils.MyBatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class UserDaoTest {
    
        @Test
        public void test() {
            // 1.获取sqlSession对象
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
            // 2.执行sql
            // 方式一:getMapper
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            List<User> list = mapper.list();
            for(User user : list) {
                System.out.println(user);
            }
    
            // 关闭sqlSession
            sqlSession.close();
        }
        @Test
        public void getUserById() {
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            User userById = mapper.getUserById(1);
            System.out.println(userById);
    
            sqlSession.close();
        }
        // 增删改都需要提交事务
        @Test
        public void addUser() {
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            Integer add = mapper.addUser(new User(4, "小明", "123456"));
            if(add != 1) throw new RuntimeException("添加失败");
            // 提交事务
            sqlSession.commit();
            sqlSession.close();
        }
        @Test
        public void updateUser() {
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            Integer update = mapper.updateUser(new User(4, "张三丰", "888888"));
            if(update != 1) throw new RuntimeException("修改失败");
            sqlSession.commit();
            sqlSession.close();
        }
        @Test
        public void deleteUser() {
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            Integer delete = mapper.deleteUser(1);
            if(delete != 1) throw new RuntimeException("删除失败");
            sqlSession.commit();
            sqlSession.close();
        }
    }

    3.日志

3.1、日志工厂

  • SLF4J

  • LOG4J(deprecated since 3.5.9)

  • LOG4J2

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING

  • NO_LOGGING

在mybatis中具体使用哪一个日志实现,在mybatis核心配置文件中添加日志配置!

3.2、LOG4J

什么是Log4J

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件;

  • 我们也可以控制每一条日志的输出格式;

  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程;

  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

log4j.properties

#将等级为DEBUG的日志输出到console和file这两个目的地,console和file的定义在下面配置中
log4j.rootLogger=DEBUG, console, file

#控制台输出的相关配置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n

#文件输出的相关配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zyy.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值