MyBatis使用Mapper动态代理开发Dao层
开发规范
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同原始Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
Mapper.xml文件中的namespace与mapper接口的类路径相同,即namespace必须是接口的全限定名。
Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同。
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。
使用mapper动态代理开发Dao案例
1)新建项目mybatis_demo02,导入所需jar包
2)在classpath下创建log4j.properties日志配置文件、db.properties数据库配置文件以及MyBatis的核心配置文件SqlMapConfig.xml
新建源码包config
log4j.properties内容:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
db.properties内容:
#mysql的驱动
driver=com.mysql.jdbc.Driver
#连接地址
url=jdbc:mysql://localhost:3306/spring_jdbc02?useUnicode=true&characterEncoding=UTF-8
#连接用户名
user=root
#连接密码
password=123456
#初始化数量
initsize=5
#最大数量
maxsize=15
SqlMapConfig.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>
</configuration>
3)在SqlMapConfig.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>
<!-- db.properties配置文件 -->
<properties resource="db.properties"/>
<!-- 和spring整合后environments配置将废除 -->
<environments default="development">
<environment id www.gcyl152.com="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value=http://www.michenggw.com/"${password}" />
</dataSource>
</environment>
</environments>
</configuration>、
4)新建包com.oak.po,在其中新建User
public class User www.furggw.com{
private Integer id;
private String name;
//方法略...
5)新建一个包com.www.huarenyl.cn oak.mapper,新建UserMapper接口,定义方法
public interface UserMapper {
/**
* 根据id查找用户
* @param id
* @return
*/
User findById(int id);
/**
* 根据姓名进行模糊查询
* @param name
* @return 所有满足条件的User信息
*/
List<User> findByName(String name);
/**
* 添加一条User信息
* @param user
*/
void add(User user);
6)UserMapper.xml映射文件
在config下新建一个普通包sqlmap,在其中新建UserMapper.xml映射文件
<?xml version="1.0" encoding=www.hjpt521.com"UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.oak.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="findById" parameterType="int" resultType="com.oak.po.User">
select * from `user` where id=#{id}
</select>
<!-- 根据名称模糊查询用户信息列表 -->
<select id="findUserByName" parameterType="String" resultType="com.oak.po.User">
select * from `user` where name like '${value}'
</select>
<!-- 添加一条信息 返回自动增长主键 -->
<insert id="add" parameterType="com.oak.po.User">
insert into `user` values(null,#{name})
</insert>
</mapper>
Mapper接口开发规范(以上4条):
7)加载UserMapper.xml映射文件
在SqlMapConfig.xml文件添加如下配置:
<!-- 加载mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/UserMapper.xml"/>
</mappers>
8)测试
在com.oak.test中编写写测试类UserTest:
public class UserTest {
// 工厂对象一般在我们的系统中是单例的
private SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws IOException{
// 第一步,创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 第二步,加载配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 第三步,创建SqlSessionFactory对象
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testFindById(){
//第四步 得到sqlSession,与Spring整合后省略
SqlSession sqlSession=sqlSessionFactory.openSession();
//获得代理对象(与Spring整合后只需要通过Spring容器拿到UserMapper接口的代理对象就行了)
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.findById(2);
System.out.println(user);
sqlSession.close();
查看结果:
小结
selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
MyBatis核心配置文件SqlMapConfig.xml配置内容
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
properties
如上案例:
<!-- 配置属性 -->
<properties resource="db.properties"/>
1
2
我们也可以在properties属性中使用property子标签来定义属性:
<!-- 配置属性 -->
<properties resource="db.properties">
<property name="driver" value="com.mysql.jdbc.Driver"/>
</properties>
MyBatis将按照下面的顺序来加载属性为:
在properties元素体内定义的属性首先被读取
然后会读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性
也就是说,此处通过property定义的属性名driver属性会被db.properties中同名的driver属性覆盖。
我们一般使用resource的方式加载属性。
typeAliases(类型别名)
mybatis支持别名:
别名 映射类型
_byte byte
_short short
_int int
_integer int
_long long
_float float
_double double
_boolean boolean
string String
byte Byte
short Short
int Integer
integer Integer
long Long
float Float
double Double
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
自定义别名
我们把上述案例中的com.oak.po.User类定义别名,以方便使用,在SqlMapConfig.xml中添加如下配置信息:
<!-- 配置User别名 -->
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias type="com.oak.po.User" alias="user"/>
</typeAliases>
在UserMapper.xml中使用别名:
<!-- 根据id获取用户信息 别名 不区分大小写-->
<select id="findById" parameterType="int"
resultType="User">
select * from `user` where id=#{id}
</select>
注意:resultType属性的值就是User类的别名,且别名是不区分大小写的。
给所有的po同时定义别名
可以给所有的po批量定义别名,别名就是类名且不区分大小写:
<typeAliases>
<!-- 批量别名定义,扫描包的形式创建别名,别名就是类名,且不区分大小写 -->
<package name="com.oak.po"/>
</typeAliases>
SqlMapConfig.xml文件加载mapper.xml文件
Mapper(映射器)配置的几种方法:
1)使用相对于类路径的资源:< mapper resource=" " />
2)使用mapper接口类路径:< mapper class=" " />
<!-- 加载mapper映射文件 -->
<mappers>
<mapper class="com.oak.mapper.UserMapper"/>
</mappers>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
3)注册指定包下的所有mapper接口:< package name=""/>
<!-- 加载mapper映射文件 -->
<mappers>
<!-- 要求与使用接口名加载配置相同 -->
<package name="com.oak.www.hjpt521.com mapper"/>
</mappers>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
虽然Mapper(映射器)配置有以上三种方法,但是实际开发中就用第三种方法。
MyBatis使用Mapper动态代理开发Dao层的更多相关文章
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- Mybatis(五)Spring整合Mybatis之mapper动态代理开发
要操作的数据库: IDEA创建的Java工程,目录结构如下: 一.导包 1.spring的jar包 2.Mybatis的jar包 3.Spring+mybatis的整合包. 4.Mysql的数据库驱动 ...
- 【Mybatis】-- Mapper动态代理开发注意事项
1.1. Mapper动态代理方式 1.1.1. 开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对 ...
- MyBatis使用mapper动态代理实现DAO接口
工具: mysql 5.5.62 IDEA 参考自:https://www.cnblogs.com/best/p/5688040.html 遇到的问题: 无法读取src/main/java下配置文 ...
- Mybatis框架三:DAO层开发、Mapper动态代理开发
这里是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下来做到了简单的增删改查:http://www.cnblogs.com/xuyiqi ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
- MyBatis - Mapper动态代理开发
Mapper接口开发方法编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发, ...
- Mybaits之Mapper动态代理开发
Mybaits之Mapper动态代理开发 开发规范: Mapper接口开发方法只需要程序员与Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法 ...
随机推荐
- P1838 三子棋I
题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 4 ...
- 外文翻译 《How we decide》被情感愚弄 第三节
本科论文答辩终于结束啦,一切都要继续回到正轨. 这是第三章章最后一节 书的导言 本章第二节 本章第一节 "信用卡是我的敌人."Herman Palmer这样说到.在平日,Herma ...
- Bootstrap基本理论
Bootstrap,来自 Twitter,是目前最受欢迎的前段框架.Bootstrap是基于HTML.CSS.JAVASCRIPT的,它简洁灵活,使得Web开发更加快捷 Bootstrap特点:优雅, ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- 【HEVC帧间预测论文】P1.3 Fast Inter-Frame Prediction Algorithm of HEVC Based on Graphic Information
基于图形信息的HEVC帧间预测快速算法/Fast Inter-Frame Prediction Algorithm of HEVC Based on Graphic Information <H ...
- Halcon学习笔记2
图像预处理 一般来说,我们采集到的图像会有一些小黑点,小斑点,不平滑等因素会会影响我们后期的算法,此时就需要我们对其图片进行预处理. 下面是一些预处理基本算子: 1.消除噪声:mean_image/b ...
- Python Linked List
上周日教导一个科班非技术的朋友学习 Python 编程.他的 Python 水平大概就是看了几篇短的 Python 介绍博客.会流程控制和全局函数编写. 具体教导思路是从自己实现一个链表出发,研究学习 ...
- Windows程序设计1(工具、编码、窗口)
一.几个常用小工具: 1. 编译器:CL.EXE 将源文件转变为目标文件(汇编语言). CL.EXE /c xxx.c 或 xx.cpp cl.exe -? 显示cl帮助 cl.exe ...
- SQLite -语法
SQLite -语法 SQLite是紧随其后的是独特的组称为语法的规则和指导方针.本教程为您提供了快速启动和SQLite的清单的所有基本SQLite语法. 大小写敏感性 注意重要的一点是,SQLite ...
- shift Alt + up(down) copy current line ! ctrl + j show the control # vscode key
shift Alt + up(down) copy current line ! ctrl + j show the control # vscode key