您的位置:首页 > 大数据 > 人工智能

Mybaits深入了解(三)----mybatis开发Dao的方法

2016-07-16 22:37 489 查看

原始dao开发方法

程序员写代码的时候,需要写
dao
接口和
dao
实现类。而且还需要向dao实现类中注入
SqlSessionFactory
,在方法体内通过
SqlSessionFactory
创建
SqlSession
。下面举个栗子:

dao的接口

package cn.itcast.mybatis.dao;

import java.util.List;

import cn.itcast.mybatis.po.User;

/**
* dao接口,用户管理
* @author Administrator
*
*/
public interface UserDao {

//根据Id查询用户信息
public User findUserById(int id) throws Exception;

//根据用户名查询用户列表
public List<User> findUserByName(String name) throws Exception;

//添加用户信息
public void insertUser(User user) throws Exception;

//删除用户信息
public void deleteUser(int id) throws Exception;

}

dao的实现类

package cn.itcast.mybatis.dao;

/**
* dao接口实现类
*/
import java.util.Date;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import cn.itcast.mybatis.mapper.UserMapper;
import cn.itcast.mybatis.po.User;

public class UserDaoImpl implements UserDao {

//需要向dao实现类中注入SqlSessionFactory
//这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}

public User findUserById(int id) throws Exception {

SqlSession sqlSession=sqlSessionFactory.openSession();
User user=sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return user;
}

public List<User> findUserByName(String name) throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> list=sqlSession.selectList("test.findUserByName",name);
sqlSession.close();
return list;
}

public void insertUser(User user) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();

sqlSession.insert("test.insertUser",user);

//提交事务
sqlSession.commit();
sqlSession.close();
}

public void deleteUser(int id) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();

sqlSession.insert("test.deleteUser",id);

//提交事务
sqlSession.commit();
sqlSession.close();

}

}

测试程序

package cn.itcast.mybatis.dao;

import static org.junit.Assert.*;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.itcast.mybatis.po.User;

public class UserDaoImplTest {

private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//配置文件
String resource="SqlMapConfig.xml";

//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
// 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testFindUserById() throws Exception{
//构造UserDao对象
UserDao userDao=new UserDaoImpl(sqlSessionFactory);
//调用UserDao的方法
User user=userDao.findUserById(1);

System.out.println(user);
}

}


原始dao开发问题

在dao的接口实现类中出现大量的模板方法,比如上面的例子中每个方法中都有opensession,closesession的方法。
调用SqlSession方法时,将statement的Id硬编码了,每个方法中都需要写statement Id,如果名称发生变化,不利于修改。
调用SqlSession方法时,由于sqlSession的方法(selectOne,selectList…)使用泛型,即使传入的变量类型错误,在编译阶段也不报错。不利于开发。

Mapper代理方法

Mapper接口开发方法只需要开发Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体,同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

以上的规范主要是对下边的代码进行统一生成:

<code class="hljs sql has-numbering">User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.<span class="hljs-operator"><span class="hljs-keyword">insert</span>(<span class="hljs-string">"test.insertUser"</span>, <span class="hljs-keyword">user</span>);</span></code>

Mapper.xml(映射文件)

定义
mapper
映射文件
UserMapper.xml
(内容同Users.xml),需要修改
namespace
的值为
UserMapper
接口路径。将
UserMapper.xml
放在
classpath

mapper
目录 下。

<?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 namespace="cn.itcast.mybatis.mapper.UserMapper">


Mapper.java(接口文档)

/**
* 用户管理mapper
*/
Public interface UserMapper {
//根据用户id查询用户信息
public User findUserById(int id) throws Exception;
//查询用户列表
public List<User> findUserByUsername(String username) throws Exception;
//添加用户信息
public void insertUser(User user)throws Exception;
}
接口的定义有如下特点:

Mapper接口方法名和Mapper.xml中定义的statement的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

加载UserMapper.xml文件

修改SqlMapConfig.xml文件:

<!-- 加载映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>

测试

Public class UserMapperTest extends TestCase {

private SqlSessionFactory sqlSessionFactory;

protected void setUp() throws Exception {
//mybatis配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder创建sessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

Public void testFindUserById() throws Exception {
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//调用代理对象方法
User user = userMapper.findUserById(1);
System.out.println(user);
//关闭session
session.close();

}
@Test
public void testFindUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findUserByUsername("张");
System.out.println(list.size());

}
Public void testInsertUser() throws Exception {
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//要添加的数据
User user = new User();
user.setUsername("张三");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("北京市");
//通过mapper接口添加用户
userMapper.insertUser(user);
//提交
session.commit();
//关闭session
session.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: