mybatis的mapper代理,SqlMapConfig.xml中配置,輸入和輸出映射使用案例

public class User {
    private int id;
    private String username;// 用戶姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}
User.java
public class UserCustom extends User {
    //添加一些擴展字段
}
UserCustom
public class UserQueryVo {
    //用戶信息
    private User user;
    //自定義user的擴展對象
    private UserCustom userCustom;
    //用戶id集合
    private List<Integer> ids;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public UserCustom getUserCustom() {
        return userCustom;
    }
    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}
UserQueryVo
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"></properties>
    <!-- 定義 別名 -->
    <typeAliases>
        <!--
            單個別名的定義
            alias:別名,type:別名映射的類型  -->
            <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
            <!-- 批量別名定義
            指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認爲類名(首字母小寫或大寫)
         -->
        <package name="cn.itcast.mybatis.po"/>
    </typeAliases>
    <!-- 和spring整合後 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事務管理-->
            <transactionManager type="JDBC" />
        <!-- 數據庫鏈接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加載mapper映射
    若是將和spring整合後,能夠使用整合包中提供的mapper掃描器,此處的mappers不用配置了。
     -->
    <mappers>
        <package name="cn.yzu.mybatis.mapper"/>
    </mappers>
</configuration>
public interface UserMapper {
    //根據用戶id查詢用戶信息
    public User findUserById(int id) throws Exception;
    //根據用戶名稱  查詢用戶信息
    public List<User> findUserByName(String username) throws Exception;
    //自定義查詢條件查詢用戶信息
    public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;
    //查詢用戶,使用resultMap進行映射
    public List<User> findUserListResultMap(UserQueryVo userQueryVo)throws Exception;
    //查詢用戶,返回記錄個數
    public int findUserCount(UserQueryVo userQueryVo) throws Exception;
    //插入用戶
    public void insertUser(User user)throws Exception;
    //刪除用戶
    public void deleteUser(int id) throws Exception;
    //修改用戶
    public void updateUser(User user) throws Exception;
}
UserMapper
<?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">
<!-- namespace命名空間,爲了對sql語句進行隔離,方便管理 ,mapper開發dao方式,使用namespace有特殊做用
mapper代理開發時將namespace指定爲mapper接口的全限定名
 -->
<mapper namespace="cn.yzu.mybatis.mapper.UserMapper">
<!-- 在mapper.xml文件中配置不少的sql語句,執行每一個sql語句時,封裝爲MappedStatement對象
mapper.xml以statement爲單位管理sql語句
 -->
     <!-- 將用戶查詢條件定義爲sql片斷
     建議對單表的查詢條件單獨抽取sql片斷,提升公用性
     注意:不要將where標籤放在sql片斷
       -->
     <sql id="query_user_where">
             <!-- 若是 userQueryVo中傳入查詢條件,再進行sql拼接-->
            <!-- test中userCustom.username表示從userQueryVo讀取屬性值-->
            <if test="userCustom!=null">
                <if test="userCustom.username!=null and userCustom.username!=''">
                    and username like '%${userCustom.username}%'
                </if>
                <if test="userCustom.sex!=null and userCustom.sex!=''">
                    and sex = #{userCustom.sex}
                </if>
                <!-- 根據id集合查詢用戶信息 -->
                <!-- 最終拼接的效果:
                SELECT id ,username ,birthday  FROM USER WHERE username LIKE '%小明%' AND id IN (16,22,25)
                collection:集合的屬性
                open:開始循環拼接的串
                close:結束循環拼接的串
                item:每次循環取到的對象
                separator:每兩次循環中間拼接的串
                 -->
                 <foreach collection="ids" open=" AND id IN ( " close=")" item="id" separator=",">
                     #{id}
                 </foreach>
                 <!-- 
                 SELECT id ,username ,birthday  FROM USER WHERE username LIKE '%小明%' AND (id = 16 OR id = 22 OR id = 25) 
                  <foreach collection="ids" open=" AND ( " close=")" item="id" separator="OR">
                     id = #{id}
                 </foreach>
                  -->
                <!-- 還有不少的查詢條件 -->
            </if>
     </sql>
     <!-- 定義resultMap,列名和屬性名映射配置
     id:mapper.xml中的惟一標識 
     type:最終要映射的pojo類型
      -->
     <resultMap id="userListResultMap" type="user" >
         <!-- 列名
         id_,username_,birthday_
         id:要映射結果集的惟 一標識 ,稱爲主鍵
         column:結果集的列名
         property:type指定的哪一個屬性中
          -->
          <id column="id_" property="id"/>
          <!-- result就是普通列的映射配置 -->
          <result column="username_" property="username"/>
          <result column="birthday_" property="birthday"/>
     </resultMap>
    <!-- 根據id查詢用戶信息 -->
    <select id="findUserById" parameterType="int" resultType="user">
        SELECT * FROM USER WHERE id= #{id}
    </select>
    <!-- 根據用戶名稱查詢用戶信息,可能返回多條-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="cn.yzu.mybatis.po.User">
        select * from user where username like '%${value}%'
    </select>
    <!-- 自定義查詢條件查詢用戶的信息
    %${userCustom.username}%:userCustom是userQueryVo中的屬性,經過OGNL獲取屬性的值
     -->
    <select id="findUserList" parameterType="userQueryVo" resultType="user">
        select id,username,birthday,sex from user
        <!-- where標籤至關 於where關鍵字,能夠自動去除第一個and -->
        <where>
            <!-- 引用sql片斷,若是sql片斷和引用處不在同一個mapper必須前邊加namespace -->
            <include refid="query_user_where"></include>
            <!-- 下邊還有很其它的條件 -->
            <!-- <include refid="其它的sql片斷"></include> -->
        </where>
    </select>
    <!-- 使用resultMap做結果映射
    resultMap:若是引用resultMap的位置和resultMap的定義在同一個mapper.xml,直接使用resultMap的id,若是不在同一個mapper.xml要在resultMap的id前邊加namespace
     -->
    <select id="findUserListResultMap" parameterType="userQueryVo" resultMap="userListResultMap">
        select id id_,username username_,birthday birthday_ from user where username like '%${userCustom.username}%'
    </select>
    <!-- 輸出簡單類型
    功能:自定義查詢條件,返回查詢記錄個數,一般用於實現 查詢分頁
     -->
     <select id="findUserCount" parameterType="userQueryVo" resultType="int">
         select count(*) from user 
        <where>
            <include refid="query_user_where"></include>
        </where>
     </select>
    <!-- 添加用戶-->
    <insert id="insertUser" parameterType="cn.yzu.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>
public class UserMapperTest {
    // 會話工廠
    private SqlSessionFactory sqlSessionFactory;
    // 建立工廠
    @Before
    public void init() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 建立代理對象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findUserById(1);
        System.out.println(user);
    }
    @Test
    public void testFindUserByUsername() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = userMapper.findUserByName("小明");
        System.out.println(list);
    }
    @Test
    public void testInsertUser() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("李奎123");
        userMapper.insertUser(user);
        sqlSession.commit();
        sqlSession.close();
    }
    // 經過包裝類型查詢用戶信息
    @Test
    public void testFindUserList() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 構造查詢條件
        UserQueryVo userQueryVo = new UserQueryVo();
        UserCustom userCustom = new UserCustom();
        userCustom.setUsername("小明");
        userCustom.setSex("1");
        userQueryVo.setUserCustom(userCustom);
        //id集合
        List<Integer> ids  = new ArrayList<Integer>();
        ids.add(16);
        ids.add(22);
        userQueryVo.setIds(ids);
        List<User> list = userMapper.findUserList(userQueryVo);
        sqlSession.close();
        System.out.println(list);
    }
    // 使用resultMap進行結果映射 
    @Test
    public void testFindUserListResultMap() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserQueryVo userQueryVo = new UserQueryVo();
        UserCustom userCustom = new UserCustom();
        userCustom.setUsername("小明");
        userQueryVo.setUserCustom(userCustom);
        List<User> list = userMapper.findUserListResultMap(userQueryVo);
        sqlSession.close();
        System.out.println(list);
    }
    // 返回查詢記錄總數
    @Test
    public void testFindUserCount() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserQueryVo userQueryVo = new UserQueryVo();
        UserCustom userCustom = new UserCustom();
        userCustom.setUsername("小明");
        userQueryVo.setUserCustom(userCustom);
        //id集合
        List<Integer> ids  = new ArrayList<Integer>();
        ids.add(16);
        ids.add(22);
        userQueryVo.setIds(ids);
        int count = userMapper.findUserCount(userQueryVo);
        sqlSession.close();
        System.out.println(count);
    }
}
相關文章
相關標籤/搜索