1. 程式人生 > >MyBatis框架基於XML的配置

MyBatis框架基於XML的配置

ssi get() 動態對象 println username 文件加載 stack poj 但是

什麽是MyBatis?

答:它是一個持久層框架

說的太簡單了嗎?那讓我們來看一下官方的文檔描述:

技術分享圖片

MyBatis有什麽作用呢?

1.持久層的零實現

2.可以自動將數據封裝到對象裏面不需要手工編寫映射的關系

MyBatis基於XML配置文件的配置流程圖:    

技術分享圖片

配置流程步驟及代碼:

1.導入包:

技術分享圖片

2.創建總的配置文件

  註意,要在設置中設置兩個規則文件,第一個是用於總配置文件中,第二個是用於配置映射文件中,在配置中遇到PUBLIC ID

  可在MyBatis的官方文檔中找到

技術分享圖片

技術分享圖片

PUBLIC ID

技術分享圖片

技術分享圖片

總配置文件編寫代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
    <!--environments標簽用於配置數據庫連接信息,可以配置多個數據庫的連接信息  
    default屬性:環境集裏面可以配置多個數據庫連接環境,但是必須要指定默認的環境,指定的是環境environment標簽的ID
    -->
    <environments default
="sms"> <!-- environment環境標簽 ,用於配置一個數據庫連接的信息--> <environment id="sms"> <!-- 指定使用的事務類型 --> <!-- 觀點:任何框架的內置屬性都可以在代碼裏面找到 --> <!-- 大部分配置文件的解釋類都是在configuration、builder這個兩個單詞或者單詞的縮寫的包裏面 在org.apache.ibatis.session.Configuration配置類裏面找到對應的代碼查看 JDBC : 使用JDBC的事務處理 MANAGER: 不需要事務處理
--> <transactionManager type="JDBC"></transactionManager> <!-- dataSource標簽:作用,配置數據庫連續信息 type:配置數據源的類型 JNDI :使用JNDI數據源,就是在web服務器配置數據源,讓程序調用 POOLED : 使用默認內置的連接池 UNPOOLED:使用直連數據庫,不需要連接池 --> <dataSource type="POOLED"> <!-- 配置四要素 --> <property name="driver" value="org.gjt.mm.mysql.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/sms" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments>

創建一個MyBatisUtils工具類,用來加載總配置文件

package cn.gzsxt.utils;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtils {
    //註意事項,我們正常情況下,一個項目只有一個數據源。因為如果出現多個數據源,數據庫的連接就可能來自於不同的數據源
    //這樣可以導致數據庫連接無法同步,從而導致事務失效!
    
    //要求:對外只開放一個會話工廠。
    public static final SqlSessionFactory SSF=createSSF();
    
    //聲明一個線程變量
    private static final ThreadLocal<SqlSession> THREAD_LOCAL=new ThreadLocal<>();
    
    
    //1.獲得會話工廠
    private static SqlSessionFactory createSSF(){
    
        try {
            //讀取配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            //創建會話工廠構建類對象
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //構建會話工廠
            return builder.build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //2.獲得會話
    //需求:同訪問的一條線程,獲得的會話是相同的
    //答:可以通過線程變量實現(ThreadLoad)
    //ThreadLoad對象的作用,就是可以實現,同一條線程共享一個變量。
    public static SqlSession getSession(){
        //如果線程變量沒有對象,我們獲得會話對象,並且放在線程變量裏面
        if (THREAD_LOCAL.get()==null) {
            SqlSession session = SSF.openSession();
            //將對象放在線程變量裏面
            THREAD_LOCAL.set(session);
        }
        //如果已經有該會話。直接返回線程變量的會話對象。
        return THREAD_LOCAL.get();
    }
    
    //使用了線程變量,在關閉會話的時候,需要清除線程變量的對象;。
    public static void close(){
        if (THREAD_LOCAL.get()!=null) {
            SqlSession session = THREAD_LOCAL.get();
            session.close();
            THREAD_LOCAL.remove();
        }
    }
    
    public static void main(String[] args) {
        System.out.println(MybatisUtils.getSession());
        System.out.println(MybatisUtils.getSession());
    }

}

創建實體類

package cn.gzsxt.pojo;

import java.io.Serializable;
import java.util.Date;

public class Student implements Serializable {

    private static final long serialVersionUID = 1734561915065710177L;
    private Long studentId;//bigint(20) not null auto_increment comment ‘學生編號‘,
    private String studentName;//varchar(50) null default null comment ‘姓名‘,
    private String studentPwd;//varchar(50) null default null comment ‘密碼‘,
    private Integer studentStatus;//int(11) null default null comment ‘狀態‘,
    private Date createDate;//datetime null default null comment ‘創建時間‘,
    private String studentAccount;//varchar(50) null default null comment ‘學生帳號‘,
    public Long getStudentId() {
        return studentId;
    }
    public void setStudentId(Long studentId) {
        this.studentId = studentId;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public String getStudentPwd() {
        return studentPwd;
    }
    public void setStudentPwd(String studentPwd) {
        this.studentPwd = studentPwd;
    }
    public Integer getStudentStatus() {
        return studentStatus;
    }
    public void setStudentStatus(Integer studentStatus) {
        this.studentStatus = studentStatus;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public String getStudentAccount() {
        return studentAccount;
    }
    public void setStudentAccount(String studentAccount) {
        this.studentAccount = studentAccount;
    }
    
}

創建映射文件StudentMapper.xml和操作接口,建議將兩者放在同一個包下,方便查找

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.gzsxt.mapper.StudentMapper">
    <!-- 編寫插入的SQL語句 
      id:唯一標識符,必須和映射接口的方法名一一對應。就意味著映射接口的方法不能有重載
    -->
    <insert id="insert">
       INSERT INTO tb_student(STUDENT_NAME, STUDENT_PWD, STUDENT_STATUS, CREATE_DATE, STUDENT_ACCOUNT)    VALUES (#{studentName}, #{studentPwd}, #{studentStatus}, #{createDate}, #{studentAccount})
    </insert>

</mapper>
package cn.gzsxt.mapper;

import cn.gzsxt.pojo.Student;

public interface StudentMapper {
    /**
     * 插入記錄到學習表
     * @param student
     * @return
     */
    int insert(Student student);
    


}

用總配置文件加載映射文件

<!-- 配置指定加載的映射文件 -->
    <mappers>
       <mapper resource="cn/gzsxt/mapper/xml/StudentMapper.xml"/>
       
    </mappers>

編寫一個測試類測試

package cn.gzsxt.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import cn.gzsxt.mapper.StudentMapper;
import cn.gzsxt.pojo.Student;
import cn.gzsxt.utils.MybatisUtils;

public class StudentMapperTest {
    
    @Test
    public void insert(){
        //獲得會話對象
        SqlSession session = MybatisUtils.getSession();
        //構建映射接口的動態對象
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);

        //調用插入方法
        Student student=new Student();
        student.setStudentName("張三1");
        int insert = studentMapper.insert(student);
        //提交
        session.commit();
        System.out.println(insert);
        //關閉
        MybatisUtils.close();
    }

}

MyBatis框架基於XML的配置