MyBatis框架基於XML的配置
阿新 • • 發佈:2019-04-22
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的配置