mybatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀的持久層的框架,是apache下的頂級項目。mybatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。mybatis可以使用簡單的XML或注解用於配置和原始映射,將接口和Java的POJO映射成數據庫中的記錄。
其中,開發dao有兩種方法,一種原始的dao開發方法,程序員需要寫dao接口和dao實現類。另一種是mapper代理方法,程序員只需要寫mapper接口相當於dao接口。
原始dao開發方法
1.編寫dao接口(UserDao)
- public interface UserDao {
- // 根據id查詢用戶信息
- public User findUserById(int id) throws Exception;
- }
2.編寫dao實現類
- public class UserDaoImpl implements UserDao {
- // 需要向dao實現類中注入SqlSessionFactory
- // 這里通過構造方法注入
- private SqlSessionFactory sqlSessionFactory;
- public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
- this.sqlSessionFactory = sqlSessionFactory;
- }
- @Override
- public User findUserById(int id) throws Exception {
- SqlSession sqlSession = sqlSessionFactory.openSession();
- //這里的test.findUserById是與下面的映射文件user.xml中的namespace+id有關。
- User user = sqlSession.selectOne("test.findUserById", id);
- // 釋放資源
- sqlSession.close();
- return user;
- }
- }
3.編寫映射文件(user.xml)
- <mapper namespace="test">
- <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- </mapper>
4.編寫測試類
- public class UserDaoImplTest {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在執行testFindUserById之前執行
- @Before
- public void setUp() throws Exception {
- // 創建sqlSessionFactory
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 創建會話工廠,傳入mybatis的配置文件信息
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- }
- @Test
- public void testUserDaoImpl() throws Exception{
- // 創建UserDao的對象
- UserDao userDao = new UserDaoImpl(sqlSessionFactory);
- // 調用UserDao的方法
- User user = userDao.findUserById(1);
- System.out.println(user);
- }
- }
測試結果:
mapper代理方法
1.編寫mapper.java(UserMapper.java相當於java接口)
- public interface UserMapper {
- // 根據id查詢用戶信息
- public User findUserById(int id) throws Exception;
- }
2.編寫mapper.xml(UserMapper.xml)
- <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
- <!--通過id查詢用戶表的記錄 -->
- <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
- SELECT * FROM USER WHERE id=#{value}
- </select>
- </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指定的類型一致。
3.編寫測試類
- public class UserMapperTest {
- private SqlSessionFactory sqlSessionFactory;
- // 此方法是在執行testFindUserById之前執行
- @Before
- public void setUp() throws Exception {
- // 創建sqlSessionFactory
- // mybatis配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 創建會話工廠,傳入mybatis的配置文件信息
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- }
- @Test
- public void testFindUserById() throws Exception {
- SqlSession sqlSession=sqlSessionFactory.openSession();
- //創建UserMapper對象,mybatis自動生成mapper代理對象
- UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
- //調用UserMapper的方法
- User user=userMapper.findUserById(1);
- System.out.println(user);
- sqlSession.close();
- }
- }
測試結果:
現在最常用的方法是第二種使用mapper代理的方法,不過第一種也有公司在用所以兩種都要知道。