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)注册的路径也可能写错。

 

最新文章

  1. Less的使用
  2. linux安装Jenkins
  3. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木
  4. 【剑指offer 面试题16】反转链表
  5. gcc中不同namespace中同名class冲突时
  6. HDU 1004 Let the Balloon Rise【STL&lt;map&gt;】
  7. windows如何查看电脑开关机记录
  8. BZOJ 1195: [HNOI2006]最短母串
  9. springmvc StringHttpMessageConverter 中文乱码的几种解决办法(亲测)
  10. extundelete
  11. 一张图知道HTML5布局(图)
  12. 对Aspose.Cells Excel文件操作的扩展
  13. 看懂shebang吧,只需一点点shell知识,从此再也不犯强迫症
  14. 正则 js截取时间
  15. ROS节点理解--5
  16. Tornado源码分析 --- Etag实现
  17. CAT 安装运行配置教程
  18. 路径方案数_mod_SPFA_记忆化搜索_C++
  19. Oracle trunc函数使用
  20. C语言答案解析

热门文章

  1. sturts标签中
  2. 反编译pyinstaller打包的exe安装包
  3. 深度学习面试题28:标签平滑(Label smoothing)
  4. Ubuntu --- 安装deb包
  5. How to receive JSON as an MVC 5 action method parameter
  6. Spark(五十):使用JvisualVM监控Spark Executor JVM
  7. Java查询目录下的所有文件(包括子目录)
  8. Java逻辑分页代码
  9. web-linux-shell实现 阿里方案canvas+wss。
  10. Leetcode: Stream of Characters