zoukankan      html  css  js  c++  java
  • Mybatis(1)入门

    1.MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

    2. Mybatis基本思想:

    从 XML 中构建 SqlSessionFactory—>由该sessionFactory构建出session—>在session中完成CRUD操作和事务提交—>最后关闭session

    每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。 SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以从 XML 配置文件,或从 Configuration 类的习惯准备的实例中构建 SqlSessionFactory 对象。

    java中的实体对象与数据库表之间有mapping配置文件,一般用xml文件(如下例中的User.xml)

    3. 范围和生命周期 解每个对象的生命周期是非常重要的,不正确的使用他们会导致严重的并发问题(Mybatis官网文档)

    SqlSessionFactoryBuilder:
    这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需要存在了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量,就是局部变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例, 但是最好的方式是不需要保持它一直存在来保证所有 XML 解析资源,因为还有更重要的事情要做。

    SqlSessionFactory

    一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到, 最简单的就是使用单例模式或者静态单例模式。

    sqlSession

    每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将 SqlSession 实例的引用放在任何类型的管理范围中, 比如 Serlvet 架构中的 HttpSession。如果你现在正用任意的 Web 框架, 要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围内。换句话说,基于收到的 HTTP 请求,你可以打开了一个 SqlSession,然后返回响应,就可以关闭它了。关闭 Session 很重要,你应该确保使用 finally 块来关闭它。下面的示例就是一个确保 SqlSession 关闭的基本模式:

    SqlSession session = sqlSessionFactory.openSession();
    try {
      // do work
    } finally {
      session.close();
    }

    在你的代码中一贯地使用这种模式, 将会保证所有数据库资源都正确地关闭 (假设你没有通过你自己的连接关闭,这会给 MyBatis 造成一种迹象表明你要自己管理连接资源) 。

    Mapper 实例

    映射器是你创建绑定映射语句的接口。映射器接口的实例可以从 SqlSession 中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和 SqlSession 是相同的。然而, 映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和 SqlSession 相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。下面的示例就展示了这个实践:

    SqlSession session = sqlSessionFactory.openSession();
    try {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      // do work
    } finally {
      session.close();
    }
    

    4.以下: 入门DEMO

    步骤1: 搭建环境,官网下载mybatis-3.2.5.jar,mysql-connector-java-5.1.6-bin.jar,同时创建数据库(mybatis_test)及表(tb_user),表结构如下图,数据库utf8编码

    image

    步骤2:创建web工程或java工程,导入jar包

    步骤3:创建用户实体类User.java

    import java.io.Serializable;
    
    public class User implements Serializable
    {
        private static final long serialVersionUID = -7046683390941420236L;
        private int id;
        private String userName;
        private String userAddress;
        private int userAge;
        public User()
        {
    
        }
      //set,get方法省略
    }

    步骤4. 创建Configuration.xml文件 (官网建议通过该配置文件的方式创建SessionFactory, 该XML 配置文件是Mybatis的核心配置文件, 包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器

    <?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>
        <typeAliases>
            <!-- 这个别名非常重要,在User.xml中的resultType对应这里 -->
            <typeAlias alias="User"  type="com.mybatis.entity.User"/>
        </typeAliases>
        
        <environments default="development">
            <environment id="development">
            <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_test" />
                <property name="username" value="root"/>
                <property name="password" value="tiger"/>
                </dataSource>
            </environment>
        </environments>
        
        <mappers>
            <!-- 这个包含的要映射的实体的路径不要写错(com.rr.entity这种方式就是错的) -->
            <mapper resource="com/mybatis/entity/User.xml"/>
        </mappers>
        
        
    </configuration>

    步骤4. 创建java实体对应的映射文件(User.xml)

    <?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">
    
    <!-- 它定义了一个名为“selectUserByID”的映射语句,这 样它允许你使用完全限定名 
     “com.mybatis.entity.UserMapper.selectUserByID"来调用映射语句,在测试类中你将看到这种用法
    这里的namespace这样写不要感到疑惑,也不要考虑该路径是否存在,他只是一个名字,只是为了确保唯一性.
    -->
    
    <mapper namespace="com.mybatis.entity.UserMapper">
        <select id="selectUserByID" parameterType="int" resultType="User">
            select * from tb_user where id = #{id}
        </select>
       
    </mapper>

    步骤5, 开始测试类

    package com.mybatis.test;
    
    import java.io.IOException;
    import java.io.Reader;
    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 com.mybatis.entity.User;
    
    public class MybatisDemo
    {
        private static SqlSessionFactory sessionFactory=null;
        private static Reader reader=null;
        static
        {
            try
            {
                reader = Resources.getResourceAsReader("Configuration.xml");
                //从xml配置文件中构建sessionFactory
                sessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        
        private static SqlSessionFactory getSessionFactory()
        {
            return sessionFactory;
        }
        
        public static void main(String[] args)
        {
            SqlSession session = null;
            try
            {
                session = getSessionFactory().openSession();
                //这里就是调用了User.xml中定义的查询语句,查询了id为1的用户.
                User user = session.selectOne("com.mybatis.entity.UserMapper.selectUserByID",1);
                System.out.println(user.getUserName());
            } catch (Exception e)
            {
                e.printStackTrace();
            }finally
            {
                session.close();
            }
        }
    
    }

    整个项目结构如下图:

    image

     

  • 相关阅读:
    记一次Jquery学习引发的学习思考
    时间管理记录11.26
    介绍几个可视化数据结构和算法的网站
    不靠电脑打字真的能弄懂代码吗?
    记学习品优购网站案例中遇到的问题
    仿小米logo案例
    HTML学习案例-仿慕课网网页制作(二)
    一个“MacBook”新手的Python“笨办法”自学之旅 #第十章预告:逻辑关系、布尔表达式、if/elif/else语句、循环for语句、while语句、列表及其相关
    一个“MacBook”新手的Python“笨办法”自学之旅 #第八章:参数、解包和变量、提示和传递、读取文件、读写文件
    一个“MacBook”新手的Python“笨办法”自学之旅 #第六章:常用的简易Python命令、符号、代码、格式化字符串
  • 原文地址:https://www.cnblogs.com/david-rui/p/3603614.html
Copyright © 2011-2022 走看看