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)建的工廠傳遞進(jìn)來(以后spring)
this.sqlSessionFactory = sqlSessionFactory;
}
?
@Override
public User findUserById(int id) throws Exception {
// 創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 調(diào)用SqlSession的增刪改查方法
// 第一個參數(shù):表示statement的唯一標(biāo)示
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的唯一標(biāo)示
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的唯一標(biāo)示
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接口(相當(dāng)于dao接口)來進(jìn)行dao的開發(fā),即通過開發(fā)mapper接口,將自動生成其代理類來進(jìn)行操作。
其中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ī)范,當(dāng)然,也不是必須是這個名稱)。
由其規(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>之后將映射文件加到全局配置文件即可。
然后便可以進(jìn)行測試
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)文章
MyBatis自定義TypeHandler如何解決字段映射問題
這篇文章主要介紹了MyBatis自定義TypeHandler如何解決字段映射問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
解決SpringBoot啟動警告:OpenJDK?64-Bit?Server?VM?warning
這篇文章主要介紹了解決SpringBoot啟動警告:OpenJDK?64-Bit?Server?VM?warning的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對同樣遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下2025-11-11
Java AQS中ReentrantReadWriteLock讀寫鎖的使用
ReentrantReadWriteLock稱為讀寫鎖,它提供一個讀鎖,支持多個線程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應(yīng)用場景,感興趣的可以了解一下2023-02-02
SpringBoot使用自定義注解+AOP+Redis實現(xiàn)接口限流的實例代碼
這篇文章主要介紹了SpringBoot使用自定義注解+AOP+Redis實現(xiàn)接口限流,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

