文章目錄
二、基於代理Dao實現CURD操作
使用要求:
1、持久層接口和持久層接口的映射配置必須在相同的包下
2、持久層映射配置中 mapper 標籤的 namespace 屬性取值必須是持久層接口的全限定類名
3、SQL 語句的配置標籤<select>,<insert>,<delete>,<update>
的 id 屬性必須和持久層接口的
方法名相同。
1.首先在持久層(dao)接口添加新增方法
import com.itheima.domain.QueryVo;
import com.itheima.domain.User;
import java.util.List;
/**
*
* 用戶的持久層接口
*/
public interface IUserDao {
/**
* 查詢所有用戶
* @return
*/
List<User> findAll();
/**
* 保存用戶
* @param user
*/
void saveUser(User user);
/**
* 更新用戶
* @param user
*/
void updateUser(User user);
/**
* 根據Id刪除用戶
* @param userId
*/
void deleteUser(Integer userId);
/**
* 根據id查詢用戶信息
* @param userId
* @return
*/
User findById(Integer userId);
/**
* 根據名稱模糊查詢用戶信息
* @param username
* @return
*/
List<User> findByName(String username);
/**
* 查詢總用戶數
* @return
*/
int findTotal();
/**
* 根據queryVo中的條件查詢用戶
* @param vo
* @return
*/
List<User> findUserByVo(QueryVo vo);
}
2.在用戶的映射配置文件mapper.xml中配置
MyBatis中resultType resultMap 區別
基本映射 :(resultType)使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列纔可以映射成功。(數據庫,實體,查詢字段,這些全部都得一一對應)高級映射 :(resultMap) 如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關係。(高級映射,字段名稱可以不一致,通過映射來實現
resultType和resultMap功能類似 ,都是返回對象信息 ,但是resultMap要更強大一些 ,可自定義。因爲resultMap要配置一下,表和類的一一對應關係,所以說就算你的字段名和你的實體類的屬性名不一樣也沒關係,都會給你映射出來,
ResultType相對與ResultMap而言更簡單一點。只有滿足ORM(Object Relational Mapping,對象關係映射)時,即數據庫表中的字段名和實體類中的屬性完全一致時,才能使用,否則會出現數據不顯示的情況。
resultType:
<select id="selectUser" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
resultMap:
<!-- column:數據庫中列名稱,property:類中屬性名稱 -->
<resultMap type="User" id="userMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
</resultMap>
<select id="selectUserList" resultMap="userMap" >
select * from user
</select>
配置細節:
parameterType 屬性:代表傳入參數的類型,因爲我們要傳入的是一個類的對象,所以類型就寫類的全名稱。
resultType 屬性:用於指定結果集的類型。
sql 語句中使用#{}字符:它代表佔位符,相當於原來 jdbc 部分所學的?,都是用於執行語句時替換實際的數據。
具體的數據是由#{}裏面的內容決定的。
#{}中內容的寫法:
由於我們保存方法的參數是 一個 User 對象,此處要寫 User 對象中的屬性名稱。它用的是 ognl 表達式。
ognl 表達式:
它是 apache 提供的一種表達式語言,全稱是:Object Graphic Navigation Language 對象圖導航語言
它是按照一定的語法格式來獲取數據的。語法格式就是使用 #{對象.對象}的方式
在用戶的映射配置文件mapper.xml中配置,namespace和id共同組成一個固定位置的方法,方便使用查詢
<mapper namespace="com.itheima.dao.IUserDao">
<!-- 配置 查詢結果的列名和實體類的屬性名的對應關係 -->
<resultMap id="userMap" type="uSeR">
<!-- 主鍵字段的對應 -->
<id property="userId" column="id"></id>
<!--非主鍵字段的對應-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- 查詢所有 -->//注意這裏的dao層
<select id="findAll" resultMap="userMap">
<!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
select * from user;
</select>
<!-- 保存用戶 -->
<insert id="saveUser" parameterType="user">
<!-- 配置插入操作後,獲取插入數據的id -->
<selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
</insert>
<!-- 更新用戶 -->
<update id="updateUser" parameterType="USER">
update user set username=#{userName},address=#{userAddress},sex=#{userAex},birthday=#{userBirthday} where id=#{userId}
</update>
<!-- 刪除用戶-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{uid}
</delete>
<!-- 根據id查詢用戶 -->
<select id="findById" parameterType="INT" resultMap="userMap">
select * from user where id = #{uid}
</select>
<!-- 根據名稱模糊查詢 -->
<select id="findByName" parameterType="string" resultMap="userMap">
select * from user where username like #{name}
<!-- select * from user where username like '%${value}%'-->
</select>
<!-- 獲取用戶的總記錄條數 -->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
<!-- 根據queryVo的條件查詢用戶 -->
<select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultMap="userMap">
select * from user where username like #{user.username}
</select>
</mapper>
3.添加測試類中的測試方法
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.QueryVo;
import com.itheima.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* 測試mybatis的crud操作
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用於在測試方法執行之前執行
public void init()throws Exception{
//1.讀取配置文件,生成字節輸入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.獲取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.獲取SqlSession對象
sqlSession = factory.openSession();
//4.獲取dao的代理對象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用於在測試方法執行之後執行
public void destroy()throws Exception{
//提交事務
sqlSession.commit();
//6.釋放資源
sqlSession.close();
in.close();
}
/**
* 測試查詢所有
*/
@Test
public void testFindAll(){
//5.執行查詢所有方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
/**
* 測試保存操作
*/
@Test
public void testSave(){
User user = new User();
user.setUserName("modify User property");
user.setUserAddress("北京市順義區");
user.setUserSex("男");
user.setUserBirthday(new Date());
System.out.println("保存操作之前:"+user);
//5.執行保存方法
userDao.saveUser(user);
System.out.println("保存操作之後:"+user);
}
/**
* 測試更新操作
*/
@Test
public void testUpdate(){
User user = new User();
user.setUserId(50);
user.setUserName("mybastis update user");
user.setUserAddress("北京市順義區");
user.setUserSex("女");
user.setUserBirthday(new Date());
//5.執行保存方法
userDao.updateUser(user);
}
/**
* 測試刪除操作
*/
@Test
public void testDelete(){
//5.執行刪除方法
userDao.deleteUser(48);
}
/**
* 測試刪除操作
*/
@Test
public void testFindOne(){
//5.執行查詢一個方法
User user = userDao.findById(50);
System.out.println(user);
}
/**
* 測試模糊查詢操作
*/
@Test
public void testFindByName(){
//5.執行查詢一個方法
List<User> users = userDao.findByName("%王%");
// List<User> users = userDao.findByName("王");
for(User user : users){
System.out.println(user);
}
}
/**
* 測試查詢總記錄條數
*/
@Test
public void testFindTotal(){
//5.執行查詢一個方法
int count = userDao.findTotal();
System.out.println(count);
}
/**
* 測試使用QueryVo作爲查詢條件
*/
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUserName("%王%");
vo.setUser(user);
//5.執行查詢一個方法
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
}