MyBatis 原始dao與mapper代理
一.原始Dao開發
原始Dao開發,我們需要些dao介面和dao的實現類,向dao實現類中注入SqlSessionFactory,在方法體內通過SqlSessionFactory建立SqlSession。
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();
User user = sqlSession.selectOne("test.findUserById", id);
// 釋放資源
sqlSession.close();
return user;
}
上述程式碼中的
User user = sqlSession.selectOne("test.findUserById", id);
1.sqlSession方法,將statement的id硬編碼
2.sqlSession方法id應該是int,但是當傳入String型別的時候,因為該方法使用泛型,編譯階段不會出錯,不利於開發
二.mapper代理開發
我們編寫mapper.xml對映檔案,mybatis可以自動生成mapper介面實現類代理物件。但是mapper代理的實現,需要遵循以下4個開發規則1、在mapper.xml中namespace等於mapper介面地址
<!-- namespace名稱空間,作用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper程式碼方法開發,namespace要等於mapper介面地址 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
2、mapper.java介面中的方法名和mapper.xml中statement的id一致
mapper.java介面方法
//根據id查詢使用者
public User findUserById(int id) throws Exception;
mapper.xml中statement的id
<select id="findUserById" parameterType="int"
resultType="cn.itcast.mybatis.po.User">
select * from USER where id = #{id}
</select>
3、mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。
在規則2的程式碼中可以看出
4、mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。
同規則2的程式碼
完整程式碼
Usermapper介面
package cn.itcast.mybatis.mapper;
import java.util.List;
import cn.itcast.mybatis.po.User;
/**
* UserMapper 2016年9月21日18:00:30
* mapper介面,相當於dao介面
* @author fxq
*
*/
public interface UserMapper {
//根據id查詢使用者
public User findUserById(int id) throws Exception;
//查詢多條記錄
public List<User> findUserByName(String name) throws Exception;
//新增使用者資訊
public void insertUser(User user) throws Exception;
//刪除使用者資訊
public void deleteUser(int id) throws Exception;
}
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">
<!-- namespace名稱空間,作用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper程式碼方法開發,namespace有特殊重要的作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!-- 在對映檔案中配置很多sql語句 -->
<!-- 需求:通過id查詢使用者表的記錄 -->
<!-- 通過select執行資料庫的查詢 -->
<!-- id:標識對映檔案中的sql -->
<!-- 將sql語句封裝到mappedStatement物件中,所以將id成為statement 的id -->
<select id="findUserById" parameterType="int"
resultType="cn.itcast.mybatis.po.User">
select * from USER where id = #{id}
</select>
<!-- 自定義條件查詢使用者列表 -->
<!-- resultType:指定就是單條記錄所對映的java物件型別 -->
<select id="findUserByName" parameterType="java.lang.String"
resultType="cn.itcast.mybatis.po.User">
select * from USER where username like '%${value}%'
</select>
<!-- 新增使用者 parameterType:指定輸入引數型別是pojo(包括:使用者資訊) #{}中指定pojo的屬性名,接收到pojo物件的屬性值,mybatis通過OGNL獲取物件的屬性值; -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into USER (id,username,birthday,sex,address)
values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 刪除 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from USER WHERE id
= #{id}
</delete>
<!-- 更新 -->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update USER set username =
#{username},birthday=#{birthday},sex=#{sex},address=#{address} where
id = #{id}
</update>
</mapper>
測試類
package cn.itcast.mybatis.mapper;
import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
//建立sqlSessionFactory
String resource= "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//建立UserMapper物件,mybatis自動生成mapper代理物件;
<strong>UserMapper userMapper=sqlSession.getMapper(UserMapper.class);</strong>
User user = userMapper.findUserById(1);
System.out.println(user);
}
}
三.總結
mapper代理開發遵循一定的開發規範,減少了錯誤的概率,提高了開發效率。同時對於資料型別的控制,從原始Dao的執行階段到了mapper代理的編譯階段,更利於開發。
相關文章
- Mybatis1.1——使用mapper代理開發daoMyBatisAPP
- mybatis入門基礎(二)----原始dao的開發和mapper代理開發MyBatisAPP
- mybatis-plus原始碼解析(三)----Mapper介面動態代理呼叫過程MyBatis原始碼APP
- mybatis通用mapper原始碼解析(二)MyBatisAPP原始碼
- mybatis通用mapper原始碼解析(一)MyBatisAPP原始碼
- Spring整合Mybatis時Mapper代理報錯BindingExceptionSpringMyBatisAPPException
- MyBatis進階--介面代理方式實現Dao 和動態SQLMyBatisSQL
- 【肥朝】圖解原始碼 | MyBatis的Mapper原理圖解原始碼MyBatisAPP
- mybatis mapper解析(4)MyBatisAPP
- 精盡MyBatis原始碼分析 - MyBatis初始化(二)之載入 Mapper 介面與 XML 對映檔案MyBatis原始碼APPXML
- MyBatis外掛 - 通用mapperMyBatisAPP
- mybatis的外掛:mapperMyBatisAPP
- 求大佬幫助我!!!IDEA中Mybatis的mapper.xml和dao.xml出現問題!!!IdeaMyBatisAPPXML
- 靜態代理、動態代理與Mybatis的理解MyBatis
- MyBatis外掛使用–通用MapperMyBatisAPP
- mybatis中@Mapper使用介紹MyBatisAPP
- Mybatis原始碼分析(四)mapper介面方法是怎樣被呼叫到的MyBatis原始碼APP
- 自動生成Mybatis的Mapper檔案MyBatisAPP
- mybatis mapper.xml批次刪除操作MyBatisAPPXML
- 整個小東西,在IDEA中自動生成PO、DAO、MapperIdeaAPP
- 兩張圖徹底搞懂MyBatis的Mapper原理!MyBatisAPP
- Spring Boot整合MyBatis實現通用MapperSpring BootMyBatisAPP
- mybatis 中mapper 的namespace有什麼用?MyBatisAPPnamespace
- mybatis的mapper的特殊符號處理MyBatisAPP符號
- mybatis原始碼學習:從SqlSessionFactory到代理物件的生成MyBatis原始碼SQLSession物件
- Mybatis原始碼分析(六)外掛的建立代理過程MyBatis原始碼
- mybatis-plus原始碼解析(二)----基於@MapperScan註解掃描載入MapperMyBatis原始碼APP
- Spring+Mybatis(一)無mapper.xml方式SpringMyBatisAPPXML
- 開發一個MyBatis通用Mapper的輪子MyBatisAPP
- mybatis的代理技術MyBatis
- 剔除Intellij中Mybatis的Mapper自動注入警告IntelliJMyBatisAPP
- mybatis中mapper.xml檔案引數問題MyBatisAPPXML
- Mybatis中mapper檔案中的兩層迴圈MyBatisAPP
- Mybatis的Mapper中的方法為什麼不能過載?MyBatisAPP
- MyBatis動態代理執行原理MyBatis
- Mybatis是如何將Mapper介面註冊到Spring IoC的MyBatisAPPSpring
- mybatis的mapper.xml用條件判斷做轉譯MyBatisAPPXML
- Mybatis的Mapper對映檔案中常用標籤及作用MyBatisAPP