?💕喜歡的朋友可以關注一下,下次更新不迷路!💕(●'?'●)
目錄
一、Mybatis為何物?👌
二、快速入門🤣
?1、新建項目😊
2、數據庫建表😊
3、導入依賴的jar包😊
4、根據表建pojo類😊
5、編寫mapper映射文件(編寫sql)😊
?6、編寫全局配置文件(主要是配置數據源信息)😊
7、測試😊
三、快速入土😢
代理開發😂
1、定義與SQL映射文件同名的Mapper接口,并且將Mapper接口和SQL映射文件放置在同一目錄下。
2、設置SQL映射文件的namespace屬性為Mapper接口全限定名。
3、在Mapper接口中定義方法,方法名就是SQL映射文件中sql語句的id,并保持參數類型和返回值類型一致。
4、通過SqlSession的getMapper方法獲取Mapper接口的代理對象,并調用對應方法。
?Mybatis核心配置--mybatis-config.xml😂
1、可以連接多個數據庫
?2、配置標簽
案例😂
1、?建表
2、實體類
3、測試類
4、mybatisx插件
根據方法自動生成mapper映射文件
?5、查詢(查詢所有)
6、查看詳情(根據id查詢一個)
7、條件查詢
?根據參數接收(無參/一個參數/兩個參數/)
散裝參數(模糊匹配)
對象參數
map參數
?動態條件查詢(用戶輸入條件時,是否所有條件都會填寫。不是,哥們🤣👌)
?使用if,choose,when設定條件
?8、添加
?主鍵返回
?9、修改
修改全部字段
?修改動態字段
10、刪除
單個刪除
批量刪除
?注解開發😍
?
一、Mybatis為何物?👌
🤦?♂?惡臭的描述:?MyBatis 是一個優秀的持久層框架,它對JDBC的操作數據庫的過程進行封裝,讓開發者只需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等JDBC繁瑣的過程代碼。
??舒服的描述:
不需要手動編寫 JDBC 代碼來執行 SQL 語句,也不需要處理數據庫連接的創建和關閉。
所有的數據庫操作都被抽象成了簡單的 Mapper 方法調用。 (偉大無需多言!)
Mybatis中文官網
二、快速入門🤣
?前言:
完整結構圖
只需要通過如下幾個步驟,即可用mybatis快速進行持久層的開發
- 編寫全局配置文件
- 編寫mapper映射文件
- 加載全局配置文件,生成SqlSessionFactory
- 創建SqlSession,調用mapper映射文件中的SQL語句來執行CRUD操作
🤣話不多說,直接Mybatis啟動!🤣
?1、新建項目😊
java8
2、數據庫建表😊
3、導入依賴的jar包😊
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.itqingshui</groupId><artifactId>mybatis-test1</artifactId><version>1.0-SNAPSHOT</version><name>Archetype - mybatis-test1</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source> <!-- 替換為你的JDK版本 --><target>1.8</target> <!-- 替換為你的JDK版本 --></configuration></plugin></plugins></build></project>
4、根據表建pojo類😊
package pojo;import lombok.*;@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student{private Integer id;private String name;private Integer score;private Integer age;private Integer gender;
}
@Getter @Setter:省略set,get方法。
@NoArgsConstructor:建立一個無參構造器。
@AllArgsConstructor:建立一個全參構造器。
@ToString:建立一個tostring方法。
5、編寫mapper映射文件(編寫sql)😊
<?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="pojo.StudentMapper"><select id="findAll" resultType="pojo.Student">select * from student</select><insert id="insert" parameterType="pojo.Student">insert into student(name,gender,age,score) values(#{name},#{gender},#{age},#{score})</insert><delete id="delete" parameterType="int">delete from student where id=#{id}</delete><update id="update" parameterType="pojo.Student">update student set name=#{name},gender=#{gender},age=#{age},score=#{score} where id=#{id}</update></mapper>
?6、編寫全局配置文件(主要是配置數據源信息)😊
resources包下?
<?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"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false&serverTimezone=UTC"/><property name="username" value="lovertx"/><property name="password" value="1234567"/></dataSource></environment></environments><mappers><!-- 加載編寫的SQL語句 --><mapper resource="StudentMapper.xml"/></mappers>
</configuration>
7、測試😊
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 pojo.Student;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class MybatisDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();List<Student> student = sqlSession.selectList("pojo.StudentMapper.findAll");for (Student s : student){System.out.println(s);}sqlSession.close();}
}
三、快速入土😢
代理開發😂
對于
List<Student> student = sqlSession.selectList("pojo.StudentMapper.findAll");
目的:
解決原生方式中的硬編碼。
簡化后期執行SQL
?
1、定義與SQL映射文件同名的Mapper接口,并且將Mapper接口和SQL映射文件放置在同一目錄下。
在resources包下創建mapper包并放入StudentMapper.xml
2、設置SQL映射文件的namespace屬性為Mapper接口全限定名。
將
<mapper namespace="pojo.StudentMapper">
改為?
<mapper namespace="mapper.StudentMapper">
3、在Mapper接口中定義方法,方法名就是SQL映射文件中sql語句的id,并保持參數類型和返回值類型一致。
StudentMapper中?
package mapper;import pojo.Student;import java.util.List;public interface StudentMapper {List<Student> findAll();
}
4、通過SqlSession的getMapper方法獲取Mapper接口的代理對象,并調用對應方法。
StudentMapper userMapper = sqlSession.getMapper(StudentMapper.class);
userMapper.findAll().forEach(System.out::println);
?Mybatis核心配置--mybatis-config.xml😂
1、可以連接多個數據庫
可以配置多個environment,通過default屬性切換不同的environment?
<?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"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false&serverTimezone=UTC"/><property name="username" value="lovertx"/><property name="password" value="1234567"/></dataSource></environment></environments><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false&serverTimezone=UTC"/><property name="username" value="lovertx"/><property name="password" value="1234567"/></dataSource></environment></environments><mappers><!-- 加載編寫的SQL語句 --><mapper resource="mapper/StudentMapper.xml"/></mappers>
</configuration>
?2、配置標簽
案例😂
1、?建表
id:主鍵
brand_name:品牌名稱
company_name:企業名稱
ordered:排序字段
description:描述信息
status:狀態(0:禁用,1啟用)
2、實體類
package pojo;import lombok.*;@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Brand {private Integer id;private String brand_name;private String company_name;private Integer ordered;private String description;private Integer status;
}
3、測試類
4、mybatisx插件
通過點擊左邊的紅色小鳥?
?
可以找到藍色小鳥
?
?
根據方法自動生成mapper映射文件
1、第一步:在StudentMapper中
package mapper;import pojo.Student;import java.util.List;public interface StudentMapper {List<Student> findAll();Student findById(int id);
}
2、使用插件自動生成
<select id="findById" resultType="pojo.Student"></select>
3、補充實際操作
<select id="findById" resultType="pojo.Student">select * from student where id=#{id}</select>
?5、查詢(查詢所有)
1、創建BrandMapper(先寫方法,后自動寫sql)
?
package mapper;import pojo.Brand;
import java.util.List;public interface BrandMapper {List<Brand> findAll();
}
2、創建BrandMapper.xml
package mapper;import pojo.Brand;
import java.util.List;public interface BrandMapper {List<Brand> findAll();
}
?3、配置映射文件
在mybatis-config.xml添加?<mapper resource="mapper/BrandMapper.xml"/>
<mappers><!-- 加載編寫的SQL語句 --><mapper resource="mapper/StudentMapper.xml"/><mapper resource="mapper/BrandMapper.xml"/></mappers>
?4、測試類
import mapper.BrandMapper;
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 java.io.IOException;
import java.io.InputStream;public class MybatisDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper userMapper = sqlSession.getMapper(BrandMapper.class);userMapper.findAll().forEach(System.out::println);sqlSession.close();}
}
6、查看詳情(根據id查詢一個)
BrandMapper中寫:?
Brand findById(int id);
public interface BrandMapper {List<Brand> findAll();Brand findById(int id);
}
BrandMapper.xml中寫:
<select id="findById" resultType="pojo.Brand">select * from tb_brand where id = #{id}</select>
?測試類中寫:
public class MybatisDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);Brand brand = brandMapper.findById(1);System.out.println(brand);sqlSession.close();}
}
7、條件查詢
類似于實現這樣的功能:
?根據參數接收(無參/一個參數/兩個參數/)
散裝參數(模糊匹配)
因模糊匹配需要處理參數
接口方法
List<Brand> selectByCondition(@Param("status") int status, @Param("company_name") String company_name, @Param("brand_name") String brand_name);
sql語句
<select id="selectByCondition" resultType="pojo.Brand">select * from tb_brandwhere status = #{status}and brand_name like #{brand_name}and company_name like #{company_name}</select>
測試類?
public class MybatisDemo {public static void main(String[] args) throws IOException {//接收參數int status = 1;String company_name = "華為";String brand_name = "華為";//因模糊匹配,所有處理參數company_name = "%" + company_name + "%";brand_name = "%" + brand_name + "%";String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brands = brandMapper.selectByCondition(status, company_name, brand_name);for (Brand brand : brands) {System.out.println(brand);}sqlSession.close();}
}
?
對象參數
對象的屬性名稱要和參數占位符名稱一致
Mapper接口:
List<Brand> selectByCondition(Brand brand);
sql語句:
<select id="selectByCondition" resultType="pojo.Brand">select * from tb_brandwhere status = #{status}and brand_name like #{brand_name}and company_name like #{company_name}</select>
?測試類:
多了個封裝對象
public class MybatisDemo {public static void main(String[] args) throws IOException {//接收參數int status = 1;String company_name = "華為";String brand_name = "華為";//因模糊匹配,所有處理參數company_name = "%" + company_name + "%";brand_name = "%" + brand_name + "%";//封裝對象Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// List<Brand> brands = brandMapper.selectByCondition(status, company_name, brand_name);List<Brand> brands = brandMapper.selectByCondition(brand);for (Brand brand1 : brands) {System.out.println(brand1);}sqlSession.close();}
}
map參數
?Mapper接口:
List<Brand> selectByCondition(Map map);
sql語句:
<select id="selectByCondition" resultType="pojo.Brand">select * from tb_brandwhere status = #{status}and brand_name like #{brand_name}and company_name like #{company_name}</select>
測試類:
public class MybatisDemo {public static void main(String[] args) throws IOException {//接收參數int status = 1;String company_name = "華為";String brand_name = "華為";//因模糊匹配,所有處理參數company_name = "%" + company_name + "%";brand_name = "%" + brand_name + "%";//封裝對象
// Brand brand = new Brand();
// brand.setStatus(status);
// brand.setCompany_name(company_name);
// brand.setBrand_name(brand_name);Map map = new HashMap();map.put("status",status);map.put("company_name",company_name);map.put("brand_name",brand_name);String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);// List<Brand> brands = brandMapper.selectByCondition(status, company_name, brand_name);
// List<Brand> brands = brandMapper.selectByCondition(brand);List<Brand> brands = brandMapper.selectByCondition(map);for (Brand brand1 : brands) {System.out.println(brand1);}sqlSession.close();}
}
?動態條件查詢(用戶輸入條件時,是否所有條件都會填寫。不是,哥們🤣👌)
只需要修改sql語句:
<select id="selectByCondition" resultType="pojo.Brand">select * from tb_brandwhere<if test="status != null">status = #{status}</if><if test="brand_name != null and brand_name != ''">and brand_name like #{brand_name}</if><if test="company_name != null and company_name != ''">and company_name like #{company_name}</if></select>
??可是當特殊條件缺少時會出現錯誤:
Map map = new HashMap();//map.put("status",status);map.put("company_name",company_name);//map.put("brand_name",brand_name);
?解決:恒等式
將sql語句修改為:
<select id="selectByCondition" resultType="pojo.Brand">select * from tb_brand<where><if test="status != null">and status = #{status}</if><if test="brand_name != null and brand_name != ''">and brand_name like #{brand_name}</if><if test="company_name != null and company_name != ''">and company_name like #{company_name}</if></where></select>
?使用if,choose,when設定條件
<select id="selectByConditionOne" resultType="pojo.Brand">select * from tb_brandwhere<choose><!--相當于switch--><when test="status != null"><!--相當于case-->status = #{status}</when><when test="brand_name != null and brand_name != ''">brand_name like #{brand_name}</when><when test="company_name != null and company_name != ''">company_name like #{company_name}</when><otherwise><!--當用戶一個條件都不給-->1=1</otherwise></choose></select>
?8、添加
?接口方法
void add(Brand brand);
sql語句
<insert id="add">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brand_name},#{company_name},#{ordered},#{description},#{status})</insert>
?測試類
public class MybatisDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper userMapper = sqlSession.getMapper(BrandMapper.class);int status = 1;String company_name = "菠蘿手機";String brand_name = "菠蘿";int ordered = 1;String description = "美國有蘋果,中國有菠蘿";Brand brand = new Brand();brand.setStatus(status);brand.setCompany_name(company_name);brand.setBrand_name(brand_name);brand.setOrdered(ordered);brand.setDescription(description);userMapper.add(brand);
//事務提交sqlSession.commit();sqlSession.close();}
}
?主鍵返回
實現可查詢主鍵id的值
?因為事務回滾導致少了id=4
因此查詢菠蘿的id的值為5
將sql語句改為
<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brand_name},#{company_name},#{ordered},#{description},#{status})</insert>
即添加
useGeneratedKeys="true" keyProperty="id"
?9、修改
修改全部字段
實現
?Mapper接口
void update(Brand brand);
SQL語句
<update id="update">update tb_brand<set><if test="brand_name != null and brand_name != ''">brand_name = #{brand_name},</if><if test="company_name != null and company_name != ''">company_name = #{company_name},</if><if test="ordered != null">ordered = #{ordered},</if><if test="description != null and description != ''">description =#{description},status = #{status}</if>where id = #{id}</set></update>
測試類
public class UpdateTest {public static void main(String[] args) throws IOException{String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);Brand brand = new Brand();brand.setId(5);brand.setBrand_name("香飄飄");brand.setCompany_name("香飄飄");brand.setDescription("香飄飄");brand.setOrdered(100);brand.setStatus(1);brandMapper.update(brand);sqlSession.close();}
}
?修改動態字段
實現修改密碼功能(想單獨改哪個值就改哪個值)
如果調用接口卻不給參數,則數據庫會出現null值🤦?♂?
?實現
只需要在SQL語句中添加條件,添加<set>標簽
<update id="update">update tb_brand<set><if test="brand_name != null and brand_name != ''">brand_name = #{brand_name},</if><if test="company_name != null and company_name != ''">company_name = #{company_name},</if><if test="ordered != null">ordered = #{ordered},</if><if test="description != null and description != ''">description =#{description},status = #{status}</if>where id = #{id}</set></update>
10、刪除
單個刪除
Mapper接口
void delete(int id);
?SQL語句
<delete id="delete">delete from tb_brand where id = #{id}</delete>
測試類
public class DeleteTest {public static void main(String[] args) throws IOException, IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);brandMapper.delete(2);sqlSession.close();}
}
批量刪除
???????
?實現
傳id數組,sql遍歷數組,一個一個刪掉
Mapper接口
void deleteByIds(@Param("ids") int[] ids);
?SQL語句
<delete id="deleteByIds">delete from tb_brand where id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></delete>
?測試類
public class DeleteTest2 {public static void main(String[] args) throws IOException, IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);int []ids = {5,6};brandMapper.deleteByIds(ids);sqlSession.close();}
}
?注解開發😍
優點:對于簡單的SQL語句使用注解開發會非常便捷。
@Select("select * from tb_user where id = #{id}")
public User selectById(int id);
查詢:@Select
添加:@Insert
修改:? @Update
刪除:@Delete?
缺點:對于復雜的SQL語句應使用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.BrandMapper"><insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brand_name},#{company_name},#{ordered},#{description},#{status})</insert><update id="update">update tb_brand<set><if test="brand_name != null and brand_name != ''">brand_name = #{brand_name},</if><if test="company_name != null and company_name != ''">company_name = #{company_name},</if><if test="ordered != null">ordered = #{ordered},</if><if test="description != null and description != ''">description =#{description},status = #{status}</if>where id = #{id}</set></update><delete id="delete">delete from tb_brand where id = #{id}</delete><delete id="deleteByIds">delete from tb_brand where id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></delete><select id="findAll" resultType="pojo.Brand">select * from tb_brand</select><select id="findById" resultType="pojo.Brand">select * from tb_brand where id = #{id}</select><!-- <select id="selectByCondition" resultType="pojo.Brand">-->
<!-- select * from tb_brand-->
<!-- where status = #{status}-->
<!-- and brand_name like #{brand_name}-->
<!-- and company_name like #{company_name}-->
<!-- </select>--><select id="selectByCondition" resultType="pojo.Brand">select * from tb_brand<where><if test="status != null">and status = #{status}</if><if test="brand_name != null and brand_name != ''">and brand_name like #{brand_name}</if><if test="company_name != null and company_name != ''">and company_name like #{company_name}</if></where></select><select id="selectByConditionOne" resultType="pojo.Brand">select * from tb_brandwhere<choose><!--相當于switch--><when test="status != null"><!--相當于case-->status = #{status}</when><when test="brand_name != null and brand_name != ''">brand_name like #{brand_name}</when><when test="company_name != null and company_name != ''">company_name like #{company_name}</when><otherwise><!--當用戶一個條件都不給-->1=1</otherwise></choose></select>
</mapper>
?💕完結撒花!💕
?
?