Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入
阿新 • • 發佈:2019-04-20
utf XML 方法 creat 它的 執行方法 字符串 pro ssi
Mybatis基於代理Dao實現CRUD操作
使用要求:
1、持久層接口和持久層接口的映射配置必須在相同的包下
2、持久層映射配置中mapper標簽的namespace屬性取值必須是持久層接口的全限定類名
3、SQL語句的配置標簽<select>,<insert>,<delete>,<update>的id屬性必須和持久層接口的方法名相同。
持久層接口
/** * * 用戶的持久層接口 */ 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(); }
持久層接口對應的映射配置文件
<?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.itheima.dao.IUserDao"> <!--配置查詢所有--> <select id="findAll" resultType="com.itheima.domain.User"> select * from user </select> <!--保存用戶--> <insert id="saveUser" parameterType="com.itheima.domain.User"> insert into user(username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday}); </insert> <!--更新用戶--> <update id="updateUser" parameterType="com.itheima.domain.User"> update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}; </update> <!--刪除用戶--> <!--此處dao方法中只有一個integer類型參數,只需要寫清楚一個占位符就可以,占位符叫什麽無所謂--> <delete id="deleteUser" parameterType="Integer"> delete from user where id=#{id}; </delete> <!--根據ID查詢用戶--> <select id="findById" parameterType="Integer" resultType="com.itheima.domain.User"> select * from user where id=#{id}; </select> <!--根據名稱模糊查詢用戶信息--> <select id="findByName" parameterType="String" resultType="com.itheima.domain.User"> select * from user where username like #{username}; /*select * from user where username like ‘%${value}%‘;*/ </select> <!--使用聚合函數查詢總用戶數--> <select id="findTotal" resultType="int"> select count(id) from user; </select> </mapper>
測試類
package com.itheima.test; import com.itheima.dao.IUserDao; 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; 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 testSaveUser(){ User user =new User (); user.setAddress ("QingDao"); user.setBirthday (new Date ()); user.setSex ("m"); user.setUsername ("MKL"); userDao.saveUser (user); } /** * 測試更新操作 */ @Test public void testUpdateUser(){ User user =new User (); user.setId (59); user.setAddress ("HuangDao"); user.setBirthday (new Date ()); user.setSex ("男"); user.setUsername ("MKL"); userDao.updateUser (user); } /** * 測試根據ID進行刪除 */ @Test public void testDeleteUser(){ userDao.deleteUser (43); } /** * 測試根據ID查詢用戶 */ @Test public void testFindById(){ User user=userDao.findById (59); System.out.println (user); } /** * 測試根據名稱模糊查詢用戶信息 */ @Test public void testFindByName(){ List<User> users = userDao.findByName ("%王%"); //List<User> users = userDao.findByName ("王"); System.out.println (users); } /** *使用聚合函數查詢總用戶數 */ @Test public void testFindTotal(){ System.out.println (userDao.findTotal ()); } }
問題擴展:進行模糊查詢時兩種方式的區別
第一種方式 PreparedStatement的參數占位符
第二種方式: Statement對象的字符串拼接SQL
問題擴展:新增用戶id的返回值
Mybatis 示例之 SelectKey
新增用戶後,同時還要返回當前新增用戶的id值,因為id是由數據庫的自動增長來實現的,所以就相當於我們要在新增後將自動增長auto_increment的值返回。
keyProperty 對應的屬性名稱
<insert id="saveUser" parameterType="USER"> <!-- 配置保存時獲取插入的id --> <selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id(); </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
Mybatis的參數深入 傳遞pojo包裝對象
開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。 Pojo類中包含pojo。
需求:根據用戶名查詢用戶信息,查詢條件放到QueryVo的user屬性中。
編寫QueryVo
package com.itheima.domain; import java.io.Serializable; /** * Created by IDEA * User:MKL7 * Date:2019/4/20 * Time:15:45 */ /** * 查詢條件對象對象 */ public class QueryVo implements Serializable { private User user; public User getUser () { return user; } public void setUser (User user) { this.user = user; } }
編寫持久層接口
/** * 根據QueryVo中的條件 查詢用戶信息 * @param queryVo * @return */ List<User> findByVo(QueryVo queryVo);
持久層接口的映射文件
<!--根據QueryVo中的條件查詢用戶信息--> <select id="findByVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo"> select * from user where username like #{user.username}; </select>
測試包裝類作為參數
/** * 測試根據QueryVo 查詢用戶信息 */ @Test public void testFindByVo () { User user = new User (); user.setUsername ("%王%"); QueryVo queryVo = new QueryVo (); queryVo.setUser (user); List<User> users=userDao.findByVo (queryVo); System.out.println (users); }
Mybatis基於代理Dao實現CRUD操作 及 Mybatis的參數深入