MyBatis 時一款優秀的持久層框架,用于簡化JDBC的開發
The MyBatis Blog
目錄
- MyBatis入門
- Mybatis基礎CRUD
- Mybatis動態SQL
Mybatis入門
-
快速入門
-
JDBC介紹
-
數據庫連接池
-
lombok
-
準備工作(創建springboot工程,數據庫表user,實體類User)
-
引入Mybatis的相關依賴,配置Mybatis(數據庫的連接信息)
-
編寫SQL語句
-
數據庫表中的字段和實例用的屬性名一一對應
-
配置Mybatis的依賴
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
- 編寫SQL語句
@Mapper
public interface UserMapper {@Select("select * from user")public List<User> list();
}
- 編寫測試
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test1(){List<User> userList = userMapper.list();userList.stream().forEach(user -> {System.out.println(user);});}
}
注:要在主入口上面添加@MapperScan("org.mybatis.mapper")
,告訴bean對象在哪個文件夾下
@SpringBootApplication
@MapperScan("org.mybatis.mapper")
public class MybatisApplication { public static void main(String[] args) { SpringApplication.run(MybatisApplication.class, args); } }
JDBC(Java DataBase Connectivity)介紹
本質
- sun 公司官方定義的一套操作所有關系型數據庫的規范,即接口。
- 各個數據庫廠商去實現這套接口,提供數據庫驅動 jar 包。
- 我們可以使用這套接口(JDBC)編程,真正執行的代碼是驅動 jar 包中的實現類。
數據庫連接池
- 數據庫連接池是個容器,負責分配、管理數據庫連接 (Connection)
- 它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個
- 釋放空閑時間超過最大空閑時間的連接,來避免因為沒有釋放連接而引起的數據庫連接遺漏
優勢
- 資源重用
- 提升系統響應速度
- 避免數據庫連接遺漏
注:springboot默認的數據庫連接池 Hikari
小結:
- 是一個容器,負責分配、管理數據庫連接 (Connection)
- 優勢:資源復用、提升系統響應速度
- 接口:DataSource
- 產品:C3P0、DBCP、Druid、Hikari
lombok
- 是一個實用的Java類庫,能通過注解的形式自動生成構造器,getter/setter, equals , hashcode,toString 等方法,并可以自動化生成日志變量,簡化java開發,提高效率
注解 | 作用 |
---|---|
@Getter/@Setter | 為所有的屬性提供 get/set 方法 |
@ToString | 會給類自動生成易閱讀的 toString 方法 |
@EqualsAndHashCode | 根據類所擁有的非靜態字段自動重寫 equals 方法和 hashCode 方法 |
@Data | 提供了更綜合的生成代碼功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 為實體類生成無參的構造器方法 |
@AllArgsConstructor | 為實體類生成除了 static 修飾的字段之外帶有各參數的構造器方法 |
lombok的依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId>
</dependency>
Mybatis基礎操作
準備
- 準備數據庫表
- 創建一個新的springboot,選擇引入對應的起步依賴(mybatis,mysql)
- application.properties 中引入數據庫連接信息
- 創建對應的實體類 Emp(實體類屬性采用駝峰命名)
- 準備Mapper接口EmpMapper
注:
- Java中的
LocalDateTime
--> datetime - Java中的
LocalDate
--> date - Java中的屬性采用大駝峰命名,數據庫中采用下劃線命名
刪除
@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);
}
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test(){int delete = userMapper.delete(12);sout(delete);}
}
注:如果mapper接口方法形參只有一個普通連續的參數,#{} 里面的屬性名可以隨便寫
- #{} 生成預編譯SQL,會自動設置參數值
- 預編譯SQL
- 性能更高
- 更安全(防止SQL注入)
- ${}
- 拼接SQL,存在SQL注入問題
新增
@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);
}
注:name是emp中的屬性名
主鍵返回:在數據添加成功后,許喲啊獲取插入數據庫數據的主鍵
實現
@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("... values(#{name})")public void insert(Emp emp);
會將主鍵封裝到emp實類的 id 屬性中
更新
@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);@Update("...")public void update(Emp emp);}
查詢
@Mapper
public interface UserMapper {@Select("select * from user")public Emp list();
}
-
數據封裝
- 實體類屬性名 和 數據庫表查詢返回的字段名一致,mybatis會自動封裝
- 如果實體類屬性 和 數據庫表查詢返回的字段名不一致,不能自動封裝
-
解決方案
- 起別名
- 通過 @Results注解手動映射封裝
- 開啟mybatis的駝峰命名自動映射的開關
@Mapper
public interface UserMapper {@Select("select user_name userName from user")public Emp list();
}
@Mapper
public interface UserMapper {@Result({@Resule(coulmn = "user_name", property = "userName")@Resule(coulmn = "xxx", property = "xxx")})@Select("select user_name UserName from user")public Emp list();
}
條件查詢 中使用concat
的案例
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
XML映射文件
- 規范
- XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下
- XML映射文件的namespace屬性為Mapper接口全限定名一致
- XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致
- 復雜的MySQL,推薦使用XML
注:到官網找到配置SQL語句的XML的約束
- 插件介紹
- MybatisX是一款基于IDEA的快速開發Mybatis的插件,為效率而生
動態SQL
例子:
<select id="list" resultType="com.itheima.pojo.Emp">select id, username, password, name, gender, image, job,entrydate, dept_id, create_time, update_time from empwhere<if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc
</select>
- <where>
- 動態生成where (如果if 里面都不成立,就不會生成where)
- 自動去除多余的
and
,or
- <set>
- 動態生成 set
- 自動去除
,
- 用于
update
語句中
- <if>
- 用于判斷條件是否成立,使用test屬性進行判斷,如果條件為true,則拼接SQL
- <foreach>
- collection:遍歷的集合
- item:遍歷出來的元素
- open:遍歷開始前拼接的SQL片段
- close:遍歷結束后拼接的SQL片段
- <sql><include>
- 提高SQL的復用性
- sql --> 需要一個id
- include --> refid 指定引入的sql