【SSM - MyBatis篇01】MyBatis原理和环境搭建,用MyBatis实现增删查改操作

1. MyBatis简介

  MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
  MyBatis 是一个基于Java的持久层框架。MyBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO),它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索
  MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和Java的 POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
  MyBatis框架通过动态代理,大大简化了代码量,开发者只需要写接口和sql语句就行,使用时JVM会在内存中自动帮你实现对应接口的实现类。调用完成之后,会自动将接口的实现类从内存中释放。
  mybatis自带的连接池



2. MyBatis环境搭建

mybaits的代码由github.com管理
下载地址:https://github.com/mybatis/mybatis-3/releases

下载解压后会得到这样的目录结构:
在这里插入图片描述

  mybatis-3.4.5.jar是MyBatis的核心包,mybatis-3.4.5.pdf是MyBatis的使用手册,lib文件夹下的JAR是MyBatis的依赖包。
  使用MyBatis框架时,需要将它的核心包和依赖包引入到应用程序中。

2.1 MyBatis的使用需要导入jar或者依赖

 <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

2.2 创建日志类log4j

MyBatis默认使用log4j输出日志信息,如果开发者需要查看控制台输出的SQL语句,那么需要导入log4j的依赖

<!--日志包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>


3. MyBatis的工作原理

在这里插入图片描述

1、读取MyBatis配置文件
  mybatis-config.xml(核心配置文件,存放四大基本信息:ip,port,username,password)
2、加载映射文件
  Mapper1.xml、Mapper2.xml······ 就是对应的dao层接口的映射文件(主要是数据库的增删查改sql语句select,update,delete,insert)
3、构造会话工厂SqlSessionFactory(使用工厂设计模式生成sessionFactory)
4、构造会话对象SqlSession(支持增删查改,连接)
(一般将3,4封装成工具类util使用来减少代码)


(下面的是较底层的,都不需要我们去写)
5、Executor执行器
6、MappedStatement对象
7、输入映射(Map、list类型/String、integer等基本类型/POJO类型)
8、输出映射(Map、list类型/String、integer等基本类型/POJO类型)
9、数据库
(输入映射 —> MappedStatement对象 —> 输出映射)

4. 通过MyBatis的getMapper实现增删查改


https://github.com/strive-xgf/SSM/commit/cdded0e4200374f7b1094f137b6786b2b883adeb

  1. 导入依赖包
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

<!-- MySql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.32</version>
    </dependency>

<!-- Mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>

<!--日志包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.6.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jcl</artifactId>
      <version>2.6.2</version>
    </dependency>


  </dependencies>
  1. 在resources目录下,创建log4j2.xml日志文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志文件 -->
<Configuration status="WARN">
    <Appenders>
        <!--Console向控制台追加日志 target的值SYSTEM_OUT表示向系统控制台输出  -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 输出日志格式信息 name: 是要进行日志记录的目录 -->
            <PatternLayout pattern="      日志log:    %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n "/>
        </Console>
    </Appenders>
    <!-- 记录哪些类的日志信息  -->
    <Loggers>
        <!--DEBUG 是日志级别 调试信息也会记录 -->
        <Logger name="com.xgf.MybatisDemo.dao" level="DEBUG"/>

        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
  1. 创建bean (User类)

//User用户类
public class User {
    
    
    private int id;             //主键id
    private String username;    //用户名
    private Date birthday;      //出生日期
    private int sex;            //性别
    private String address;     //家庭地址
    //这里省略getter和setter方法,toString方法
}
  1. 创建User类的映射文件
//创建User类的映射文件
public interface UserMapper {
    
    
    //通过id查找user
    public User getUserById(int id);

    //通过模糊搜索,找到对应的用户名
    //    select * from user where username like '张%'
    List<User> findByUsername(String username);

    //通过id删除user
    public void deleteById(int id);

    //添加user
    public void saveUser(User user);

    //更新user
    public int updateUser(User user);
}
  1. 核心配置文件 mybatis-config.xml
<?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">
<!--  dtd是对xml配置标签与属性的约束  -->
<configuration>
    <!-- environment环境,开发环境,生产环境  用来配置数据库连接-->
    <!--  development默认值,开发环境  -->
    <environments default="development">
        <environment id="development">
            <!--transactionManager 使用jdbc的事务管理 让sql语句作为一个组,要么全部成功,要么全部失败-->
            <transactionManager type="JDBC"/>
            <!-- POOLED  这是mybatis自带的连接池-->
            <dataSource type="POOLED">
                <!-- 数据库连接的四大基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="861221293"/>
            </dataSource>
        </environment>
    </environments>


    <!-- mappers 用来配置多个映射文件(写sql语句的文件),指定配置文件 -->
    <mappers>
        <mapper resource="com.xgf.mybatisdemo.dao.UserMpper"/>
    </mappers>
</configuration>
  1. 创建UserMapper.xml写sql语句实现增删查改
<?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">

<!--
     书写操作User表的Sql语句,每一个SqL语句都有Id,id必须是唯一
      使用命名空间保证不重复 sql的id =  命名空间+id
  命名空间
   一般和业务类接口名字相同,业务类叫 UserMapper
   parameterType="int" 接受的参数类型
   resultType="com.qst.mybatis.bean.User" 返回的类型
 -->

<!--使用代理以后 当前的映射文件要与接口同名,并且放在同一个位置
    使用代理以后 namespace要求写接口的全类名 包名+类名=全类名
-->
<mapper namespace="com.xgf.mybatisdemo.dao.UserMapper">
    <!--parameterType 输入(接收)的参数类型   resultType  返回的类型
     #{id}是占位符 select * from users where id = ?; 就相当于调用对象的get方法-->
    <select id="getUserById" parameterType="int" resultType="com.xgf.mybatisdemo.bean.User">
        select * from user where id = #{id}
    </select>

    <!--    keyProperty  获取到的新插入的记录的主键赋值给返回对象的属性
            useGeneratedKeys="true",使用主键生成(主键自动增长)
            keyProperty="id" 将主键的值id赋值给对象user  (创建对象的时候不用赋值主键值)
    -->
    <insert id="saveUser" parameterType="com.xgf.mybatisdemo.bean.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address});
    </insert>
    
    <!-- 输出多个用户对象 , mybatis  会自动判断  如果是多个User对象,自动封装成集合   -->
    <select id="findByUsername" resultType="com.xgf.mybatisdemo.bean.User">
        select * from user where username like #{username};
    </select>

	<!-- 更新user数据 -->
    <update id="updateUser" parameterType="com.xgf.mybatisdemo.bean.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id = #{id};
    </update>


    <delete id="deleteById" parameterType="int">
          delete from user where id= #{id}
    </delete>

</mapper>
  1. 创建获取sqlSession的工具类(封装成util工具类)
//sqlSession工具类,获取sqlSession
public class SqlSessionUtils {
    
    

    //SqlSessionFactory对象
    private static SqlSessionFactory sqlSessionFactory;

    //static 静态代码,在类加载的时候执行一次,且只执行一次
    static{
    
    
        //1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //2. 加载mybatis-config.xml配置文件   参数:核心配置文件
        InputStream inputStream = SqlSessionUtils.class.getClassLoader().getResourceAsStream("com/xgf/mybatisdemo/config/mybatis-config.xml");
        //3. 创建SqlSessionFactory对象  加载核心配置文件  参数:输入流
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

    }

    public static SqlSession getSession(){
    
    
        // 4. 创建SqlSession对象  对数据库进行操作
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}
  1. 创建测试类,测试对user的增删查改
public class TestSqlSessionUtils {
    
    

    private SqlSession sqlSession = null;
    private UserMapper userMapper = null;
    //@Before 在每个方法执行前获取session
    @Before
    public void init(){
    
    
        //通过SqlSessionUtils工具类获取sqlSession
        sqlSession = SqlSessionUtils.getSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    //测试查询
    @Test
    public void test01(){
    
    
        System.out.println("查找user");
        User user = userMapper.getUserById(2);
        System.out.println(user);
    }

    //(对数据库进行修改需要提交事务(insert、update、delete))
    //测试增加
    @Test
    public void test02(){
    
    
        // mybatis动态代理会自动生成userMapper的实现类,查询sql,执行jdbc代码
        System.out.println("增加user");
        User user = new User(null,"添加username", Date.valueOf("2020-12-15"), 1, "湖南省张家界市");
        userMapper.saveUser(user);
        sqlSession.commit();
    }

    //测试删除
    @Test
    public void test03(){
    
    
        System.out.println("删除id=1的user");
        userMapper.deleteById(1);
        //sqlSession执行数据更新(增加、删除、修改)需要提交事务commit才会对数据库进行修改,查询不需要提交事务
        sqlSession.commit();
    }

    //测试通过模糊查询 username
    @Test
    public void test04(){
    
    
        System.out.println("查询用户名中含有name的所有user");
        List<User> userList = userMapper.findByUsername("%name%");
        for(User user:userList){
    
    
            System.out.println(user);
        }
    }

    //测试更新
    @Test
    public void test05(){
    
    
        System.out.println("更新id=7的数据");
        int i = userMapper.updateUser(new User(7, "我更新了7的user", Date.valueOf("2020-2-22"), 2, "我的address在湖南"));

        if(i>0){
    
    
            sqlSession.commit();
            System.out.println("更新了" + i + "条数据");

        }else{
    
    
            System.out.println(" id =7 的用户不存在,数据更新失败");
        }

    }

    //每个方法执行之后执行
    @After
    public void destory(){
    
    
        sqlSession.close();//关闭sqlSession
    }

}

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108780998
今日推荐