本帖最后由 z_sir 于 2018-12-6 13:15 编辑
Mybatis入门案例(二)之Mapper代理开发模式1.前言
上以章节我们讲了传统DAO开发模式,即dao接口、daoImpl接口实现类,这种开发模式需要我们对接口实现,使用SqlSession提供的增删改查等方法对数据库操作,而Mybatis官方也提供了另外一种开发模式,即Mapper代理开发模式,此种模式与传统DAO开发模式相比,省去了接口实现层,而且开发效率提高了,接下来我们具体来看下Mapper代理开发模式的实现方式。
2.Mapper代理实现方式2.1 环境准备
JDK环境:jdk1.8
开发工具:IntelliJ IDEA
数据库环境:mysql5.1
Mybatis:3.4.5
2.2 mysql建表
[SQL] 纯文本查看 复制代码
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) ,
`password` varchar(20) ,
`age` int(11) ,
PRIMARY KEY (`id`)
)
2.3 Maven坐标
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 [url]http://maven.apache.org/xsd/maven-4.0.0[/url]
[url]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itcast</groupId>
<artifactId>Itcast_Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--mybatis核心坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql连接包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.4 目录结构图
注意:红色标框的两个地方必须结构相同
2.5 核心配置文件sqlConfig.xml注意:红色标框的两个地方必须结构相同
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8" ?>[/align]<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置环境-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"/>
<!--配置数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis08"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射文件的位置-->
<mappers>
<mapper resource="com/itheima/dao/UserMapper.xml"></mapper>
</mappers>
</configuration>
2.6 创建实体类User.java
[Java] 纯文本查看 复制代码 package com.itheima.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private Integer id;
private String username;
private String password;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.7 创建UserMapper.java接口
[Java] 纯文本查看 复制代码 package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface UserMapper {
//查询全部用户
public List<User> findAllUsers();
//根据ID查询
public User findUserById(Integer id);
//根据ID删除信息
public void deleteUserById(Integer id);
//根据ID修改User
public void updateUserById(User user);
//保存User
public void saveUser(User user);
}
注意:此时无需再创建接口实现层
2.8 创建UserMapper.xml映射配置文件
[HTML] 纯文本查看 复制代码 <?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">
<!--
namespace:命名空间,SQL区域块
如果使用传统DAO开发模式的话,则没有特殊要求(只要保证唯一即可)
如果是Mapper代理模式的话,则必须是接口的全限定名
此次式Mapper代理开发模式,所有namespace必须是接口的全限定类名
-->
<mapper namespace="com.itcast.dao.UserMapper">
<!--查询全部用户-->
<!--
id:唯一的标识
resultType:结果类型(输出类型)
parameterType:输入类型
#{}占位符
-->
<select id="findAllUsers" resultType="com.itheima.domain.User">
SELECT * FROM user
</select>
<!--根据ID查询-->
<select id="findUserById" parameterType="int" resultType="com.itheima.domain.User">
SELECT * FROM user WHERE id=#{uid}
</select>
<!--根据ID删除信息-->
<delete id="deleteUserById" parameterType="java.lang.Integer">
DELETE FROM user where id=#{uid}
</delete>
<!--根据ID修改User-->
<update id="updateUserById" parameterType="com.itheima.domain.User">
UPDATE user SET username=#{username},password=#{password},age=#{age} WHERE id=#{id}
</update>
<!--保存User-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
INSERT INTO user VALUES (id,#{username},#{paasword},#{age});
</insert>
</mapper>
3.Mapper代理开发模式需遵循的规范:
注意:因为是Mapper代理开发模式,所有习惯性接口名使用mapper结尾,例如:UserMapper.java
1.接口名与映射配置文件名一致
2.在IDEA开发工具中:接口的全限定类名与映射配置文件目录结构保持一致,如:结构图中所标示
3.映射配置文件中的namespace必须是对应接口的全限定类名
4.接口的方法名与映射文件中的statement对象ID一致
5.接口方法的返回值类型与映射文件中resultType类型一致
6.接口方法参数类型与映射文件中parameterType类型一致
注意:statement对象即映射配置文件中的每一个执行操作,比如:
<select id="findAllUsers" resultType="com.itheima.enity.User">
SELECT * FROM user
</select>等。
4.编写测试类Demo02.java
[Java] 纯文本查看 复制代码 package com.demo;
import com.itheima.dao.UserMapper;
import com.itheima.enity.User;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class Demo01 {
private UserMapper userMapper;
private InputStream is;
private SqlSession session;
@Before
public void init(){
//1.核心配置文件
String resource="sqlConfig.xml";
//2.读取核心配置文件
is= Resources.getResourceAsStream(resource);
/*3.创建SqlSessionFactory对象:SqlSessionFactory是接口,
* 所以使用SqlSessionFactoryBuilder对象build()构建SqlSessionFactory对象
*/
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(is);
//4.通过SqlSessionFactory对象获取SqlSession对象
session=factory.openSession();
//5.获取Mapper代理对象
userMapper=session.getMapper(UserMapper.class);
}
@After
public void destroy(){
//提交事务
session.commit();
//关闭is
is.close();
//关闭session
session.close();
}
//1.测试遍历用户
@Test
public void testFindAll() throws IOException {
List<User> list=userMapper.findAllUsers();
for (User u:list) {
System.out.println(u);
}
}
//2.测试根据ID查询
public void testFindUserById() throws IOException {
User user=userMapper.findUserById(1);
System.out.println(user);
}
//3.测试根据ID删除信息
public void testDeleteUserById() throws IOException {
userMapper.deleteUserById(2);
}
//4.测试根据ID修改User
public void testUpdateUserById() throws IOException {
User user=new User();
user.setId(1);
user.setUsername("itcast");
user.setPassword("123456");
user.setAge(18);
userMapper.updateUserById(user);
}
//5.测试保存用户
public void testSaveUser() throws IOException {
User user=new User();
user.setId(3);
user.setUsername("itcast6");
user.setPassword("123456");
user.setAge(18);
userMapper.saveUser(user);
}
}
至此,一套完整的Mapper代理开发模式已经初步完成,我们从中可以很明显的看出比传统的DAO模式简单。 两种开发模式各自有自己的有点: 传统DAO,结构清晰明了,有dao,有具体的dao实现类 Mapper,采取代理的方式,省去了dao实现类的编写,提高了开发效率,Mapper代理开发模式也是官方推荐使用的,而且我们后期开发也是采取Mapper代理模式 5.小结
代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
|