Mybatis實現 CRUD 操作相關
基於前一個入門項目傳送門
- 在IUserdao接口中添加方法
public interface IUserDao {
/**
* 查找所有方法
* @return
*/
List<User> findAll();
/**
* 通過id查找用戶
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 保存用戶操作
* @param user
*/
void saveUser(User user);
/**
* 修改用戶操作
* @param user
*/
void updateUser(User user);
/**
* 刪除用戶
* @param id
*/
void deleteUser(Integer id);
}
- 在IUserDao.xml中添加數據庫代碼
注意:
resultType 屬性:
用於指定結果集的類型。
parameterType 屬性:
用於指定傳入參數的類型。
sql 語句中使用#{}字符:
它代表佔位符,相當於原來 jdbc 部分所學的?,都是用於執行語句時替換實際的數據。 具體的數據是由#{}裏面的內容決定的。
parameterType 屬性:
代表參數的類型,因爲我們要傳入的是一個類的對象,所以類型就寫類的全名稱。
<?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.ymz.dao.IUserDao">
<!-- 配置查詢所有操作 -->
<select id="findAll" resultType="com.ymz.entity.User">
select * from user;
</select>
<!--通過Id查找用戶操作-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.ymz.entity.User">
select * from user where id = #{id}
</select>
<!--保存用戶操作-->
<insert id="saveUser" parameterType="com.ymz.entity.User">
insert into user(username,birthday,sex,address) values(#{username},
#{birthday},#{sex},#{address});
</insert>
<!--更新用戶操作-->
<update id="updateUser" parameterType="com.ymz.entity.User">
update user set username=#{username},birthday=#{birthday},
sex=#{sex},address=#{address} where id = #{id}
</update>
<!--刪除用戶操作-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
</mapper>
- 創建測試類
注意:session.commit();使用來實現事務提交。
public class MybatisTest {
private InputStream is;
private SqlSession session;
private SqlSessionFactory build;
private IUserDao userDao;
@Before
public void init() throws IOException {
// 1. 獲取配置文件
is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 創建SqlSessionFactory對象
build = new SqlSessionFactoryBuilder().build(is);
// 3. 使用構建者創建工廠對象SqlSession
session = build.openSession();
// 4. 使用對象SqlSession創建dao接口的代理對象
userDao = session.getMapper(IUserDao.class);
}
@After
public void close(){
session.commit();
// 6. 釋放資源
try {
session.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void findAll(){
// 查詢所有用戶方法
List<User> users = userDao.findAll();
for(User user:users){
System.out.println(user);
}
}
@Test
public void saveUser(){
User user = new User();
user.setUsername("柳飄飄");
user.setSex("女");
user.setBirthday(new Date());
user.setAddress("北京市朝陽區");
userDao.saveUser(user);
}
@Test
public void updateUser(){
User user = userDao.findUserById(50);
user.setAddress("湖北省武漢市");
userDao.updateUser(user);
}
@Test
public void deleteUser(){
userDao.deleteUser(52);
}
}
Mybatis 與 JDBC 編程的比較
1.數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。
解決:
在 SqlMapConfig.xml 中配置數據鏈接池,使用連接池管理數據庫鏈接。
2.Sql 語句寫在代碼中造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變 java 代碼。
解決:
將 Sql 語句配置在 XXXXmapper.xml 文件中與 java 代碼分離。
3.向 sql 語句傳參數麻煩,因爲 sql 語句的 where 條件不一定,可能多也可能少,佔位符需要和參數對應。
解決:
Mybatis 自動將 java 對象映射至 sql 語句,通過 statement 中的 parameterType 定義輸入參數的
類型。
4.對結果集解析麻煩,sql 變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成 pojo 對
象解析比較方便。
解決:
Mybatis 自動將 sql 執行結果映射至 java 對象,通過 statement 中的 resultType 定義輸出結果的
類型。