Mybatis使用总结
文章目錄
- 前言
- mybatis原理
- mybatis流程圖
- MyBatis原理
- mybatis使用流程
- 1. 引出依賴
- 2.配置全局配置文件(mybatis-config.xml)
- 3.與數據庫表對應pojo類(Class.java)
- 4.Mapper接口文件(ClassMapper.java)
- 5.配置與接口文件對應的mapper.xml文件(ClassMapper.xml)
- 6.在全局配置文件中引入mapper配置文件
- 7.測試方法的實現
- mybatis中遇到的問題及解決方法
- 1.沒有引入mysql依賴
- 2.配置文件中數據庫操作語言與pojo類中的屬性名大小寫不一致
- 3.沒有提交事務
- 4.多組數據傳入無法識別
- XML形式使用Mybatis需要注意點:
- 通過注解的方法使用mybatis
- 創建表對應的pojo類型
- 給定mapper.xml文件
- 全局配置文件中引入mapper.xml
- 在接口文件中通過注解完成CRUD操作
- 測試方法和xml形式相同
- 顯示執行細節日志
- log4j日志
- 在資源路徑下創建log4j.properties
- pom.xml中引入log4j依賴
- 打印細節
前言
在學習Mybatis的使用時,我遇到了各種各樣的坑下面就是我在Mybatis的學習中遇到的問題和自己總結的解決方法,希望能夠幫助到你們。
# mybatis介紹 mybatis介紹 MyBatis 是一款優秀的持久層框架 特征: 1、支持自定義 SQL(非自定義SQL:hebineate)、存儲過程以及高級映射。 2、MyBatis解決JDBC 代碼以及設置參數和獲取結果集的工作。 3、MyBatis通過XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄
mybatis原理
在學習mybatis原理時我不太明白,但通過自己對mybatis使用幾次以后就有了自己的一些理解。如果各位也和我一樣的話建議先自己動手完成以下增刪改查的應用以后在來學習原理:
mybatis流程圖
MyBatis原理
MyBatis應用程序根據XML配置文件創建SqlSessionFactory,SqlSessionFactory在根據配置,配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句,完成對數據的增刪改查和事務提交等,用完之后關閉SqlSession。
mybatis使用流程
1. 引出依賴
分別引入mybatis和mysql的依賴
<!--mybatis--> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><!--mysql-connector-java--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency>導入依賴成功的話會生成mysql和mybatis依賴文件
這兩個依賴是我們使用mybatis的基礎
2.配置全局配置文件(mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--根標簽--> <configuration><!--配置數據源--><environments default="development"><!--id:環境的唯一標識--><environment id="development"><!--事務管理器--><transactionManager type="JDBC"></transactionManager><!--數據源類型--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/exercise"/><property name="username" value="root"/><property name="password" value="******"/></dataSource></environment></environments></configuration>需要關注的數據:
username: 賬戶名 password :賬戶密碼 url :使用的數據庫 jdbc:mysql://localhost:3306/庫名/關于全局配置更詳細的使用:
參考文檔:https://mybatis.org/mybatis-3/zh/configuration.html#
3.與數據庫表對應pojo類(Class.java)
pojo類生成的方式:
方式一:手寫:
對應關系:
還需要 set,get方法
方式二:通過連接數據庫自動生成
需要填寫賬戶名,密碼和需要操作的庫名
右鍵需要導入的表
找到需要導入的位置 ,點擊ok就會給我們自動生成對應數據庫表的類,屬性和get、set方法
修改package為我們文件當前所在路徑
生成的Class類如下所示:
與之對應的class表
4.Mapper接口文件(ClassMapper.java)
public interface ClassMapper {//增public void insertClass(Class c);//刪public void deleteClass(long id);//改public void updateClass(@Param("c_id") long c_id,@Param("c_name") String c_name); }5.配置與接口文件對應的mapper.xml文件(ClassMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--mapper根標簽 namespace,命令空間:保證命名空間唯一,一般是對應的mapper.java的包全路徑--> <mapper namespace="org.example.mapper.ClassMapper"><!--selectStudentByIdselect * from Student where SID = XXX--><!--select標簽:查詢操作id屬性:statement的id,用于表示定義的SQL,在同一個命名空間中id是不允許重復的#{XXX}:輸入參數的占位符,避免SQL注入parameterType:輸入參數類型resultType:指定結果集類型--><insert id="insertClass" parameterType="org.example.pojo.Class">insert into class(c_id,c_name) values (#{c_id},#{c_name})</insert><delete id="deleteClass" parameterType="long">delete from Class where c_id = #{id};</delete><update id="updateClass" >update Class set c_name =#{c_name} where c_id = #{c_id}</update></mapper>6.在全局配置文件中引入mapper配置文件
<!--引入mapper配置文件--><mappers><mapper resource="mapper/StudentMapper.xml"/><mapper resource="mapper/ClassMapper.xml"/></mappers>7.測試方法的實現
public static void insert() throws IOException {//拿到全局配置文件String resource = "mybatis-config.xml";//mybbatis提供了Resources類獲取配置文件流try {InputStream resourceAsdept = Resources.getResourceAsStream(resource);//創建會話工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsdept);SqlSession sqlSession = sqlSessionFactory.openSession();//通過反射機制來獲取到mapper實例ClassMapper mapper = sqlSession.getMapper(ClassMapper.class);Class c = new Class(4, "暗影島");mapper.insertClass(c);sqlSession.commit();System.out.println("添加成功");} catch (IOException e) {e.printStackTrace();}}測試方法的操作流程
1.通過mapper提供的Resources獲取配置文件流 2.創建會話工廠 3.通過反射方法獲取mapper實例 4.實現數據庫操作 5.提交事務
查看mysql是否添加成功
以上全部內容就是一個完整的mybatis的使用過程
mybatis中遇到的問題及解決方法
1.沒有引入mysql依賴
Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.cj.jdbc.Driver解決方法在pom.xml中引入mysql依賴
2.配置文件中數據庫操作語言與pojo類中的屬性名大小寫不一致
如下我們輸入的參數類型為pojo.Class類型那么我們就需要保證
#{}中內如與我們Class類中屬性名完全一致,大小寫也需要一致
如果不一致會導致如下異常
3.沒有提交事務
如果我們不在增刪改操作后不進行事務提交的話,那么我們在數據庫中查詢時候沒有我們的操作信息,所以需要我們手動提交事務
4.多組數據傳入無法識別
當我們需要多組數據傳入xml配置文件時,xml無法識別傳入數據類型
public void updateClass(@Param("c_id") long c_id,@Param("c_name") String c_name);解決方法:
1.添加@Param注解 2.pojo中寫一個傳入多組數據的類 3.兩組數據時,可以采用map的形式傳入推薦使用第一種
XML形式使用Mybatis需要注意點:
基于xml形式需要遵循一定的規則:
1、xml配置文件中的命名空間和指向接口文件的地址(全路徑) 2、mapper.java接口文件中的方法名和mapper.xml中Statement的id保持一致 3、mapper.java接口中方法參數和mapper.xml中Statement的parameterType或parameterMap的類型一致 4、mapper.java接口中方法返回值類型和mapper.xml中mapper.xml文件中Statement的resultType或resultMap類型一致通過注解的方法使用mybatis
創建表對應的pojo類型
package org.example.pojo;;import java.util.Date;public class Student {private int s_Id;private String s_Name;private String sex;private Date birthday;private String qq;private long c_Id; public Student(){}public Student(int s_Id, String s_Name, String sex, Date birthday, String qq, long c_Id) {this.s_Id = s_Id;this.s_Name = s_Name;this.sex = sex;this.birthday = birthday;this.qq = qq;this.c_Id = c_Id;}public int getSId() {return s_Id;}public void setSId(int s_Id) {this.s_Id = s_Id;}public String getSName() {return s_Name;}public void setSName(String s_Name) {this.s_Name = s_Name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(java.sql.Date birthday) {this.birthday = birthday;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public long getCId() {return c_Id;}public void setCId(long c_Id) {this.c_Id = c_Id;}@Overridepublic String toString() {return "Student{" +"sId=" + s_Id +", sName='" + s_Name + '\'' +", sex='" + sex + '\'' +", birthday=" + birthday +", qq='" + qq + '\'' +", cId=" + c_Id +'}';} }給定mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--mapper根標簽 namespace,命令空間:保證命名空間唯一,一般是對應的mapper.java的包全路徑--> <mapper namespace="org.example.mapper.StudentMapper"> </mapper>全局配置文件中引入mapper.xml
<mappers><mapper resource="mapper/StudentMapper.xml"/><mapper resource="mapper/ClassMapper.xml"/></mappers>在接口文件中通過注解完成CRUD操作
/*** @Select 注解即xml配置文件中select標簽** @Results注解和xml 配置文件中ResultMap標簽使用類似*/@Results(id = "studentResult",value = {//column 為數據庫中列明 可以不區分大小寫//property 為pojo中類的屬性 ,需要區分大小寫@Result(column = "s_id" ,property = "s_id"),@Result(column = "s_name",property = "s_name"),@Result(column = "sex", property = "sex"),@Result(column = "birthday", property = "birthday"),@Result(column = "qq",property = "qq"),@Result(column = "c_id",property = "c_id")})//方法上面添加注解注解內容為mysql語句@Select("select * from student where s_id = #{id}")public Student selectUserById(int id);測試方法和xml形式相同
顯示執行細節日志
log4j日志
在資源路徑下創建log4j.properties
## debug 級別 log4j.rootLogger=DEBUG,Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.out log4j.appender.Console.layout = org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t] [%c] [%p] - %m%n log4j.logger.com.tulun=DEBUG /##輸出sql 語句 log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG</strong>pom.xml中引入log4j依賴
<!--日志--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.15</version></dependency>打印細節
總結
以上是生活随笔為你收集整理的Mybatis使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis三种特殊类型
- 下一篇: SPringMVC使用总结