日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

对于Java的MyBatis的入门

發布時間:2024/3/13 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于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

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--MyBatis的核心配置文件 configuration就是根標簽--> <configuration><!--數據庫環境配置--><environments default="en"><environment id="en"><!--MyBatis的事務管理 采用的是JDBC事務控制--><transactionManager type="JDBC"/><!--MyBatis連接池配置 使用MyBatis默認的POOLED--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><!--數據庫名稱--><property name="url" value="jdbc:mysql://localhost:3306/userbe"/><!--數據庫賬號--><property name="username" value="root"/><!--數據庫密碼--><property name="password" value="123456"/></dataSource></environment></environments><!--mappers就對應dao接口映射文件--><!--引入dao接口映射文件 注意:需要寫全路徑--><mappers><mapper resource="com/demon/dao/UserDao.xml"/></mappers></configuration>

    注意: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的入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。