• 第二篇 mybatis的入门


    一、搭建环境            

               博主之前,一直使用eclipse工具,后来,发现大多小伙伴都使用idea了,所以决定也买一个学习使用,以后的博客中也会idea为主要开发工具,首先,创建一个mybatisDemo工程,

          引入mybatis的jar 包,和 log4j的jar,pom.xml,如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.fan</groupId>
        <artifactId>mybatisDemo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.26</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
    </project>

    在resource资源目录下创建mybatisConfig.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" >
    <configuration>
        <settings>
            <!-- 配置 log4j 日志框架,主要方便查看sql-->
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <!-- 配置环境参数,可以配置开发环境和生产环境,默认是配置开发环境 -->
        <environments default="development">
            <!-- 实际上是配置SqlSessionFactory,一个数据库只能对应一个SqlSessionFactory,即environment-->
            <environment id="development">
                <!-- 配置事务管理为JDBC -->
                <transactionManager type="JDBC"></transactionManager>
                <!-- 配置数据源 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                    <property name="username" value="root"/>
                    <property name="password" value="www1928..com"/>
                </dataSource>
            </environment>
        </environments>
        <!-- 配置映射器文件 -->
        <mappers>
            <mapper resource="mapper/UserMapper.xml"/>
        </mappers>
    </configuration>

    environments配置:

           在该文件中主要配置environments(环境)环境可以配置开发环境或者生产环境或者其他环境,实际上是配置SqlSessionFactory,每一个environment对应一个SqlSessionFactory,
    一个SqlSessionFactory只能对应一个数据库,配置多个数据库就配置多个environment。在environment中需要配置transactionManager(事务管理)和dataSource(数据源)两个属性

    事务配置:
           mybatis的事务管理有JDBC和MANAGED两种,JDBC直接使用了JDBC事务的提交和回滚,依赖于从数据源得到的连接来管理事务作用域。MANAGED这个配置几乎没做什么。
    它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为

    数据源配置:
    dataSource的type属性有UNPOOLED,POOLED,JNDI有三种:
    UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。
                          不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形
    POOLED:  这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
    JNDI:    这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

    映射器配置:

    <mapper/>主要是配置映射器文件

    在resource资源目录下创建UserMapper.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">
    <mapper namespace="UserMapper">
          <select id="getUserByName" resultType="map">
              SELECT  * FROM USER WHERE NAME = #{NAME}
          </select>
    </mapper>

            namespace属性主要是为了区分隔离不同的映射器文件,命名可随意,但是在代理模式中,必须是和接口名相同,在映射器中,有四种操作:select,insert,delete,update ,
    每一个操作都有一个唯一id用来隔离同一个namespace中不同的SQL,

    二、Mybatis的开发模式

    (1)传统模式
           先建立UserDao接口和它的实现类,如下然后,建立一个service服务调用Dao层接口
    工程目录:

    userDao接口:

    package com.fan.mybatisdemo.dao;
    
    import java.util.Map;
    
    public interface UserDao {
        public Map<String, Object> getUserInfoByName(String name);
    }

    userDaoImpl类:

    import com.fan.mybatisdemo.service.UserService;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class UserDaoImpl implements UserDao{
    
        public Map<String, Object> getUserInfoByName(String name) {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(UserService.class.getClassLoader().getResourceAsStream("mybatis/mybatisConfig.xml"));
            SqlSession sqlSession = sqlSessionFactory.openSession();
            Map<String, Object> paramMap = new HashMap<String, Object>(8);
            paramMap.put("NAME","zhangqian");
            Map<String, Object> userInfoMap = sqlSession.selectOne("UserMapper.getUserByName",paramMap);
            Iterator<Map.Entry<String, Object>> iterator = userInfoMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, Object> entry = iterator.next();
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
            sqlSession.close();
            return null;
        }
    }

    UserMapper.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">
    <mapper namespace="UserMapper">
          <select id="getUserByName" resultType="map">
              SELECT  * FROM USER WHERE NAME = #{NAME}
          </select>
    </mapper>

    Service类:

    public class UserService {
         public static void main(String[] args) {
               SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(UserService.class.getClassLoader().getResourceAsStream("mybatis/mybatisConfig.xml"));
               SqlSession sqlSession = sqlSessionFactory.openSession();
               Map<String, Object> paramMap = new HashMap<String, Object>(8);
               paramMap.put("NAME","zhangqian");
               Map<String, Object> userInfoMap = sqlSession.selectOne("UserMapper.getUserByName",paramMap);
               Iterator<Map.Entry<String, Object>> iterator = userInfoMap.entrySet().iterator();
               while (iterator.hasNext()) {
                 Map.Entry<String, Object> entry = iterator.next();
                 System.out.println(entry.getKey() + ":" + entry.getValue());
               }
               sqlSession.close();
         }
    }

    执行结果:

    DEBUG [main] - Created connection 2114650936.
    DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7e0b0338]
    DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE NAME = ? 
    DEBUG [main] - ==> Parameters: zhangqian(String)
    DEBUG [main] - <==      Total: 1
    name:zhangqian
    age:22

        由于一直是写demo,所以追求简单,都是用map代替pojo去接收结果集,上面的传统模式开发,我们需要使用sqlSession的方法,传入xml文件的namespace和下面id就能获取到结果,就拿selectOne放

    还需要我们封装参数,传入该方法,所以对于dao层开发来说,依然需要手动去实现dao接口和实现类,所以代码还是相对有点多。

    (2)代理模式
           代理模式中,dao接口不需要手动去实现,有mybatis代理实现,但是需要保证以下,规则,namespace的命名必须和接口名一致,select等操作的id命名必须和接口方法名一致,
    由于,代理模式更方便,开发维护更简单,所以现在开发中基本不会使用传统模式。

    首先,建立一个UserMapper接口,命名和UserMapper.xml一致

    UserMapper接口:

    package com.fan.mybatisdemo.mapper;
    
    import org.apache.ibatis.annotations.Param;
    
    import java.util.Map;
    
    public interface UserMapper {
        public Map<String, Object> getUserByName(@Param("NAME") String name);
    }

    UserMapper.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">
    <mapper namespace="com.fan.mybatisdemo.mapper.UserMapper">
          <select id="getUserByName" resultType="map">
              SELECT  * FROM USER WHERE NAME = #{NAME}
          </select>
    </mapper>

    Service类:

    public class UserService {
         public static void main(String[] args) {
    
             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(UserService.class.getClassLoader().getResourceAsStream("mybatis/mybatisConfig.xml"));
             SqlSession sqlSession = sqlSessionFactory.openSession();
             UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
             Map<String, Object> userInfoMap = userMapper.getUserByName("zhangqian");
             Iterator<Map.Entry<String, Object>> iterator = userInfoMap.entrySet().iterator();
             while (iterator.hasNext()) {
                 Map.Entry<String, Object> entry = iterator.next();
                 System.out.println(entry.getKey() + ":" + entry.getValue());
             }
             sqlSession.close();
    }

    执行结果:

    DEBUG [main] - Opening JDBC Connection
    DEBUG [main] - Created connection 989938643.
    DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3b0143d3]
    DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE NAME = ? 
    DEBUG [main] - ==> Parameters: zhangqian(String)
    DEBUG [main] - <==      Total: 1
    name:zhangqian
    age:22

          对于代理模式的实现原理,会在后面的文章中深入,先学会使用,由于代理模式的方便,特别是集成到Spring环境中以后,SqlSessionFactory和SqlSession都会由Spring管理,所以mybatis的代码量会更少

    使用更简单,所以,现在mybatis基本不会使用传统模式开发

  • 相关阅读:
    博客园侧边栏添加QQ链接
    通俗易懂的理解 Redux(知乎)
    Redux生态系统
    ReactNative环境搭建
    cordova插件开发
    java类初始化
    Cordova指令
    安卓中如何调用jni
    JNI开发的常见错误
    JNI-java native interface(java本地接口)
  • 原文地址:https://www.cnblogs.com/zhexuejun/p/11194504.html
Copyright © 2020-2023  润新知