对于Java的MyBatis的入门
目錄????????????????
使用mybatis進行簡單的查詢案例:
? ? ? ? ?使用Mybatis完成CRUD:
? ? ? ? ? ? ? ? 增加用戶:
? ? ? ? ? ? ? ?1.增加用戶需要注意的是如果需要返回增加的id有2種方式(沒有寫頂部代碼了復制上面即可,放入關鍵代碼)
? ? ? ? ? ? ? ? ? ? ? ? 2.主鍵不一定是int類型... 主鍵也可以是字符串類型。有數據庫合并,數據庫集群的時候。
? ? ? ? ? ? ? ? ?刪除用戶:
? ? ? ? ? ? ? ? ?修改用戶:需要先根據id查用戶在進行修改
? ? ? ? ? ? ? ? ?查詢用戶:
? ? ? ? ? ? ? ? 思維導圖:?
首先知道什么是框架:
????????框架(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法;另一種定義認為,框架是可被應用開發者定制的應用骨架。前者是從應用方面而后者是從目的方面給出的定義。簡單來說框架是軟件的半成品. 我們開發者使用框架開發, 更加的簡單, 提高開發效率。
了解什么是MyBatis:
? ? ? ? 官方介紹是:MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。簡單來說就是:持久層的一個框架, 封裝了JDBC. 操作數據庫。官網: mybatis – MyBatis 3 | Introduction
準備環境:
數據庫:
CREATE TABLE user(uid int PRIMARY KEY auto_increment,username varchar(40),sex varchar(10),birthday date,address varchar(40) );INSERT INTO `user` VALUES (null, 'zs', '男', '2021-09-08', '北京'); INSERT INTO `user` VALUES (null, 'ls', '女', '2021-09-30', '深圳'); INSERT INTO `user` VALUES (null, 'ww', '男', '2021-09-08', '上海');創建用的Maven
idea:2020.1.3版本
jdk用的1.8版本
使用mybatis進行簡單的查詢案例:
創建Maven工程(java), 添加mybatis的依賴坐標
創建pojo (javabean)
創建UserDao接口
創建UserDao映射文件 (xml配置文件)
創建MyBatis核心配置文件SqlMapConfig.xml (xml配置文件)
編寫java代碼測試
1.添加依賴
<!--1. 添加依賴--><dependencies><!--單元測試--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--MyBatis坐標--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--mysql驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--lombok 依賴--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.18</version></dependency>2.創建pojo (javabean)
@Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable {private int uid;private String username;private String sex;private Date birthday;private String address; }3.創建UserDao接口
public interface UserDao {/*** 查詢所有用戶* @return*/List<User> FindAll(); }4.創建UserDao映射文件 (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="com.demon.dao.UserDao"> <!--查詢所有用戶--><select id="FindAll" resultType="com.demon.bean.User" >SELECT * FROM user</select> </mapper>5.創建MyBatis核心配置文件SqlMapConfig.xml (xml配置文件)(引入的Dao接口的映射文件需要寫全路徑),并且內部的核心配置文件的順序不可亂放,深入了解可以百度或者走官方查看。
其中4步驟和5步驟的代碼最上開頭部分不用記知道有這個就行,可以去官網復制或者其他地方或者下面復制,但要把MyBatis核心配置文件和Dao的映射文件開頭那區分開來不是一樣的
標簽:environments : 用于配置環境,它里面可以定義多個環境,使用 ?environment來定義
? ? ? ? ? ? ? ? 到底是用哪一個環境,取決于 default屬性寫的是哪個 ?environment的id值
? ? ? ? ? ? ? ?environment : 用于定義環境,
? ? ? ? ? ? ? ? ? ? ? ?id :聲明一個標識,唯一標識
? ? ? ? ? ? ? ?????????transactionManager : 事務管理員
? ? ? ? ? ? ? ?????????dataSource :用不用連接池 用:POOLED,不用UNPOOLED,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 還有一個值是:JNDI?MyBatis 會從 JNDI 服務上(tomcat ... jboss...)查找 DataSource 實例,然后返回使用. 只有在web項目里面才有的,用的是服務器里面的. 默認會使用tomcat里面的dbcp
注意:Dao接口和Dao映射文件的地方和名字要一樣。核心配置文件需要放置在resources下
?7.編寫java代碼測試(格式建議可以用上圖那樣簡單明了)
需要注意:圖上單元測試說的,在Maven工程下或環境下他會認為你的測試類名要有test單詞,所以一般建議用testxxx這樣,簡單明了而且不用寫注釋就知道,不然會出現單元測試時候運行了不打印的情況。(在導mybatis的包時候是也就是Resources的時候是:org.apache.ibatis.io,因為早期apache公司創建mybatis時用的ibatis名字后來才改的mybatis,只不過后來沒改包名字一直用的ibatis)
import com.demon.bean.User; import com.demon.dao.UserDao; 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 org.junit.Test;import java.io.IOException; import java.io.InputStream; import java.util.List;public class TestUserDao {//查詢所有用戶@Testpublic void testFindAll() throws IOException {//1.讀取核心配置文件InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2.創建構建器SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//3.使用構建器創建SqlSessionFactory工廠SqlSessionFactory sqlSessionFactory = builder.build(is);//4.問工廠要SqlSession對象SqlSession sqlSession = sqlSessionFactory.openSession();//5.問SqlSession對象要UserDao的代理對象UserDao userDao = sqlSession.getMapper(UserDao.class);//6.直接調用方法List<User> list = userDao.FindAll();for(User user:list){System.out.println(user);}//7.關閉sqlSessionsqlSession.close();} }打印結果:
注意:打印的那出現那么多紅的是正常的,因為我用了打印出日志的依賴。
數據庫:
?--------------------------------------------------------------------------------------------------------------------------------
在上面發現單元測試類中出現了一部分代碼可封裝,所以SqlSessionFactory工具類的抽取。
注意:工具類的提交事務,提交事務: mybatis沒有默認提交事務 ,它把setAutoCommit(false), 所以對于增刪改操作,要記得提交事務。
但可以在內部修改成默認的提交事務。也就是:sqlSessionFactory.openSession(true);自動提交事務。反之false
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 SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory =null;//使用靜態代碼塊是為了使得工廠只有一個static {try {//讀取核心配置文件InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//創建構建器SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//使用構建器創建SqlSessionFactory工廠sqlSessionFactory = builder.build(is);} catch (IOException e) {e.printStackTrace();}}/*** 獲得SqlSession對象* @return*/public static SqlSession getsqlSession(){//問工廠要SqlSession對象,//openSession(true)手動修改為自動提交事務。false為不自動return sqlSessionFactory.openSession();}/***關閉sqlSession提交事務* @param sqlSession*/public static void commit(SqlSession sqlSession){sqlSession.commit();sqlSession.close();}/***關閉sqlSession* @param sqlSession*/public static void close(SqlSession sqlSession){sqlSession.close();} }使用Mybatis完成CRUD:
增加用戶:
UserDao接口:
/*** 添加用戶* @param user* @return 受影響的行數*/int AddUser(User user);??UserDao.xml(Dao接口的映射文件):
<insert id="AddUser" parameterType="com.demon.bean.User" keyProperty="uid" >INSERT INTO user VALUES(null , #{username} , #{sex} , #{birthday} , #{address}) </insert>?單元測試:
//添加一個用戶@Testpublic void testAddUser() throws IOException {SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();//問SqlSession對象要UserDao的代理對象UserDao userDao = sqlSession.getMapper(UserDao.class);//直接調用方法User user = new User();user.setUsername("zs1");user.setSex("男");user.setBirthday(new Date());user.setAddress("深圳");userDao.AddUser(user);//關閉sqlsession和提交事務SqlSessionFactoryUtils.commit(sqlSession);}1.增加用戶需要注意的是如果需要返回增加的id有2種方式(沒有寫頂部代碼了復制上面即可,放入關鍵代碼)
1.1用SelectKey標簽添加
<!--添加用戶--><insert id="AddUser" parameterType="com.demon.bean.User" keyProperty="uid" >INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})<!--selectKey: 主要使用來獲取主鍵idkeyProperty : 用參數user里面的什么屬性來接收主鍵值resultType: 接收主鍵的屬性是什么類型order: 只能寫兩個值: before | afterBEFORE: 先執行獲取id的操作,再去執行添加數據的操作AFTER : 先執行添加的操作,再去執行獲取id的操作。--><selectKey keyProperty="uid" resultType="int" order="AFTER"><!--不需要多了解入門階段-->SELECT LAST_INSERT_ID()</selectKey></insert>1.2.用屬性配置?
<!--添加用戶,獲取id主鍵返回keyProperty :表示,使用參數user對象里面的什么屬性來接收主鍵iduseGeneratedKeys: true: 使用數據庫創建自增生成給出來的id值false: 不是用數據庫創建出來的id值,由mybatis自己生成給出來id值。--> <insert id="AddUser" parameterType="com.demon.bean.User" keyProperty="uid" useGeneratedKeys="true">INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address}) </insert>2.主鍵不一定是int類型... 主鍵也可以是字符串類型。有數據庫合并,數據庫集群的時候。
字符串類型的主鍵通常就是UUID生成的一串32個字符的字符串。 數據庫合并!
<!--添加用戶,獲取id主鍵返回,但是主鍵是字符串類型的主鍵--><insert id="AddUser" parameterType="com.demon.bean.User" >INSERT INTO t_user VALUES(null , #{username} , #{sex} , #{birthday} , #{address})<selectKey keyProperty="myId" resultType="String" order="BEFORE">select uuid()</selectKey></insert>?刪除用戶:
UserDao接口:
/*** 刪除一個用戶* @param id* @return*/int deleteUser(int id);?UserDao.xml(Dao接口的映射文件):
<!--刪除用戶--><delete id="deleteUser" parameterType="int">delete from user where uid=#{uid}</delete>單元測試:
//刪除一個用戶@Testpublic void testdeleteUser() throws IOException {SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();//5.問SqlSession對象要UserDao的代理對象UserDao userDao = sqlSession.getMapper(UserDao.class);//6.直接調用方法userDao.deleteUser(4);//關閉sqlsession和提交事務SqlSessionFactoryUtils.commit(sqlSession);}修改用戶:需要先根據id查用戶在進行修改
UserDao接口:
public interface UserDao { /*** 查詢一條用戶* @return 受影響的行數*/User FindUser(int uid);/*** 修改用戶* @param user* @return*/int updateUser(User user); }?UserDao.xml(Dao接口的映射文件):
<!--查找一條用戶信息--><select id="FindUser" resultType="com.demon.bean.User" parameterType="int">SELECT * FROM user WHERE uid=#{uid}</select> <!--修改用戶--><update id="updateUser" parameterType="com.demon.bean.User">update user set username=#{username} , sex=#{sex} , birthday=#{birthday} , address=#{address} where uid=#{uid}</update>單元測試:記得一定要提交事務否則數據庫不會更改信息
public class TestUserDao { //修改用戶@Testpublic void testupdateUser() throws IOException {SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();UserDao userDao = sqlSession.getMapper(UserDao.class);//直接調用方法User user = userDao.FindUser(1);user.setUsername("王五");int i = userDao.updateUser(user);System.out.println(i);//關閉sqlsession和提交事務SqlSessionFactoryUtils.commit(sqlSession);} }查詢用戶:
有以下的情況:
1.查詢一條語句(參數為:id,name......)
? ? ? ? 1.1.參數一個(#{}和${}區別在查詢代碼后面)
? ? ? ? ? ? ? ? 1.1.1#{}?
? ? ? ? ? ? ? ? 1.1.2${}
? ? ? ? 1.2參數為多個
? ? ? ? 1.3參數為多個且類型不同(注意:可以不給parameterType賦值)
UserDao接口:
/*** 查詢一條用戶* @return 受影響的行數*///普通查詢一條語句//id查詢User FindUser(int uid);//字符串查詢User FindUser7(String user) ;//用mybatis自帶的@Param注解取別名User FindUser5(@Param("username") String username,@Param("sex") String sex);UserDao.xml(Dao接口的映射文件):
<!--查找一條用戶信息--><!--用id查詢--><select id="FindUser" resultType="com.demon.bean.User" parameterType="int">SELECT * FROM user WHERE uid=#{uid}</select><!--或者用#{}或${value}查詢--><select id="FindUser7" resultType="com.demon.bean.User" parameterType="string">SELECT * FROM user WHERE username=#{username}<!--或者用${value}查詢 注:${}內部必須為value否則報錯SELECT * FROM user WHERE username='${value}'--></select><!--用別名解決多個參數查一條數據時,如果參數不同類型可以直接不給parameterType賦值><select id="FindUser5" resultType="com.demon.bean.User" parameterType="string"> select * from user where username=#{username} and sex=#{sex}</select>單元測試:
@Testpublic void testFindUser() throws IOException {SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();//問SqlSession對象要UserDao的代理對象UserDao userDao = sqlSession.getMapper(UserDao.class);//直接調用方法//用id查詢User user= userDao.FindUser(1);//用字符串查詢//User user= userDao.FindUser7("王五");//查詢一條數據多個參數時候//User user= userDao.FindUser5("王五","男");System.out.println(user);//7.關閉sqlSessionSqlSessionFactoryUtils.close(sqlSession);}2.查詢多條語句
3.模糊查詢:4種
? ? ? ? ?3.1外拼接%方法
? ? ? ? ?3.2sql語句內追加%方法
? ? ? ? ? ? ? ? ?3.2.1"%"#{}"%"
? ? ? ? ? ? ? ? ?3.2.2"%${}%"
? ? ? ? ? ? ? ? ?3.2.3concat("%",#{},"%")? (推薦)
UserDao接口:
/*** 模糊查詢* @param* @return*/List<User> FindUser1(String username);List<User> FindUser2(String username);List<User> FindUser3(String username);?UserDao.xml(Dao接口的映射文件):
<!--模糊查詢--><!--使用concat()--><select id="FindUser1" parameterType="string" resultType="com.demon.bean.User">select * from t_user where username like concat("%",#{username},"%")</select><!--使用#{}--><select id="FindUser2" parameterType="string" resultType="com.demon.bean.User">select * from user where username like "%"#{username}"%"</select><!--使用${}--><select id="FindUser3" resultType="com.demon.bean.User" parameterType="com.demon.bean.User"><!--必須下面格式寫否則報錯也就是單引號或雙引號,引起中間內容${}內部也必須為value否則報錯-->select * from user where username like '%${value}%'</select>單元測試:(把方法名改了就可驗證)
//模糊查詢@Testpublic void testFindUser1() throws IOException {SqlSession sqlSession = SqlSessionFactoryUtils.getsqlSession();//5.問SqlSession對象要UserDao的代理對象UserDao userDao = sqlSession.getMapper(UserDao.class);//6.直接調用方法List<User> list = userDao.FindUser3("a");System.out.println(list);//7.關閉sqlSessionSqlSessionFactoryUtils.close(sqlSession);}注意:?#{}和${}區別
#{}表示一個占位符號
-
通過#{}可以實現 preparedStatement 向占位符中設置值,自動進行 java 類型和 數據庫 類型轉換
-
#{}可以有效防止 sql 注入
-
#{}可以接收簡單類型值或 pojo 屬性值
-
如果 parameterType 傳輸單個簡單類型值(String,基本類型), #{} 括號中可以是 value 或其它名稱。
${}表示拼接 sql 串
-
通過${}可以將 parameterType 傳入的內容拼接在 sql 中且不進行 jdbc 類型轉換.
-
${}不能防止 sql 注入
-
${}可以接收簡單類型值或 pojo 屬性值
-
如果 parameterType 傳輸單個簡單類型值.${}括號中只能是 value
=====以上就是小白的我對于mybatis的一個入門的理解,如果有錯希望能幫我指出。QAQ=====
下面也是我用xmind做的一個
?思維導圖:?
總結
以上是生活随笔為你收集整理的对于Java的MyBatis的入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社交课程系列简介
- 下一篇: Java狐仙ol,狐仙八大职业介绍 简要