Mybatis使用总结
文章目錄
- 前言
- mybatis原理
- mybatis流程圖
- MyBatis原理
- mybatis使用流程
- 1. 引出依賴
- 2.配置全局配置文件(mybatis-config.xml)
- 3.與數(shù)據(jù)庫(kù)表對(duì)應(yīng)pojo類(Class.java)
- 4.Mapper接口文件(ClassMapper.java)
- 5.配置與接口文件對(duì)應(yīng)的mapper.xml文件(ClassMapper.xml)
- 6.在全局配置文件中引入mapper配置文件
- 7.測(cè)試方法的實(shí)現(xiàn)
- mybatis中遇到的問(wèn)題及解決方法
- 1.沒(méi)有引入mysql依賴
- 2.配置文件中數(shù)據(jù)庫(kù)操作語(yǔ)言與pojo類中的屬性名大小寫不一致
- 3.沒(méi)有提交事務(wù)
- 4.多組數(shù)據(jù)傳入無(wú)法識(shí)別
- XML形式使用Mybatis需要注意點(diǎn):
- 通過(guò)注解的方法使用mybatis
- 創(chuàng)建表對(duì)應(yīng)的pojo類型
- 給定mapper.xml文件
- 全局配置文件中引入mapper.xml
- 在接口文件中通過(guò)注解完成CRUD操作
- 測(cè)試方法和xml形式相同
- 顯示執(zhí)行細(xì)節(jié)日志
- log4j日志
- 在資源路徑下創(chuàng)建log4j.properties
- pom.xml中引入log4j依賴
- 打印細(xì)節(jié)
前言
在學(xué)習(xí)Mybatis的使用時(shí),我遇到了各種各樣的坑下面就是我在Mybatis的學(xué)習(xí)中遇到的問(wèn)題和自己總結(jié)的解決方法,希望能夠幫助到你們。
# mybatis介紹 mybatis介紹 MyBatis 是一款優(yōu)秀的持久層框架 特征: 1、支持自定義 SQL(非自定義SQL:hebineate)、存儲(chǔ)過(guò)程以及高級(jí)映射。 2、MyBatis解決JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。 3、MyBatis通過(guò)XML 或注解來(lái)配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄
mybatis原理
在學(xué)習(xí)mybatis原理時(shí)我不太明白,但通過(guò)自己對(duì)mybatis使用幾次以后就有了自己的一些理解。如果各位也和我一樣的話建議先自己動(dòng)手完成以下增刪改查的應(yīng)用以后在來(lái)學(xué)習(xí)原理:
mybatis流程圖
MyBatis原理
MyBatis應(yīng)用程序根據(jù)XML配置文件創(chuàng)建SqlSessionFactory,SqlSessionFactory在根據(jù)配置,配置來(lái)源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,獲取一個(gè)SqlSession。SqlSession包含了執(zhí)行sql所需要的所有方法,可以通過(guò)SqlSession實(shí)例直接運(yùn)行映射的sql語(yǔ)句,完成對(duì)數(shù)據(jù)的增刪改查和事務(wù)提交等,用完之后關(guān)閉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>導(dǎo)入依賴成功的話會(huì)生成mysql和mybatis依賴文件
這兩個(gè)依賴是我們使用mybatis的基礎(chǔ)
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"> <!--根標(biāo)簽--> <configuration><!--配置數(shù)據(jù)源--><environments default="development"><!--id:環(huán)境的唯一標(biāo)識(shí)--><environment id="development"><!--事務(wù)管理器--><transactionManager type="JDBC"></transactionManager><!--數(shù)據(jù)源類型--><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>需要關(guān)注的數(shù)據(jù):
username: 賬戶名 password :賬戶密碼 url :使用的數(shù)據(jù)庫(kù) jdbc:mysql://localhost:3306/庫(kù)名/關(guān)于全局配置更詳細(xì)的使用:
參考文檔:https://mybatis.org/mybatis-3/zh/configuration.html#
3.與數(shù)據(jù)庫(kù)表對(duì)應(yīng)pojo類(Class.java)
pojo類生成的方式:
方式一:手寫:
對(duì)應(yīng)關(guān)系:
還需要 set,get方法
方式二:通過(guò)連接數(shù)據(jù)庫(kù)自動(dòng)生成
需要填寫賬戶名,密碼和需要操作的庫(kù)名
右鍵需要導(dǎo)入的表
找到需要導(dǎo)入的位置 ,點(diǎn)擊ok就會(huì)給我們自動(dòng)生成對(duì)應(yīng)數(shù)據(jù)庫(kù)表的類,屬性和get、set方法
修改package為我們文件當(dāng)前所在路徑
生成的Class類如下所示:
與之對(duì)應(yīng)的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.配置與接口文件對(duì)應(yīng)的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根標(biāo)簽 namespace,命令空間:保證命名空間唯一,一般是對(duì)應(yīng)的mapper.java的包全路徑--> <mapper namespace="org.example.mapper.ClassMapper"><!--selectStudentByIdselect * from Student where SID = XXX--><!--select標(biāo)簽:查詢操作id屬性:statement的id,用于表示定義的SQL,在同一個(gè)命名空間中id是不允許重復(fù)的#{XXX}:輸入?yún)?shù)的占位符,避免SQL注入parameterType:輸入?yún)?shù)類型resultType:指定結(jié)果集類型--><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.測(cè)試方法的實(shí)現(xiàn)
public static void insert() throws IOException {//拿到全局配置文件String resource = "mybatis-config.xml";//mybbatis提供了Resources類獲取配置文件流try {InputStream resourceAsdept = Resources.getResourceAsStream(resource);//創(chuàng)建會(huì)話工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsdept);SqlSession sqlSession = sqlSessionFactory.openSession();//通過(guò)反射機(jī)制來(lái)獲取到mapper實(shí)例ClassMapper mapper = sqlSession.getMapper(ClassMapper.class);Class c = new Class(4, "暗影島");mapper.insertClass(c);sqlSession.commit();System.out.println("添加成功");} catch (IOException e) {e.printStackTrace();}}測(cè)試方法的操作流程
1.通過(guò)mapper提供的Resources獲取配置文件流 2.創(chuàng)建會(huì)話工廠 3.通過(guò)反射方法獲取mapper實(shí)例 4.實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作 5.提交事務(wù)
查看mysql是否添加成功
以上全部?jī)?nèi)容就是一個(gè)完整的mybatis的使用過(guò)程
mybatis中遇到的問(wèn)題及解決方法
1.沒(méi)有引入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.配置文件中數(shù)據(jù)庫(kù)操作語(yǔ)言與pojo類中的屬性名大小寫不一致
如下我們輸入的參數(shù)類型為pojo.Class類型那么我們就需要保證
#{}中內(nèi)如與我們Class類中屬性名完全一致,大小寫也需要一致
如果不一致會(huì)導(dǎo)致如下異常
3.沒(méi)有提交事務(wù)
如果我們不在增刪改操作后不進(jìn)行事務(wù)提交的話,那么我們?cè)跀?shù)據(jù)庫(kù)中查詢時(shí)候沒(méi)有我們的操作信息,所以需要我們手動(dòng)提交事務(wù)
4.多組數(shù)據(jù)傳入無(wú)法識(shí)別
當(dāng)我們需要多組數(shù)據(jù)傳入xml配置文件時(shí),xml無(wú)法識(shí)別傳入數(shù)據(jù)類型
public void updateClass(@Param("c_id") long c_id,@Param("c_name") String c_name);解決方法:
1.添加@Param注解 2.pojo中寫一個(gè)傳入多組數(shù)據(jù)的類 3.兩組數(shù)據(jù)時(shí),可以采用map的形式傳入推薦使用第一種
XML形式使用Mybatis需要注意點(diǎn):
基于xml形式需要遵循一定的規(guī)則:
1、xml配置文件中的命名空間和指向接口文件的地址(全路徑) 2、mapper.java接口文件中的方法名和mapper.xml中Statement的id保持一致 3、mapper.java接口中方法參數(shù)和mapper.xml中Statement的parameterType或parameterMap的類型一致 4、mapper.java接口中方法返回值類型和mapper.xml中mapper.xml文件中Statement的resultType或resultMap類型一致通過(guò)注解的方法使用mybatis
創(chuàng)建表對(duì)應(yīng)的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根標(biāo)簽 namespace,命令空間:保證命名空間唯一,一般是對(duì)應(yīng)的mapper.java的包全路徑--> <mapper namespace="org.example.mapper.StudentMapper"> </mapper>全局配置文件中引入mapper.xml
<mappers><mapper resource="mapper/StudentMapper.xml"/><mapper resource="mapper/ClassMapper.xml"/></mappers>在接口文件中通過(guò)注解完成CRUD操作
/*** @Select 注解即xml配置文件中select標(biāo)簽** @Results注解和xml 配置文件中ResultMap標(biāo)簽使用類似*/@Results(id = "studentResult",value = {//column 為數(shù)據(jù)庫(kù)中列明 可以不區(qū)分大小寫//property 為pojo中類的屬性 ,需要區(qū)分大小寫@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")})//方法上面添加注解注解內(nèi)容為mysql語(yǔ)句@Select("select * from student where s_id = #{id}")public Student selectUserById(int id);測(cè)試方法和xml形式相同
顯示執(zhí)行細(xì)節(jié)日志
log4j日志
在資源路徑下創(chuàng)建log4j.properties
## debug 級(jí)別 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 語(yǔ)句 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>打印細(xì)節(jié)
總結(jié)
以上是生活随笔為你收集整理的Mybatis使用总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis三种特殊类型
- 下一篇: SPringMVC使用总结