第二篇 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基本不会使用传统模式开发

 

posted @ 2019-07-19 16:39  哲雪君!  阅读(327)  评论(0编辑  收藏  举报