Mybatis--原始dao和mapper代理方法

  • SqlSessionFactoryBuilder
    通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

  • SqlSessionFactory
    通过SqlSessionFactory创建SqlSession;由于SqlSessionFactory是线程安全的,应该在应用执行期间都存在,所以在应用运行期间不要重复创建多次,建议使用单例模式。

  • SqlSession
    SqlSession是应用程序和持久层之间执行交互操作的一个单线程对象。SqlSession中提供了许多操作数据库的方法。
    SqlSession是线程不安全的。
    使用完SqlSession要确保在finally块中关闭它。

    原始dao接口开发

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

    dao接口

    1
    2
    3
    4
    5
    public interface UserDao {
    public User findUserById(int id) throws Exception;

    public List<User> findUserByName(String name) throws Exception;
    }

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
public class UserDaoImpl implements UserDao{

//使用构造方法注入SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;

public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
}

@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return user;
}

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

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test_2 {
private SqlSessionFactory sqlSessionFactory;

@Before
public void beforeTest() throws Exception{
//mybatis配置文件
String resource = "sqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testDao() throws Exception{
//创建UserDao的对象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(1);
System.out.println(user);
List<User> list = userDao.findUserByName("ho");
System.out.println(list);
}
}

总结原始dao开发问题

1.dao接口实现类方法中存在大量的模板方法。
2.调用SqlSession方法时传入参数硬编码。
3.由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不会报错,不利于程序员开发。


mapper代理方法

程序员只需要mapper接口(相当于dao接口)
程序员还需要编写mapper.xml映射文件
程序员编写mapper接口需要遵循一些开发规范,Mybatis可以自动生成mapper接口实现类代理对象。

开发规范

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

    1
    2
    3
    4
    5
    <!--
    namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
    注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址
    -->
    <mapper namespace="mapper.UserMapper">
  • mapper.java接口中的方法名和mapper.xml中statement的id一致

  • mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
  • mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。