文章目錄
- 1. MyBatis的dao層實現(傳統方式)——需要寫接口及其實現類
- 2. MyBatis的代理開發方式——僅需寫接口
1. MyBatis的dao層實現(傳統方式)——需要寫接口及其實現類
傳統方式就是在項目下邊建立dao
包,里面包含接口及其實現類,文件結構如下:
UserMapper.java
package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {List<User> findAll() throws IOException;
}
UserMapperImpl.java
package com.example.demo.dao.impl;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserMapperImpl implements UserMapper {@Overridepublic List<User> findAll() throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();List<User> userList = sqlSession.selectList("userMapper.findAll");sqlSession.close();return userList;}
}
測試其實現:
package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {
// 創建dao層對象,目前dao層是手動編寫的UserMapper userMapper = new UserMapperImpl();List<User> all = userMapper.findAll();System.out.println(all);}
}
其實這里邊就是用MyBatis提供的API調用MyBatis配置,這個內容在剛開始學MyBatis的時候有提到過:【Spring集成MyBatis】MyBatis誕生及代碼快速入門(非注解開發)
2. MyBatis的代理開發方式——僅需寫接口
在上面的代碼中,其實很多代碼都是重復的,比如獲取sqlSession的代碼:
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
而sql語句的代碼又是半重復的,只有括號里面的內容會發生變化:
List<User> userList = sqlSession.selectList("userMapper.findAll");
在這里介紹MyBatis的代理開發方式,其需要遵循一定的規范
即如下的對應部分應該相同:
使用以上介紹的開發方式,我們就不需要再寫接口的實現類了,只需要讓接口與XML文件中的定義對應即可。
此時,我的XML文件和接口分別為:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserMapper"><select id="findAll" resultType="user">select * from user</select>
</mapper>
UserMapper.java
package com.example.demo.dao;import com.example.demo.domain.User;import java.io.IOException;
import java.util.List;public interface UserMapper {List<User> findAll() throws IOException;
}
測試的時候,只需要通過sqlSession.getMapper()
來獲得對應類的實現配置即可
package com.example.demo.service;import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ServiceDemo {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.findAll();System.out.println(userList);}
}
假如帶參數查詢,操作也是類似的,在XML文件中加上:
<select id="findById" parameterType="int" resultType="user">select * from user where id=#{id}
</select>
接口中加上:
User findById(int id);
實現時調用:
User user = userMapper.findById(1);
即可獲得對應的user結果