zoukankan      html  css  js  c++  java
  • SQL映射器Mapper接口(MyBatis)

    SQL映射器Mapper接口

      MyBatis基于代理机制,可以让我们无需再写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。

       注意事项:

      1.接口必须以Mapper结尾,名字是DomainMapper

      2.mapper.xml文件要和Mapper接口建立关系,通过namespace:要能连接到Mapper接口

      3.mapper.xml中写查询语句的标签的传入参数类型(parameterType)、返回结果类型(resultType)必须和mapper接口中对应方法的传入参数类型和返回结果类型一致,id名字必须和mapper接口中的对应方法名保持一致。 

    操作步骤:

    1、 创建一个DomainMapper接口:直接定义方法(共用了xml配置方式接口+注解方式两种)

    注意:映射器Mapper接口,替换dao层,不用再写mapper层(dao层)实现类;名字统一以Mapper结尾。

    package cn.wang._02mapper.mapper;
    
    import cn.wang._02mapper.domain.Product;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface ProductMapper {
       
        /**
         * 查询一个商品:使用了接口+注解的方式
         */
        @Select("select * from Product where id = #{id}")
        Product findOne(Long id);
        /**
         * 查询所有商品:使用了xml配置方式
         */
        List<Product> findAll();
    }

    2、 在mapper目录(原dao目录)下创建映射文件DomainMapper.xml(ProductMapper.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的主要功能就是写sql
        namespace:mapper接口的完全限定名,在mybatis映射器中是用来和映射器接口产生联系,而不再是和domain实体类联系
     -->
    <mapper namespace="cn.wang._02mapper.mapper.ProductMapper">
        <!--
            sql的id:mapper接口的对应方法名
            resultType和parameterType都和方法的参数和返回类型对应
    
            parameterType : 传入的参数类型(原本应该用的是全限定名,这里用的是别名)  long:大Long  _long:小long (具体的对应请参见文档)
            resultType : 返回的结果类型(每一条数据返回的对象类型) 自己的对象一定是全限定类名(这里写的是别名)
                    注意:xml配置方式和接口+注解方式两种方式不能同时对同一sql操作使用
         -->
        <!--查询一个-->
        <!--<select id="findOne" parameterType="long" resultType="cn.wang._02mapper.domain.Product">
            select * from product where id=#{id}
        </select>-->
        <!--查询所有-->
        <select id="findAll" resultType="cn.wang._02mapper.domain.Product">
            select * from product
        </select>
    
    
    </mapper>

    3、在resources目录下创建核心配置文件:

    <?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>
        <!-- environments:环境集合
            default:默认使用哪一个环境(必须对应一个环境的id)
         -->
    
        <!--引入外部的属性文件
            不写classpath的原因:resources默认到classpath中寻找资源
        -->
        <properties resource="jdbc.properties" />
    
        <!--
            配置自定义别名
            注意:别名不区分大小写。
               共两种配置方式:
                一:一个一个配置(typeAlias)
                        type 类型的完全限定名
                        alias 别名
                二:统一为某个包下的所有类起别名(package)
                        name : 包名,别名就是类名(不区分大小写)
        -->
        
    
        <environments default="development">
            <!--
                environment:一个环境  id:为这个环境取唯一一个id名称
            -->
            <environment id="development">
                <!--
                    transactionManager:事务管理(共有两个值) type:JDBC(支持事务)/MANAGED(什么都不做)
                -->
                <transactionManager type="JDBC" />
                <!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池
                         type="UNPOOLED" 不使用连接池
                        type="POOLED" 使用连接池
                        type="JNDI" 容器中使用
                 -->
                <dataSource type="POOLED">
                    <!-- 连接数据库的参数 -->
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <!-- 注册映射文件,这个mappers代表的是相应的ORM映射文件 -->
        <mappers>
            <mapper resource="cn/wang/_02mapper/mapper/ProductMapper.xml" />
        </mappers>
    
    </configuration>

    MybatisUtils工具类

    package cn.wang.Utils;
    
    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 java.io.Reader;
    
    public class MybatisUtils {
        //保证sqlSessionFactory是单例
        private static SqlSessionFactory sqlSessionFactory;
    
        // SqlSessionFactory类似于JPA的EntityManagerFactory,Hibernate的SessionFactory
        // SqlSession 类似于JPA的EntityManager,Hibernate的Session
    
        //该类被加载的时候就执行该静态代码块
        static {
            try {
                Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (Exception e) {//异常的类型要写大一些,才能够看到具体的报错
                e.printStackTrace();
            }
        }
        //提供一个外界调用的类
        public static SqlSession getSession(){
            //创建并返回SqlSession对象
            return sqlSessionFactory.openSession();
        }
        //关闭sqlSession,释放资源(很重要,不然项目上线后会造成内存溢出)
        public static void colseSession(SqlSession sqlSession){
            if(sqlSession !=null){
                sqlSession.close();
            }
        }
    }

    jdbc.properties文件

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///mysql数据库名称
    jdbc.username=用户名
    jdbc.password=密码

      可能遇到的错误:

     

        (1)namespace写错了,应该对应mapper接口的完全限定名。

        (2)Mapper映射文件忘记在核心配置文件中注册了。

        (3)注册的路径也可能写错。

     

  • 相关阅读:
    汉诺塔
    给出一个字符串,要求插入最少的字符,使得原字符串为一个回文串
    最长回文子串
    回文数 第N个回文数
    屋子里有1到100号100盏关闭的灯
    无头结点的单链表删除一个中间结点
    单链表逆转
    编程之美2.21 加法
    在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对
    斐波那契
  • 原文地址:https://www.cnblogs.com/wanghj-15/p/11186171.html
Copyright © 2011-2022 走看看