Mybatis入門



  Mybatis
一、mybatis介紹
  mybatis是一個優秀的持久層框架,對jdbc操作數據庫的過程進行封裝,開發人員
 只需要關注sql本身。mybatis支持普通sql查詢,存儲過程和高級映射。可以使用簡單
 的xml或註解配置,將java對象和sql映射生成最終執行的sql語句,最後由mybatis框架
 執行sql並將結果映射成java對象返回。
 ①mybatis配置
  SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。
  mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。
 ② 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠
 ③ 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。
 ④ mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,
  一個是基本執行器、一個是緩存執行器。
 ⑤ Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。
  mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
 ⑥ Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過
  Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對
  preparedStatement設置參數。
 ⑦ Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過
  Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編
  程中對結果的解析處理過程。
二、mybatis使用
 1、簡單使用
  導入jar包
   --mybatis--**jar
   --mybatis-connector--**jar
 2、編寫配置文件mybatis-config.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
   <environments default="development">
    <environment id="development">
     <!-- 使用JDBC事物管理 -->
     <transactionMannager type="JDBC"/>
     <!-- 使用連接池 -->
     <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql:///數據庫名?characterEncoding=utf-8"/>
      <property name="username" value="root"/>
      <property naem="password" value="123"/>
     </dataSource>
    </environment>
   </environments>
  </configuration>
 3、 建表並創建對應的實體類
  public class User {
   private Integer id;
   private String account;
   private String username;
   //getter/setter方法
  }
 4、定義sys_users表所對應的sql映射文件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:命名空間,用於隔離sql -->
  <mapper namespace="com.ztd.mybatisdemo.mapper.UserMapper">
   <!-- id:sql的id -->
   <!-- parameterType:聲明輸入參數 的類型-->
   <!-- resultType:聲明輸出結果的類型 -->
   <!-- #{}:輸入參數的佔位符,相當於jdbc的 ? -->
   <select id="findUserById" parameterType="int" resultType="com.ztd.mybatisdemo.entity.User">
    SELECT id,account,username FROM sys_users WHERE id=#{id}
   </select>
  </mapper>
 5、在mybatis-config.xml中註冊UserMapper.xml
  <mappers>
   <mapper resource="com/ztd/mybatisdemo/mapper/xml/UserMapper.xml"/>
  </mappers>
 6、測試
  @Test
  public void testQuery() throws IOException{
   String conf = "mybatis-config.xml";
   //加載mybatis的配置文件
   Reader reader = Resources.getResourceAsReader(conf);
   //創建SqlSessionFactory
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
   //得到sqlSession
   Sqlsession session = sqlSessionFactory.openSession();
    //執行查詢得到返回值
    //namespace + .id
    String statement = "com.ztd.mybatisdemo.mapper.UserMapper"+".findUserById";
    User user = session.selectOne(statement, 2);
    System.out.println(user);
    session.close();

  }
三、CRUD操作
 Mapper文件映射接口
 1、編寫接口
  public interface UserMapper {
   void create(User user);
   void update(User user);
   void delete(Integer id);
   User findUserById(Integer id);
  }
 UserMapper.xml中的namespace爲接口的全路徑
 接口中的方法名和id必須一致
 
 2、返回數據庫生成的主鍵
  <insert id="create" parameterType="com.ztd.mybatisdemo.entity.User">
  <!-- selectKey 將數據庫生成的主鍵返回 -->
  <!-- keyColumn: 數據庫表中主鍵對應的那一列 -->
  <!-- keyProperty: 實體類中主鍵對應的屬性 -->
  <!-- order: 指定何時執行查詢id的sql,
   BEFORE 在執行insert語句前執行查詢id的sql
   AFTER  在執行insert語句後執行查詢id的sql
  -->
  <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
   SELECT LAST_INSERT_ID()
  </selectKey>
   INSERT INTO sys_users(account,username,email,create_time)
   VALUES(#{account},#{username},#{email},#{createTime})
  </insert>
 3、 typeAlises標籤
  爲java類型命名的一個簡寫名字,方便使用
  <typeAliases>
   <typeAlias type="com.ztd.mybatisdemo.entity.User" alias="_user"/>
  </typeAliases>
 對於普通的java類型,有一些內建類型別名
   別名   映射的類型
   _byte   byte
   _long   long
   _short   short
   _int   int
   _integer  int
   _double   double
   _float   float
   _boolean  boolean
   string   String
   byte   Byte
   short   Short
   int    Integer
   integer   Integer
   double   Double
   float   Float
   boolean   Boolean
   date   Date
   decimal   BigDecimal
   bigdecimal  BigDecimal
   object   Object
   map    Map
   hashmap   HashMap
   list   List
   arraylist  ArrayList
   collection  Collection
   iterator  Iterator
 4、sql標籤
 用來定義可以重用的sql代碼片段,可以包含在其他語句中。
 <sql id="userColumns">id,account,username,email,create_time AS createTime</sql>
 <select id="findUserById" parameterType="int" resultType="_user">
  SELECT <include refid="userColumns"/>
  FROM sys_users WHERE id=#{id}
 </select>
四、 一對一查詢
 1.1 嵌套查詢,通過執行另外一個sql映射語句來返回預期的複雜類型
  <!-- 嵌套查詢:通過執行另外一個sql映射語句 -->
  <select id="findTeacherById" parameterType="int" resultType="_teacher">
   SELECT teacher_id AS teacherId,name FROM teachers WHERE teacher_id=#{id}
  </select>
  <resultMap type="_grade" id="_gradeResultMap">
   <id property="gradeId" column="grade_id"/>
   <result property="name" column="name"/>
   <association property="teacher" column="teacher_id" javaType="_teacher"
    select="findTeacherById"/>
  </resultMap>
  <select id="findGradeById" parameterType="int" resultMap="_gradeResultMap">
   SELECT grade_id,name,teacher_id FROM grades WHERE grade_id=#{id}
  </select>

 1.2 嵌套結果,使用嵌套結果映射來處理複雜的聯合結果的子集
  <!-- 嵌套結果 -->
  <resultMap type="_grade" id="_gradeResultMap">
   <id property="gradeId" column="g_id"/>
   <result property="name" column="g_name"/>
   <association property="teacher" column="teacher_id" javaType="_teacher">
    <id property="teacherId" column="teacher_id"/>
    <result property="name" column="t_name"/>
   </association>
  </resultMap>
  <select id="findGradeById" parameterType="int" resultMap="_gradeResultMap">
   SELECT g.grade_id AS g_id, g.name AS g_name, g.teacher_id AS teacher_id, t.name AS t_name
   FROM grades g,teachers t
   WHERE g.teacher_id = t.teacher_id AND g.grade_id=#{id}
  </select>
  
  
  一對多查詢
 1.3 嵌套查詢

  <select id="findScoreByStudentId" parameterType="Integer" resultType="_score">
   SELECT id,student_id AS studentId,subject,score,exam_date AS examDate
   FROM scores WHERE student_id=#{id}
  </select>
  <resultMap id="_studentResultMap" type="_student">
   <id property="studentId" column="student_Id"/>
   <collection property="scores" javaType="ArrayList" column="student_id" ofType="_score" select="findScoreByStudentId"/>
  </resultMap>
  <select id="findById" parameterType="Integer" resultMap="_studentResultMap">
   SELECT student_id,num,name,sex,grade
   FROM students
   WHERE student_id=#{id}
  </select>

 1.4 嵌套結果
  <!-- 嵌套結果 -->
  <resultMap type="_student" id="_studentResultMap">
   <id property="studentId" column="st_id"/>
   <result property="num" column="st_num"/>
   <result property="name" column="st_name"/>
   <result property="sex" column="st_sex"/>
   <result property="grade" column="st_grade"/>
   <collection property="scores" ofType="_score">
    <id property="studentId" column="st_id"/>
    <result property="id" column="sc_id"/>
    <result property="subject" column="sc_subject"/>
    <result property="score" column="sc_score"/>
    <result property="examDate" column="sc_exam_date"/>
   </collection>
  </resultMap>
  <select id="findById" parameterType="int" resultMap="_studentResultMap">
   SELECT st.student_id AS st_id,st.num AS st_num,st.name AS st_name,st.sex AS st_sex,st.grade AS st_grade,
    sc.id AS sc_id,sc.subject AS sc_subject,sc.score AS sc_score,sc.exam_date AS sc_exam_date
   FROM students st,scores sc
   WHERE st.student_id = sc.student_id AND sc.student_id=#{id}
  </select>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章