開篇
dao層是直接和數據庫打交道的,我們所熟悉的是面向接口編程即編寫接口然後編寫不同的實現類。
正文
傳統實例
pojo類:
user:
public class User {
//屬性名和數據庫表的字段對應
private int id;
private String username;// 用戶姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
}
第一步:編寫dao接口
public interface UserDao {
//根據id查詢用戶信息
public User findUserById(int id) throws Exception;
//刪除用戶信息
public void deleteUser(int id) throws Exception;
}
第二步:接口實現
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;
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//執行插入操作
sqlSession.delete("test.deleteUser", id);
// 提交事務
sqlSession.commit();
// 釋放資源
sqlSession.close();
}
}
第三步:測試
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 testFindUserById() throws Exception {
// 創建UserDao的對象
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
// 調用UserDao的方法
User user = userDao.findUserById(1);
System.out.println(user);
}
}
傳統dao層開發的問題
1、使用sqlsession調用方法時statement的id是寫死的
2、調用sqlsession時傳入變量,由於sqlsession方法使用的是泛型,即使變量傳入的類型不是配置文件中規定的編譯階段不報錯。
使用mapper代理的方法開發dao層
第一步:mapper接口,相當於dao層接口
package cn.itcast.mybatis.mapper;
public interface UserMapper{
//根據id查詢用戶信息
public User findUserById(int id) throws Exception;
//刪除用戶信息
public void deleteUser(int id) throws Exception;
}
第二步:編寫mapper.xml
規則:
1、在mapper.xml中namespace等於mapper接口地址
2、mapper接口中的方法名和mapper.xml中statement的id一致
3、mapper接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。
4、mapper接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。
第三步:測試
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);
}
}
總結
使用mapper代理的方式編寫dao層相對傳統方法從代碼量上來說簡單的,但是mapper接口的參數只能有一個,所以如果需要多個參數需要包裝pojo類來滿足不同的業務需求。