mybatis 之二:开发dao的两种方式

前言

Dao层的开发,在mybatis中可以通过原始dao(一个接口和接口实现类),而在mybatis中可以更方便的通过mapper代理模式,当然需要满足一定的规范性原则

不多说,以一个增加user信息为例

一:首先在映射文件中写一个增加用户配置信息

1
2
3
4
5
6
7
8
<!-- 添加用户 -->
<!-- selectKey:查询主键,在标签内需要输入查询主键的sql -->
<!-- order:指定查询主键的sql和insert语句的执行顺序,相当于insert语句来说 -->
<!-- LAST_INSERT_ID:该函数是mysql的函数,获取自增主键的ID,它必须配合insert语句一起使用 -->
<insert id="insertuser" parameterType="com.zwl.pojo.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">select LAST_INSERT_ID()</selectKey>
insert into user values(#{id},#{name},#{age})
</insert>

注意:这里的插入中原表中主键有自增长,所以需要先获得主键,在增加,这是一个插入语句

二:dao接口及其实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface userdao {
//添加user
public void insertusers(User user) throws Exception;
}
Dao接口实现类
public class userdaoimpl implements userdao {
private SqlSessionFactory sqlSessionFactory;
//通过构造函数注入sqlSessionFactory
public userdaoimpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
@Override
public void insertusers(User user) throws Exception {
//通过线程安全方式获得sqlsession,实现增删该查操作
SqlSession sqlsession=sqlSessionFactory.openSession();
//注意这里的test是映射文件中的namespace,insertuser是id用于标识
sqlsession.insert("test.insertuser", user);
//添加操作需要提交事务
sqlsession.commit();
sqlsession.close();
}

编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//读取配置文件
//全局配置文件的路径
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建user
User u=new User();
u.setName("java");
u.setAge(18);
//调用dao层方法,实现添加功能
userdao dao=new userdaoimpl(sqlSessionFactory);
dao.insertusers(u);

这种原始dao方式,我们很熟悉,也很好理解,到时当方法多的时候,就会存在大量多余的重复编码问题

Mapper代理的开发模式
即开发mapper接口(相当于dao接口)
Mapper代理使用的是jdk的代理策略

还有一点是mapper代理最重要的,就是必须满足mapper代理的开发规范
1 mapper接口的全限定名要和mapper映射文件的namespace值一致
2 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。

下面以入门程序的通过id查询user为例
首先是修改映射文件,改名为UserMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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:命名空间,对statement的信息进行分类管理 -->
<!-- 注意:在mapper代理时,它具有特殊及重要的作用 -->
<mapper namespace="com.zwl.mapper.UserMapper">
<!-- 根据用户ID查询用户信息 -->
<!-- select:表示一个MappedStatement对象 -->
<!-- id:statement的唯一标示 -->
<!-- #{}:表示一个占位符? -->
<!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意 -->
<!-- parameterType:输入参数的java类型 -->
<!-- resultType:输出结果的所映射的java类型(单条结果所对应的java类型) -->
<select id="findUserById" parameterType="int"
resultType="com.zwl.pojo.User" >
select * from user where id=#{id}
</select>
</mapper>

上述的namespace需要和mapper接口的全限定名一致
然后是mapper接口开发(UserMapper.java)

1
2
3
4
5
6
7
package com.zwl.mapper;
import com.zwl.pojo.User;
public interface UserMapper {
public User findUserById(int id) throws Exception;
}

接下来是在配置文件中声明映射文件

1
2
3
<mappers>
<mapper resource="com/zwl/mapper/UserMapper.xml" />
</mappers>

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过mybatis的sqlsession来创建代理对象
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
User u=mapper.findUserById(1);
System.out.println(u.getName());
sqlSession.close();

最后的测试结果是取出数据库中id为1的helloworld

至此mapper代理开发dao完成,这里只给了一个简单的例子,总的来说,只要满足规范,就可以简化配置

热评文章