Mybatis入门

Mybatis介绍

​ MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

2013年11月迁移到Github。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

Mybatis框架

  框架介绍

  1、 mybatis配置

  SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

  mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

  2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

  3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

  4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

  5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

  6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对 

  preparedStatement设置参数。

  7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程

  中对结果的解析处理过程。

利用IDEA创建Mybatis的入门案例

8个步骤

  1. 创建maven工程,什么都不选就ok,并导入坐标;
 1 <packaging>jar</packaging>
 2 <dependencies>
 3     <dependency>
 4         <groupId>org.mybatis</groupId>
 5         <artifactId>mybatis</artifactId>
 6         <version>3.4.5</version>
 7     </dependency>
 8     <dependency>
 9         <groupId>mysql</groupId>
10         <artifactId>mysql-connector-java</artifactId>
11         <version>5.1.6</version>
12     </dependency>
13     <dependency>
14         <groupId>log4j</groupId>
15         <artifactId>log4j</artifactId>
16         <version>1.2.12</version>
17     </dependency>
18 
19     <dependency>
20         <groupId>junit</groupId>
21         <artifactId>junit</artifactId>
22         <version>4.10</version>
23     </dependency>
24 </dependencies>
  1. 编写User实体类
 1 public class User implements Serializable {
 2     private int id;
 3     private String username;// 用户姓名
 4     private String sex;// 性别
 5     private Date birthday;// 生日
 6     private String address;// 地址
 7 
 8     public int getId() {
 9         return id;
10     }
11 
12     public void setId(int id) {
13         this.id = id;
14     }
15 
16     public String getUsername() {
17         return username;
18     }
19 
20     public void setUsername(String username) {
21         this.username = username;
22     }
23 
24     public String getSex() {
25         return sex;
26     }
27 
28     public void setSex(String sex) {
29         this.sex = sex;
30     }
31 
32     public Date getBirthday() {
33         return birthday;
34     }
35 
36     public void setBirthday(Date birthday) {
37         this.birthday = birthday;
38     }
39 
40     public String getAddress() {
41         return address;
42     }
43 
44     public void setAddress(String address) {
45         this.address = address;
46     }
47 
48     @Override
49     public String toString() {
50         return "User [id=" + id + ", username=" + username + ", sex=" + sex
51                 + ", birthday=" + birthday + ", address=" + address + "]";
52     }
53 
54 }

  3.在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml。它是mybatis核

  心配置文件,配置文件内容为数据源、事务管理。

    配置环境:

  • 配置mysql的环境:
  1. 配置事务的类型;
  2. 配置连接池:配置连接数据库的4个基本信息
  • 指定映射配置文件的位置:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 
 6 <configuration>
 7 <!--   配置环境-->
 8     <environments default="mysql">
 9          <!--配置mysql的环境-->
10         <environment id="mysql">
11              <!--配置事务的类型-->
12             <transactionManager type="JDBC"></transactionManager>
13            <!--配置连接池-->
14             <dataSource type="POOLED">
15                 <!--配置连接数据库的4个基本信息-->
16                 <property name="driver" value="com.mysql.jdbc.Driver"/>
17                 <property name="url" value="jdbc:mysql://192.168.214.128:3306/mybatis"/>
18                 <property name="username" value="root"/>
19                 <property name="password" value="ben123"/>
20             </dataSource>
21         </environment>
22     </environments>
23 
24 <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
25     <mappers>
26         <mapper resource="com/ben/dao/IUserDao.xml"/>
27     </mappers>
28 </configuration>
  1. 在resources文件夹中导入log4j.properties文件
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 
 3 <!DOCTYPE log4j:configuration SYSTEM
 4         "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
 5 <log4j:configuration debug="true">
 6     <appender name="log.console" class="org.apache.log4j.ConsoleAppender">
 7         <layout class="org.apache.log4j.PatternLayout">
 8             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} %5p (%C{1}:%M) - %m%n" />
 9         </layout>
10     </appender>
11     <!-- -->
12     <logger name="org.apache.ibatis">
13         <level value="info" />
14         <appender-ref ref="log.console" />
15     </logger>
16 
17     <logger name="cn.kgc">
18         <level value="debug" />
19         <appender-ref ref="log.console" />
20     </logger>
21 </log4j:configuration>

  5.编写映射文件 IUserDao.xml ,位置在目录resource->sqlmap->User.xml

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
6 <mapper namespace="test">
7 </mapper>

  6.加载映射文件,将User.xml添加在SqlMapConfig.xml下

1 <mappers>
2     <mapper resource="sqlmao/User.xml"/>
3 </mappers>
  1. 编写测试类:在test->java目录下创建测试类com.ben.test.MybatisTest。实现业务需求,共7步,其中2,3步可以合在一起。
1 1. 加载核心配置文件SqlMapConfig.xml
2 2. 创建SqlSessionFactoryBuilder对象
3 3. 创建SqlSessionFactory对象(2,3可以写一起)
4 4. 创建SqlSession对象
5 5. 执行SqlSession对象执行查询,获取结果User
6 6. 打印结果
7 7. 释放资源
package com.ben.test;

import com.ben.domain.User;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: MybatisTest
 * @author: benjamin
 * @version: 1.0
 * @description: TODO
 * @createTime: 2019/07/13/11:50
 */

public class MybatisTest {
    public static void main(String[] args) {


    }
    //通过Id查询一个用户
    @Test
    public void testSearchById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行Sql语句
        User user = session.selectOne("test.findUserById", 10);
        //5. 打印结果
        System.out.println(user);
        //6.释放资源
        session.close();
        in.close();
    }

    //根据用户名模糊查询用户列表
    @Test
    public void testFindUserByUsername() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行Sql语句
        List<User> list = session.selectList("test.findUserByUsername", "王");
        //5. 打印结果
        for (User user:list) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }

    //添加用户
    @Test
    public void testInsertUser() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        User user = new User();
        user.setUsername("小强");
        user.setBirthday(new Date());
        user.setAddress("sadfsafsafs");
        user.setSex("2");
        int i = sqlSession.insert("test.insertUser", user);
        sqlSession.commit();
        //5. 打印结果
        // 刚保存用户,此时用户ID需要返回。执行完上面insert程序后,此时就能知道用户的ID是多少
        // 需要在User.xml文件中配置
        System.out.println("插入id:"+user.getId());//插入id:30

        //6.释放资源
        sqlSession.close();
        in.close();
    }
    //更新用户
    @Test
    public void testUpdateUserById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        User user = new User();
        user.setId(27);
        user.setUsername("小小");
        user.setBirthday(new Date());
        user.setAddress("西安市");
        user.setSex("1");
        int i = sqlSession.insert("test.updateUserById", user);
        sqlSession.commit();
        //5. 打印结果
        System.out.println(user.getId());
        //6.释放资源
        sqlSession.close();
        in.close();
    }
    //删除用户
    @Test
    public void testDeleteUserById() throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.执行Sql语句
        int i = sqlSession.insert("test.deleteUserById", 32);
        sqlSession.commit();
        //5. 打印结果
        System.out.println(i);
        //6.释放资源
        sqlSession.close();
        in.close();
    }
}
  1. 配置映射配置文件User.xml
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <!--namespace:用来区别不同的类的名字 -->
     6 <mapper namespace="test">
     7 
     8     <!-- 通过Id查询一个用户   -->
     9     <select id="findUserById" parameterType="Integer" resultType="com.ben.domain.User">
    10         select * from user where id = #{v}
    11     </select>
    12 
    13     <!-- 根据用户名模糊查询用户列表 -->
    14     <!--    select * from user where username like '%${value}%'-->
    15 <!-- select * from user where username like "%"#{value}"%"-->
    16     <select id="findUserByUsername" parameterType="String" resultType="com.ben.domain.User">
    17         select * from user where username like #{username}
    18     </select>
    19     <!--  添加用户  -->
    20     <insert id="insertUser" parameterType="com.ben.domain.User">
    21         <selectKey keyProperty="id" resultType="Integer" order="AFTER">
    22             select LAST_INSERT_ID()
    23         </selectKey>
    24         insert into user (username,birthday,address,sex) values(#{username},#{birthday},#{address},#{sex})
    25     </insert>
    26     <!-- 更新用户 -->
    27     <update id="updateUserById" parameterType="com.ben.domain.User">
    28         update user
    29         set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}
    30         where id = #{id}
    31     </update>
    32     <!-- 删除用户   -->
    33     <delete id="deleteUserById" parameterType="Integer">
    34         delete from user
    35         where id = #{vvvvv}
    36     </delete>
    37 </mapper>


mybatis官网:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
原文地址:https://www.cnblogs.com/gnos/p/13372156.html