1. 程式人生 > >mybatis框架(2)---mapper代理方法

mybatis框架(2)---mapper代理方法

mapper代理方法

在我們在寫MVC設計的時候,都會寫dao層和daoimp實現層,但假如我們使用mapper代理的方法,我們就可以不用先daoimp實現類

當然這得需要遵守一些相應的規則:

(1)Usermapper.java介面必須和Usermapper.xml名稱相同,且要在同一目錄下:

(2)mapper.xmlnamespace等於mapper介面的地址

(3)Usermapper.java介面中國的方法名和Usermapper.xmlstatementid一致

<!-- 7綜合查詢 -->
      <select id="findUserCount" parameterType="com.study.model.User" resultType="int">
          select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
      </select> 

(4)SqlMapConfig.xml中載入mapper.xml

 <mappers>
     <!-- 這裡是之前載入所寫的 -->
     <!--     <mapper resource="sqlmap/User.xml" /> -->
         <!-- 通過mapper介面 載入單個對映檔案 必須遵循一些規範: 需要將mapper介面和mapper.xml對映檔案 檔名必須一致 並且在同一個目錄下 -->
         <mapper class="com.study.mapper.UserMapper" /> 
    
  </mappers>


(5)通過mapper代理方法進行增刪改查

a.編寫user物件

public class User {
    private int id;
    private String username;// 使用者姓名
    private String sex;// 性別
    private Date birthday;// 生日
    private String address;// 地址
/*
 *提供set和get方法和tostring方法
 *
 */
}

b.配置SqlMapConfig.xml

<!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="com.study.model.User" alias="user"/> -->
            <!-- 批量別名定義
            指定包路徑,自動掃描包下邊的pojo,定義別名,別名預設為類名(首字母小寫或大寫)
         -->
        <package name="com.study.model"/>
    </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>
    <mapper class="com.study.mapper.UserMapper" />    
</mappers>

 </configuration>

在這裡有兩個新的知識點:

  1: <properties resource="db.properties"></properties>

  之前在連線資料庫填寫配置檔案直接把屬性(連線資料庫使用者名稱,密碼等)寫在裡面,而這裡是寫在外面的db.properties中,這樣更好的體現程式碼的靈活性

 2:<typeAliases>標籤,之前我們配置mapper.xml檔案中的parameterType和resultType的屬性如果是物件一定要寫類的全名稱,而通過<typeAliases>標籤的配置我們只需要寫類的名字就好了

c.配置db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/study
jdbc.username=root
jdbc.password=root

 也就是這樣的

d.配置UserMapper.xml

<?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的屬性對應所在的UserMapper介面全名稱 -->
<mapper namespace="com.study.mapper.UserMapper">
   <!-- 發現這裡的resultType屬性我們可以不用寫類的全名稱com.study.model.User,因為在-->
   <!--SqlMapConfig.xml屬性中我們配置了<typeAliases>標籤  --> 
    <!-- 根據id查詢使用者資訊 -->
    <select id="findUserById" parameterType="int" resultType="user">
        SELECT * FROM USER WHERE id= #{id}
    </select>
   
      <!-- 根據使用者名稱稱查詢使用者資訊,可能返回多條-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="user">
        select * from user where username like '%${value}%'
    </select>
    
     <!-- 新增使用者-->
    <insert id="insertUser" parameterType="user">
        INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
   
</mapper>

f.配置UserMapper.java物件 

public interface UserMapper {
    //根據使用者id查詢使用者資訊
    public User findUserById(int id) throws Exception;
    //根據使用者名稱稱  查詢使用者資訊
    public List<User> findUserByName(String username) throws Exception;//插入使用者
    public void insertUser(User user)throws Exception;
  
  //刪除使用者
    public void deleteUser(int id) throws Exception;
    //修改使用者
    public void updateUser(User user) throws Exception;
}

e.編寫UserMapperTest類進行 增刪改查

 import java.io.IOException;
  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.List;
  
  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.Before;
  import org.junit.Test;
 
  import com.study.mapper.UserMapper;
  import com.study.model.User;
 
 
  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);
     }
     //通過使用者id查詢物件
     @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("小小洪");
         //我這裡只添加了使用者名稱,其它資訊沒有新增,預設為null
         //Preparing: INSERT INTO USER(username,birthday,sex,address) VALUES(?,?,?,?)
         //Parameters: 小小洪(String), null, null, null
         userMapper.insertUser(user);
         sqlSession.commit();
         sqlSession.close();
     }
 }
   /*
    *刪除和修改我這裡先不寫了,大家理解就好
    */


本文就講到這,謝謝大家,歡迎大家指點謝謝!