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