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)注册的路径也可能写错。
SQL映射器Mapper接口(MyBatis)的更多相关文章
- Mybatis基于接口注解配置SQL映射器(一)
上文已经讲解了基于XML配置的SQL映射器,在XML配置的基础上MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码. Mybat ...
- MyBatis 3 使用注解配置SQL映射器
l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @Sel ...
- Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器
关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...
- MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...
- 使用注解配置SQL映射器
在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了. ...
- Mybatis基于XML配置SQL映射器(二)
Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档 sysUse ...
- MyBatis中映射器Mapper概述
MyBatis真正强大之处在于它的映射器.因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量 XML中顶级元素汇总 cache: 给定命名空间的缓存配置 ca ...
- MyBatis学习笔记3--使用XML配置SQL映射器
<resultMap type="Student" id="StudentResult"> <id property="id&quo ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
随机推荐
- LAMP企业架构读写分离
1.1 LAMP企业架构读写分离 LAMP+Discuz+Redis缓解了MYSQL的部分压力,但是如果访问量非常大,Redis缓存中第一次没有缓存数据,会导致MYSQL数据库压力增大,此时可以基于 ...
- (大型网站之Nginx)图解正向代理、反向代理、透明代理
一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(o ...
- CentOS下载与服务器版安装(VMware)
1. 下载 首先需要选择一个版本,因为华为云最新只提供了CentOS 7.6,所以要选择CentOS 7版本的. 官网只提供了最新的版本,而且服务器在国外,下载速度贼慢. 不过官方提供了分布在各个地区 ...
- python常用规范
Python代码规范和命名规范 前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 目录 一.简明概述 1.编码 如无特殊情况, 文件一 ...
- Qt 操作QDomDocument对象修改节点
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/liulihuo_gyh/article/d ...
- PHP用strtotime()函数比较两个时间的大小实例详解
在PHP开发中,我们经常会对两个时间的大小进行判断,但是,在PHP中,两个时间是不可以直接进行比较,因为时间是由年.月.日.时.分.秒组成的,所以,如果需要将两个时间进行比较的话,我们首先要做的就是将 ...
- Linux下通过nmap扫描局域网内设备,获取ip地址和mac地址
安装nmap sudo apt-get install nmap 扫描 sudo nmap -sP -PI -PT
- Java实现视频网站的视频上传、视频转码、及视频播放功能(ffmpeg)
视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpe ...
- oracle tablespace pctfree pctused
二.oracle pctfree和pctused详解 一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示 ...
- java泛型--问号?和T或E或K或V的区别
所谓泛型,就是在定义类.接口.方法.参数或成员变量的时候,指定它们操作对象的类型为通用类型. 使用 尖括号 <> 操作符 (The diamond operator )表示泛型, 尖括号内 ...