首页 > 代码库 > mybatis开发dao的方法

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方法中建议不要使用包装类型(不利于业务层的可扩展)

mybatis开发dao的方法