mybatis开发dao的方法

mybatis开发dao的方法

1.1     SqlSession使用范围

1.1.1     SqlSessionFactoryBuilder

1     //以流的方式读取总的配置文件
2     Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
3
4     //生成SqlSessionFactory
5     SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
6
7     //从SqlSessionFactory中获得SqlSession
8     SqlSession session = sqlSessionFactory.openSession();

通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。

在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

1.1.2     SqlSessionFactory

通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。

将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

1.1.3     SqlSession

SqlSession是一个面向用户(程序员)的接口。

SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。

SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

SqlSession最佳应用场合在方法体内,定义成局部变量使用。

1.2     原始dao开发方法(程序员需要写dao接口和dao实现类)

1.2.1     思路

程序员需要写dao接口和dao实现类。

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

1.2.2     dao接口

 1 public interface UserDao {
 2
 3     //根据id查询用户信息
 4     public User findUserById(int id) throws Exception;
 5
 6     //根据用户名列查询用户列表
 7     public List<User> findUserByName(String name) throws Exception;
 8
 9     //添加用户信息
10     public void insertUser(User user) throws Exception;
11
12     //删除用户信息
13     public void deleteUser(int id) throws Exception;
14
15 }

1.2.3     dao接口实现类

 1 public class UserDaoImpl implements UserDao {
 2
 3    // 需要向dao实现类中注入SqlSessionFactory
 4
 5    // 这里通过构造方法注入
 6    private SqlSessionFactory sqlSessionFactory;
 7
 8    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
 9       this.sqlSessionFactory = sqlSessionFactory;
10
11    }
12
13    @Override
14    public User findUserById(int id) throws Exception {
15       SqlSession sqlSession = sqlSessionFactory.openSession();
16
17       User user = sqlSession.selectOne("test.findUserById", id);
18
19       // 释放资源
20       sqlSession.close();
21
22       return user;
23
24    }
25
26    @Override
27    public void insertUser(User user) throws Exception {
28
29       SqlSession sqlSession = sqlSessionFactory.openSession();
30
31       //执行插入操作
32       sqlSession.insert("test.insertUser", user);
33
34       // 提交事务
35       sqlSession.commit();
36
37       // 释放资源
38       sqlSession.close();
39
40    }
41
42    @Override
43    public void deleteUser(int id) throws Exception {
44       SqlSession sqlSession = sqlSessionFactory.openSession();
45
46       //执行插入操作
47       sqlSession.delete("test.deleteUser", id);
48
49       // 提交事务
50       sqlSession.commit();
51
52
53       // 释放资源
54       sqlSession.close();
55
56    }
57
58 }

1.2.4     测试代码:

 1 public class UserDaoImplTest {
 2
 3     private SqlSessionFactory sqlSessionFactory;
 4
 5     // 此方法是在执行testFindUserById之前执行
 6     @Before
 7     public void setUp() throws Exception {
 8         // 创建sqlSessionFactory
 9
10         // mybatis配置文件
11         String resource = "SqlMapConfig.xml";
12         // 得到配置文件流
13         InputStream inputStream = Resources.getResourceAsStream(resource);
14
15         // 创建会话工厂,传入mybatis的配置文件信息
16         sqlSessionFactory = new SqlSessionFactoryBuilder()
17                 .build(inputStream);
18     }
19
20     @Test
21     public void testFindUserById() throws Exception {
22         // 创建UserDao的对象
23         UserDao userDao = new UserDaoImpl(sqlSessionFactory);
24
25         // 调用UserDao的方法
26         User user = userDao.findUserById(1);
27
28         System.out.println(user);
29     }
30
31 }

1.2.5     总结原始 dao开发问题

1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

2、调用sqlsession方法时将statement的id硬编码了

3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

1.3     mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

1.3.1     思路(mapper代理开发规范)

程序员还需要编写mapper.xml映射文件

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

总结:

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

User user = sqlSession.selectOne("test.findUserById", id);

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

。。。。

1.3.2     UserMapper.java

1.3.3     UserMapper.xml

1.3.4     在SqlMapConfig.xml中加载mapper.xml

1.3.5     测试

 1     private SqlSessionFactory sqlSessionFactory;
 2
 3     // 此方法是在执行testFindUserById之前执行
 4     @Before
 5     public void setUp() throws Exception {
 6         // 创建sqlSessionFactory
 7
 8         // mybatis配置文件
 9         String resource = "SqlMapConfig.xml";
10         // 得到配置文件流
11         InputStream inputStream = Resources.getResourceAsStream(resource);
12
13         // 创建会话工厂,传入mybatis的配置文件信息
14         sqlSessionFactory = new SqlSessionFactoryBuilder()
15                 .build(inputStream);
16     }
17     @Test
18     public void testFindUserById() throws Exception {
19
20         SqlSession sqlSession = sqlSessionFactory.openSession();
21
22         //创建UserMapper对象,mybatis自动生成mapper代理对象
23         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
24
25         //调用userMapper的方法
26
27         User user = userMapper.findUserById(1);
28
29         System.out.println(user);
30
31
32     }
33     //用户信息的综合 查询

1.3.6     一些问题总结

1.3.6.1              代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

1.3.6.2              mapper接口方法参数只能有一个是否影响系统 开发

mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统 框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)

时间: 11-02

mybatis开发dao的方法的相关文章

MyBatis开发Dao

MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要)

mybatis系列-04-mybatis开发dao的方法

4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder. 在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可. 4.1.2    

【MyBatis学习04】mapper代理方法开发dao

上一篇博文总结了mybatis使用 原始dao的方法存在的一些弊端,我们肯定不会去用它,那么mybatis中该如何开发dao呢?如题所述,这篇博文主要来总结一下使用mapper代理的方法来开发dao的步骤. 使用mapper代理的方法来开发dao时,程序员只需要干两件事即可: 需要编写mapper.xml映射文件 需要编写mapper接口(相当于dao接口) 从做的工作来看,使用mybatis中使用mapper代理来开发dao会很方便,完全不需要我们去写具体的实现类,只需要写出接口即可,但是接口

基于Mybatis的Dao层的开发

基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量. SqlSessionFactory是一个接口,接口中定义了openSession

MyBatis的Dao层注入SqlSession

有点坑爹,以前没用过Mybatis,最近才用,而且一直用Mybatis推荐的接口映射的方式,但是今天有人告诉我接口方式用得少,大多还是采用从配置文件里面读sql的方式,当然接口也是类似的,都是利用mapper.xml. 于是就想把这东西整合进来,当进行dao的时候发现一个小问题,sqlSession怎么注入进来的问题,以前Hibernate的的习惯用sessionFactory的openSession()方法,但是每个方法都要open一下,麻烦,就想能不能直接把sqlSession通过注解注入进

转:spring与mybatis三种整合方法

哎,csdn没转载功能,只能复制了.. 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接http://code.google.com/p/mybatis/下载到. 1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.  (1)Spring配置文件: <!-- 引入jdbc配置文件 -->     <context:property

Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法

Xcode5.1默认不支持iOS5版本的模拟器开发调试,在OS X Mavericks(10.9.x)下默认只能支持iOS6.1及以上版本的模拟器,在OS X Mountain Lion(10.8.x)下默认只能支持iOS6.0及以上版本的模拟器进行开发和调试,在此条件之下的版本只能使用硬件设备进行开发调试.虽然现在低版本的iOS设备越来越少了,但是有时客户的需求可能会要求我们一定要兼容iOS5(或更低版本)及以上版本,如果我们手头找不到低版本硬件设备用于调试或者完全使用硬件设备而没有对应的模拟

C#脱离Halcon编程开发环境使用方法

在没有安装Halcon开发程序(HDevelop (SSE2))的电脑上面编程,使C#脱离Halcon编程开发环境使用方法,除了按照Halcon与编程环境必须要做的设置步骤外,还需要做如下两个工作: 1. 必须将halcon.dll  halcondotnet.dll   license 三个文件库复制到工程文件运行目录下,即(\bin\Debug目录下):(注:另外halcon.dll库文件也可以复制到C:\WINDOWS目录下) 2. 然后创建C:\Program Files\MVTec\h

mybatis(基于annotation的方法知道就行了)

MyBatisUtil.java UserMapper.java package edu.hhxy.btais.util; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFacto