zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    刷题总结——宠物收养所(bzoj1208)
    算法复习——trie树(poj2001)
    刷题总结——bzoj2243染色
    算法复习——虚树(消耗战bzoj2286)
    设置SSH自动登陆(免密码,用户名)
    自旋锁Spin lock与互斥锁Mutex的区别
    如何去除Linux文件的^M字符
    重构
    比赛日程安排
    基于libzip的简易压缩(zip)/解压缩(unzip)程序
  • 原文地址:https://www.cnblogs.com/gnos/p/13372156.html
Copyright © 2011-2022 走看看