原始Dao开发方式**
原始Dao开发方法需要程序员编写Dao接口和Dao实现类。
1. 编写映射文件**
编写映射文件如下:(也可以使用入门程序完成的映射文件)
/p>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
resultType="com.gx.mybatis.pojo.User">
select * from user where id = #{id}
resultType="com.gx.mybatis.pojo.User">
select * from user where username like '%${value}%'
resultType="int">
SELECT 1576193
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
2. 编写Dao接口**
先进行DAO的接口开发,编码如下:
public interface UserDao {
/**根据id查询用户
*
*/
User queryUserById(int id);
/**根据用户名模糊查询用户
*
*/
List queryUserByUsername(String username);
/**保存用户
*
*/
void saveUser(User user);
}
3.编写Dao实现类**
编写的Dao实现类如下
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User queryUserById(int id) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行查询逻辑
User user = sqlSession.selectOne("queryUserById", id);
// 释放资源
sqlSession.close();
return user;
}
@Override
public List queryUserByUsername(String username) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行查询逻辑
List list = sqlSession.selectList("queryUserByUsername", username);
// 释放资源
sqlSession.close();
return list;
}
@Override
public void saveUser(User user) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行保存逻辑
sqlSession.insert("saveUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
}
4.编写Dao测试**
创建一个JUnit的测试类,对UserDao进行测试(充当main方法),测试代码如下:
public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
// 创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlsessionFactory
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() {
// 创建DAO
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 执行查询
User user = userDao.queryUserById(1);
System.out.println(user);
}
@Test
public void testQueryUserByUsername() {
// 创建DAO
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 执行查询
List list = userDao.queryUserByUsername("五");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testSaveUser() {
// 创建DAO
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 创建保存对象
User user = new User();
user.setUsername("孙尚香肠");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("蜀国");
// 执行保存
userDao.saveUser(user);
System.out.println(user);
}
}
Mapper动态代理方式**
1.定义Mapper.xml(映射文件)**
定义mapper映射文件UserMapper.xml 将UserMapper.xml放在config下mapper目录下,效果如下:
2、编写UserMapper.xml配置文件内容:**
/p>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
resultType="com.gx.mybatis.pojo.User">
select * from user where id = #{id}
resultType="com.gx.mybatis.pojo.User">
select * from user where username like '%${value}%'
resultType="int">
select 1576193
insert into user(username,birthday,sex,address) values
(#{username},#{birthday},#{sex},#{address});
3.编写UserMapper(接口文件)**
创建UserMapper接口代码如下:
public interface UserMapper {
/**根据id查询
*@param id
@return
*/
User queryUserById(int id);
/**根据用户名查询用户
*@param username
@return
*/
List queryUserByUsername(String username);
/**保存用户
*@param user
*/
void saveUser(User user);
}
4.加载UserMapper.xml文件**
修改SqlMapConfig.xml文件,添加以下所示的内容:
5.编写测试**
编写的测试方法如下:
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
// 创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlsessionFactory
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testQueryUserById() {
// 获取sqlSession,和spring整合后由spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询方法
User user = userMapper.queryUserById(1);
System.out.println(user);
// 和spring整合后由spring管理
sqlSession.close();
}
@Test
public void testQueryUserByUsername() {
// 获取sqlSession,和spring整合后由spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询方法
List list = userMapper.queryUserByUsername("五");
for (User user : list) {
System.out.println(user);
}
// 和spring整合后由spring管理
sqlSession.close();
}
@Test
public void testSaveUser() {
// 获取sqlSession,和spring整合后由spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 创建保存对象
User user = new User();
user.setUsername("刘备胎");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("鼠国");
// 执行查询方法
userMapper.saveUser(user);
System.out.println(user);
// 和spring整合后由spring管理
sqlSession.commit();
sqlSession.close();
}
}
总结**
优点**
使用数据访问对象的优点是应用程序的两个重要部分之间相对简单并严格分离,它们可以但不应该彼此了解任何东西,并且两者可预期的频繁和独立发展。改变业务逻辑可以依赖于相同的DAO接口,而对持久性逻辑的更改只要接口保持正确实现,就不会影响DAO客户端。存储的所有细节都隐藏在应用程序的其余部分中(见信息隐藏)。因此,可以修改一个DAO实现而不影响应用程序的其余部分,从而可能实现对持久性机制的更改。DAO充当了应用程序与数据库之间的中介,它们在对象与数据库记录之间来回转移数据。用测试替身取代DAO可以促进代码的单元测试,使测试不依赖于持久层。
在Java编程语言的非特定上下文中,数据访问对象作为一项设计概念可以用多种方式实现。这可以将应用程序中的数据访问部分分离为非常简单的接口,迁移到框架或商业产品。DAO编码范例可能需要一些技巧。像是Java Persistence API和Enterprise JavaBeans之类的技术已内置在应用程序服务器中,可以在JavaEE应用程序服务器的应用程序中使用。商业产品如TopLink可以在基于对象关系映射(ORM)的产品上使用。流行的开源ORM产品包括Doctrine (PHP))、Hibernate、iBATIS,以及JPA实现(例如Apache OpenJPA)。
缺点**
使用DAO的潜在缺点包括抽象泄漏、代码重复和抽象反演。尤其是将DAO作为常规Java对象的抽象会隐藏每个数据库访问的高成本,并且可能强迫开发人员触发多个数据库查询来检索普通SQL查询中一次就可取回的信息。如果一个应用程序需要多个DAO,人们可能发现自己对每个DAO重复基本上相同的创建、读取、更新和删除代码。不过,也可以实现一个处理常用操作的通用DAO来避免样板化代码。