摘要:是支持普通查詢,存儲過程和高級映射的優(yōu)秀持久層框架。其中,標(biāo)簽內(nèi)指定的是你定義的實體類的別名,方便之后使用。如果有問題會輸出相應(yīng)的提示。結(jié)果根據(jù)配置,我們生成了三個文件。
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。
以前都是用Hibernate比較多,項目中使用到的Mybatis封裝的Dao也是別人封裝好的。今天第一次看Mybatis文檔,寫一個簡單的demo加深印象。
Mybatis入門 開發(fā)環(huán)境配置新建一個maven項目:
加入mysql-connector-java和mybatis,還有Lombok(Lombok不是必須的)的依賴:
建表4.0.0 com.fengyuan mybatis-demo 0.0.1-SNAPSHOT org.projectlombok lombok 1.14.4 mysql mysql-connector-java 5.1.38 org.mybatis mybatis 3.2.8 org.apache.maven.plugins maven-compiler-plugin 1.8
在mysql中新建數(shù)據(jù)庫mybatisdemo,并創(chuàng)建student表:
表中有兩條記錄:
創(chuàng)建表對應(yīng)的Model,Student類:
package com.fengyuan.domain; import lombok.Data; public @Data class Student { private int id; private String name; private int age; }添加配置文件
在項目中新建mybatis文件夾,在其中添加Mybatis的配置文件mybatis-conf.xml,在其中配置數(shù)據(jù)源。
其中,
在mybatis文件夾底下新建一個mapper文件夾,存放映射文件,在其中新建student表對應(yīng)的映射文件studentMapper.xml
namespace是唯一的,namespace有點像包名+類名,id像是方法名。parameterType是方法的參數(shù)類型,resultType中的"Student"就是前面定義的別名,是方法的返回類型。
定義完映射文件,將其注冊到配置文件中:
測試
完成以上步驟,就可以開始測試了。
測試類:
package com.fengyuan.client; 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; import com.fengyuan.domain.Student; public class Main { public static void main(String[] args) { Reader reader = null; try { // 加載配置文件 reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml"); } catch (IOException e) { e.printStackTrace(); } // 構(gòu)建SqlSession工廠,并從工廠里打開一個SqlSession SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 找到對應(yīng)的sql String statement = "com.fengyuan.domain.StudentMapper.getStudentById"; // 傳入?yún)?shù)id=1,執(zhí)行sql,返回查詢結(jié)果 Student student = sqlSession.selectOne(statement, 1); System.out.println(student); } finally { sqlSession.close(); } } }
執(zhí)行結(jié)果:
Student(id=1, name=Can Liu, age=40)
表中id為1的記錄已經(jīng)取出來了。
項目結(jié)構(gòu):
另一種映射方式前面的這種映射方式,雖然可以用,但是要用字符串來找對應(yīng)的sql很不方便,還有可能出錯。mybatis提供了注解的方式,更簡單也更直觀。
定義接口在項目中創(chuàng)建一個Dao接口StudentDao.java
package com.fengyuan.dao; import org.apache.ibatis.annotations.Select; import com.fengyuan.domain.Student; public interface StudentDao { @Select("select * from student where id = #{id}") public Student getStudentById(int id); }
把剛才寫在映射文件中的sql語句寫在@Select注解中即可,這樣一來映射文件studentMappper.xml就不用了。
當(dāng)然,如果要用xml來映射也是可以的,接口中只寫方法,不要加注解。此時要求namespace必須與對應(yīng)的接口全類名一致,id必須與對應(yīng)接口的某個對應(yīng)的方法名一致,如下:
注冊接口
測試
package com.fengyuan.client; 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; import com.fengyuan.dao.StudentDao; import com.fengyuan.domain.Student; public class Main { public static void main(String[] args) { Reader reader = null; try { // 加載配置文件 reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml"); } catch (IOException e) { e.printStackTrace(); } // 構(gòu)建SqlSession工廠,并從工廠里打開一個SqlSession SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sqlSessionFactory.openSession(); // 如果配置文件中沒有注冊接口,可以在代碼里注冊 //sqlSession.getConfiguration().addMapper(StudentDao.class); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); // 直接調(diào)用接口的方法,傳入?yún)?shù)id=1,返回Student對象 Student student = studentDao.getStudentById(1); System.out.println(student); } finally { sqlSession.close(); } } }
如代碼中的注釋,除了在配置文件中注冊接口,也可以在代碼中用
sqlSession.getConfiguration().addMapper(StudentDao.class);來注冊。
然后就可以直接調(diào)用接口的方法來執(zhí)行對應(yīng)的sql語句,比第一種方式要直觀、而且“面向?qū)ο蟆绷撕芏唷?/p>
此時的項目結(jié)構(gòu):
除了前面演示的select語句,這邊補充一下其他的示例。
使用注解映射在接口studentDao.java中定義相應(yīng)的方法,并在注解中寫上對應(yīng)的sql:
package com.fengyuan.dao; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.fengyuan.domain.Student; public interface StudentDao { @Select("select * from student where id= #{id}") public Student getStudentById(int id); @Insert("insert into student(name, age) values(#{name}, #{age})") public int addStudent(Student student); @Delete("delete from student where name = #{name}") public int removeStudentByName(String name); @Update("update student set age = #{age} where id = #{id}") public int updateStudent(Student student); @Select("select * from student") public List使用XML文件映射listAllStudents(); }
如果是用XML文件,接口中只要定義好方法:
package com.fengyuan.dao; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.fengyuan.domain.Student; public interface StudentDao { public Student getStudentById(int id); public int addStudent(Student student); public int removeStudentByName(String name); public int updateStudent(Student student); public ListlistAllStudents(); }
然后,在XML文件中,定義好對應(yīng)的sql:
insert into student(name, age) values(#{name}, #{age}) delete from student where name = #{name} update student set age = #{age} where id = #{id}
注意namespace與id要與接口中一一對應(yīng)。
注冊到配置文件中或者
測試
package com.fengyuan.client; import java.io.Reader; 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 com.fengyuan.dao.StudentDao; import com.fengyuan.domain.Student; public class Main { private static Reader reader; private static SqlSessionFactory sqlSessionFactory; static { try { reader = Resources.getResourceAsReader("mybatis/mybatis-conf.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取sqlSession * @return */ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } /** * 查詢 */ public static void testQuery() { SqlSession sqlSession = getSqlSession(); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); // 根據(jù)id返回Student對象 Student student = studentDao.getStudentById(1); System.out.println(student); } finally { sqlSession.close(); } } /** * 新增 */ public static void testInsert() { SqlSession sqlSession = getSqlSession(); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); // 新建一個student對象 Student student = new Student(); student.setName("Aaron"); student.setAge(24); // 插入到表中 studentDao.addStudent(student); // 提交事務(wù) sqlSession.commit(); } finally { sqlSession.close(); } } /** * 更新 */ public static void testUpdate() { SqlSession sqlSession = getSqlSession(); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); // 取出student記錄,修改年齡,再更新到數(shù)據(jù)庫 Student student = studentDao.getStudentById(2); student.setAge(44); studentDao.updateStudent(student); // 提交事務(wù) sqlSession.commit(); } finally { sqlSession.close(); } } /** * 刪除 */ public static void testRemove() { SqlSession sqlSession = getSqlSession(); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); studentDao.removeStudentByName("cly"); // 提交事務(wù) sqlSession.commit(); } finally { sqlSession.close(); } } /** * 以List返回student表中所有記錄 */ public static void testGetAll() { SqlSession sqlSession = getSqlSession(); try { // 獲取映射類 StudentDao studentDao = sqlSession.getMapper(StudentDao.class); ListMybatis-Generatorstudents = studentDao.listAllStudents(); System.out.println(students); // 提交事務(wù) sqlSession.commit(); } finally { sqlSession.close(); } } public static void main(String[] args) { } }
手動書寫Mapping映射文件不僅繁瑣而且容易出錯,通過Mybatis-Generator,可以幫我們自動生成相關(guān)的文件。以下內(nèi)容是從這篇博客中學(xué)習(xí)的,感謝博主。
準(zhǔn)備建表
這邊我們還是用前面的student表來作為示例。
mybatis-generator-core包
我這邊用的是mybatis-generator-core-1.3.2.jar。
數(shù)據(jù)庫驅(qū)動
同樣,數(shù)據(jù)庫用的是mysql,所以用了mysql-connector-java-5.1.25.jar。
配置文件
generatorConfig.xml:
相關(guān)文件截圖:
執(zhí)行在命令行執(zhí)行命令:
java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
輸出Mybatis Generator finished successfully.,表示執(zhí)行成功,在指定的路徑生成了相應(yīng)文件。如果有問題會輸出相應(yīng)的提示。
結(jié)果根據(jù)配置,我們生成了三個文件。
在src/main/java中com.fengyuan.model中生成了Student.java:
package com.fengyuan.model; public class Student { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
在src/main/java中com.fengyuan.mapping中生成了StudentMapper.xml:
id, name, age delete from student where id = #{id,jdbcType=INTEGER} insert into student (id, name, age ) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER} ) insert into student id, name, age, #{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, update student where id = #{id,jdbcType=INTEGER} name = #{name,jdbcType=VARCHAR}, age = #{age,jdbcType=INTEGER}, update student set name = #{name,jdbcType=VARCHAR}, age = #{age,jdbcType=INTEGER} where id = #{id,jdbcType=INTEGER}
在src/main/java中com.fengyuan.dao中生成了StudentMapper.java:
package com.fengyuan.dao; import com.fengyuan.model.Student; public interface StudentMapper { int deleteByPrimaryKey(Integer id); int insert(Student record); int insertSelective(Student record); Student selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Student record); int updateByPrimaryKey(Student record); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65057.html
摘要:概述是一款優(yōu)秀的基于的持久層框架,封裝代碼,實現(xiàn)將參數(shù)映射到語句并執(zhí)行,最后將執(zhí)行結(jié)果映射到對象并返回的功能,支持自定義存儲過程和高級映射。命名無要求,但應(yīng)該有意義。創(chuàng)建實體和映射文件是映射框架,所以我們需要對應(yīng)創(chuàng)建類,與數(shù)據(jù)庫表進(jìn)行映射。 概述 Mybatis是一款優(yōu)秀的、基于SQL的持久層框架,封裝JDBC代碼,實現(xiàn)將參數(shù)映射到SQL語句并執(zhí)行,最后將執(zhí)行結(jié)果映射到JAVA對象并返...
摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實踐為系列講座,專題直播節(jié),時長高達(dá)小時,包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開發(fā)人員必備技術(shù)。無論是互聯(lián)網(wǎng)、云計算還是大數(shù)據(jù),Java平臺已成為全棧的生態(tài)體系,...
閱讀 1416·2021-10-08 10:04
閱讀 738·2021-09-07 09:58
閱讀 2917·2019-08-30 15:55
閱讀 2432·2019-08-29 17:21
閱讀 2134·2019-08-28 18:04
閱讀 3081·2019-08-28 17:57
閱讀 723·2019-08-26 11:46
閱讀 2252·2019-08-23 17:20