欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL映射器Mapper接口(MyBatis)

程序员文章站 2022-06-14 17:33:46
SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。 注意事项: 1.接口必须以Mapper结尾,名字是DomainMapper 2.mapper.xml文件要和Mapper接口建立关系,通过namespace ......

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=密码

 

  可能遇到的错误:

 SQL映射器Mapper接口(MyBatis)

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

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

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