mybatis框架之mybatis中dao層開發(fā)的兩種方法
一、原始dao的開發(fā)方式
即開發(fā)dao接口和dao實現(xiàn)類。
首先添加Dao接口
public interface UserDao { // 1、 根據(jù)用戶ID查詢用戶信息 public User findUserById(int id) throws Exception; ? // 2、 根據(jù)用戶名稱模糊查詢用戶列表 public List<User> findUsersByName(String name) throws Exception; ? // 3、 添加用戶 public void insertUser(User user) throws Exception; }
然后實現(xiàn)其接口即可
public class UserDaoImpl implements UserDao { // 依賴注入,將工程在外面創(chuàng)建 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//將外面創(chuàng)建的工廠傳遞進來(以后spring) this.sqlSessionFactory = sqlSessionFactory; } ? @Override public User findUserById(int id) throws Exception { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 調(diào)用SqlSession的增刪改查方法 // 第一個參數(shù):表示statement的唯一標示 User user = sqlSession.selectOne("test.findUserById", id); System.out.println(user); // 關(guān)閉資源 sqlSession.close(); return user; } ? @Override public List<User> findUsersByName(String name) { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); ? // 調(diào)用SqlSession的增刪改查方法 // 第一個參數(shù):表示statement的唯一標示 List<User> list = sqlSession.selectOne("test.findUsersByName", name); System.out.println(list); // 關(guān)閉資源 sqlSession.close(); return list; } ? @Override public void insertUser(User user) { // 創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); ? // 調(diào)用SqlSession的增刪改查方法 // 第一個參數(shù):表示statement的唯一標示 sqlSession.insert("test.insertUser", user); ? System.out.println(user.getId()); // 提交事務(wù) sqlSession.commit(); // 關(guān)閉資源 sqlSession.close(); } }
那么在測試類中
public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // 讀取配置文件 // 全局配置文件的路徑 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 創(chuàng)建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { // 創(chuàng)建UserDao UserDao dao = new UserDaoImpl(sqlSessionFactory); User user = dao.findUserById(1); System.out.println(user); } }
二、Mapper代理的開發(fā)方式
分析上面的代碼會發(fā)現(xiàn)有大量的重復(fù)的模板代碼,并且存在硬編碼【如sqlSession.insert("test.insertUser", user);】,
為了解決以上問題,故采用開發(fā)mapper接口(相當于dao接口)來進行dao的開發(fā),即通過開發(fā)mapper接口,將自動生成其代理類來進行操作。
其中Mapper代理使用的是jdk的代理策略。
如果采用Mapper代理的方式開發(fā)需要滿足如下開發(fā)規(guī)范
- mapper接口的全限定名要和mapper映射文件的namespace值一致。
- mapper接口的方法名稱要和mapper映射文件的statement的id一致。
- mapper接口的方法參數(shù)類型要和mapper映射文件的statement的parameterType的值一致,而且它的參數(shù)是一個。
- mapper接口的方法返回值類型要和mapper映射文件的statement的resultType的值一致。
首先開發(fā)mapper接口
public interface UserMapper { // 1、 根據(jù)用戶ID查詢用戶信息 public User findUserById(int id) throws Exception; // 2、 添加用戶 public void insertUser(User user) throws Exception; }
之后創(chuàng)建User的映射文件,在config下創(chuàng)建mapper目錄然后創(chuàng)建UserMapper.xml(這是mybatis的命名規(guī)范,當然,也不是必須是這個名稱)。
由其規(guī)范可以確定其映射文件如下
(接口在包com.itheima.mybatis.mapper.UserMapper下面):
<mapper namespace="com.itheima.mybatis.mapper.UserMapper"> <!-- 根據(jù)用戶ID查詢用戶信息 --> <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM USER WHERE id =#{id} </select> ? <!-- 添加用戶 --> <insert id="insertUser" parameterType="com.itheima.mybatis.po.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> ? INSERT INTO USER (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
之后將映射文件加到全局配置文件即可。
然后便可以進行測試
public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // 讀取配置文件 // 全局配置文件的路徑 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 創(chuàng)建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } ? @Test public void testFindUserById() throws Exception { // 創(chuàng)建UserMapper對象 SqlSession sqlSession = sqlSessionFactory.openSession(); ? // 由mybatis通過sqlsession來創(chuàng)建代理對象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findUserById(1); System.out.println(user); sqlSession.close(); } @Test public void testInsertUser() throws Exception { // 創(chuàng)建UserMapper對象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通過sqlsession來創(chuàng)建代理對象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("東哥hm19"); user.setAddress("寶盛西里24號樓"); mapper.insertUser(user); System.out.println(user.getId()); sqlSession.commit(); sqlSession.close(); } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java實現(xiàn)JSONArray轉(zhuǎn)Map的三種實現(xiàn)方式
本文主要介紹了Java實現(xiàn)JSONArray轉(zhuǎn)Map的三種實現(xiàn)方式,本文只是自己常用的三種,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03淺析Java中print、printf、println的區(qū)別
以下是對Java中print、printf、println的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-08-08