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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis(一)——基本架构、CURD、ResultMap、日志、分页

發布時間:2025/3/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis(一)——基本架构、CURD、ResultMap、日志、分页 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 簡介
  • 2. 程序的基本架構
  • 3. CURD 增刪改查
  • 4. 配置文件
  • 5. ResultMap結果集映射
  • 6. 日志
  • 7. 分頁

1. 簡介

MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。
MyBatis 本是apache的一個開源項目iBatis,需要在 Github 上下載。

2. 程序的基本架構

(1)在MySQL中新建一個數據庫

(2)通過Maven導Jar包

<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zz</groupId><artifactId>MyBatis</artifactId><version>1.0-SNAPSHOT</version><!--導入依賴--><dependencies><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!--操作數據庫--><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.12</version></dependency></dependencies></project>

(3)編寫配置文件,配置數據庫連接
在main目錄的resources目錄下創建mybatis-config.xml配置文件

<?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><!--環境--><!--默認開發環境,test為測試環境--><environments default="development"> <environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis? useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments> </configuration>

(4)編寫一個工具類操作數據庫
在main目錄的java目錄下創建一個工具包util,在包下創建MyBatisUtils類

package com.zz.utils;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 MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml"; //獲取資源InputStream inputStream = Resources.getResourceAsStream(resource); //把資源變成一個流// 工廠模式sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}// 從SqlSessionFactory中獲取sqlSession的連接public static SqlSession getSession(){return sqlSessionFactory.openSession();} }

(5)編寫一個實體類
在mian目錄的java目錄下創建一個實體包pojo,在包下創建User類
由于在前面的依賴中導入了Lombok包,就方便了實體類的編寫

package com.zz.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class User {private int id;private String name;private String pwd; }

(6)編寫一個操作用戶的接口類
在mian目錄的java目錄下創建一個接口包mapper,在包下創建userMapper類

package com.zz.mapper;import com.zz.pojo.User;import java.util.List;// 操作用戶的接口類 public interface UserMapper {List<User> getUserList(); }

(7)編寫一個實現接口類的配置文件
在main目錄的resources目錄下跟java目錄下一樣,創建一個接口包mapper,在包下創建UserMapper.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.zz.mapper.UserMapper"><!--id對應接口類中的方法,返回的是一個具體的User,要寫包名--> <!--從user表中查詢--> <select id="getUserList" resultType="com.zz.pojo.User">select * from user;</select></mapper>

原來我們需要編寫接口實現類,使用了Mybatis之后,我們可以專注編寫SQL,使用配置文件代替編寫接口的實現類。

  • 好處,程序運行起來之后,我依舊可以動態修改代碼,解耦。
  • 注意點:①namespace 綁定對應的接口;②具體操作(CRUD)id對應接口中的方法。

(8)把這個配置文件UserMapper.xml 注冊到mybatis-config.xml配置文件中

在configuration標簽中添加如下代碼:

<mappers><mapper resource="com/zz/mapper/UserMapper.xml"/></mappers>

(9)測試運行
在test目錄下的java目錄下創建一個測試類test

import com.zz.mapper.UserMapper; import com.zz.pojo.User; import com.zz.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession;import java.util.List;public class Test {public static void main(String[] args) {// 1、 獲取SqlSession, 執行sql使用的SqlSession session = MyBatisUtils.getSession();// 2、通過 session.getMapper(Class ) 獲得接口UserMapper mapper = session.getMapper(UserMapper.class);//3.使用接口中的方法,獲得用戶列表List<User> userList = mapper.getUserList();for (User user : userList) {System.out.println(user);}} }

運行結果如下:

整個項目的目錄如下:

3. CURD 增刪改查

  • 固定操作
    • 編寫接口
    • 編寫接口對應的SQL配置文件,一定要確保配置文件和SQL的正確性
    • 編寫測試類測試

只需要編寫 UserMapper.java、 UserMapper.xml、Test.java文件

(1)通過id 查詢用戶 User selectById(int id);

在xml 中獲取 xx id的寫法:id=#{xx}

UserMapper.java文件:

package com.zz.mapper; import com.zz.pojo.User; import java.util.List;// 操作用戶的接口類 public interface UserMapper {//List<User> getUserList();User selectById(int id); }

UserMapper.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.zz.mapper.UserMapper"><!--id對應接口類中的方法,返回的是一個具體的User,要寫包名--> <!--從user表中查詢--><select id="getUserList" resultType="com.zz.pojo.User">select * from user;</select><select id="selectById" resultType="com.zz.pojo.User">select * from user where id=#{1}</select></mapper>

Test.java文件:

import com.zz.mapper.UserMapper; import com.zz.pojo.User; import com.zz.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession;import java.util.List;public class Test {public static void main(String[] args) {// 1、 獲取SqlSession, 執行sql使用的SqlSession session = MyBatisUtils.getSession();// 2、通過 session.getMapper(Class ) 獲得接口UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectById(1);System.out.println(user);} }

運行結果:

(2)通過用戶名和密碼查詢用戶 User selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);
(其余代碼與(1)相同,以下雷同)
UserMapper.java文件:

// 多個參數如何操作,必須要增加注解 @ParamUser selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);

UserMapper.xml文件:

<select id="selectByUsernamePwd" resultType="com.zz.pojo.User">select * from user where name = #{username} and pwd = #{pwd}</select>

Test.java文件:

User user = mapper.selectByUsernamePwd("小明","123456");System.out.println(user);

運行結果:

(3)新增一個用戶 int addUser(User user);
UserMapper.java文件:

// 新增一個用戶 , 對象的情況下,直接可以拿到對象的屬性int addUser(User user);

UserMapper.xml文件:

<insert id="addUser" parameterType="com.zz.pojo.User">insert into `user`(`id`,`name`,`pwd`) values (#{id},#{name},#{pwd});</insert>

Test.java文件:

int res = mapper.addUser(new User(4,"小亮","123456"));session.commit();//提交事務if(res>0){System.out.println("增加用戶成功!");}

運行結果:


(4)修改用戶信息 int updateUser(User user);
UserMapper.java文件:

// 修改用戶信息int updateUser(User user);

UserMapper.xml文件:

<update id="updateUser" parameterType="com.zz.pojo.User">update `user` set `name` = #{name},pwd = #{pwd} where id = #{id} ;</update>

Test.java文件:

int res = mapper.updateUser(new User(4,"小花","123456"));session.commit();//提交事務if(res>0){System.out.println("修改用戶成功!");}

運行結果:

(5)刪除一個用戶 int deleteUserByID(int id);
UserMapper.java文件:

// 刪除用戶int deleteUserById(int id);

UserMapper.xml文件:

<delete id="deleteUserById" parameterType="com.zz.pojo.User">delete from user where id = #{id} </delete>

Test.java文件:

int res = mapper.deleteUserById(4);session.commit();//提交事務if(res>0){System.out.println("刪除用戶成功!");}

運行結果:

注意點:

(1)多個參數一定要增加 @Param 注解

(2)增刪改一定要增加事務提交

(3)增刪改,標簽一定要對應,參數類型必須要寫

(4)增刪改不用寫返回值,查詢,必須寫返回值,集合、泛型中的內容(具體的對象)

4. 配置文件

MyBatis的核心配置文件是mybatis-config.xml,它的核心配置結構如下:

元素的標簽次序不能修改,必須按照上圖的結構順序!

(1)配置mapppers映射器為掃描包
當有多個配置文件UserMapper.xml 時不用一 一寫注冊到mybatis-config.xml配置文件中的代碼

<mappers><package name="com.zz.mapper"/> </mappers>

(2)配置db.properties 讓配置文件讀取
在resources目錄下創建一個db.properties 文件,代碼如下:

driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis? useUnicode=true&characterEncoding=utf8&useSSL=false username=root password=123456

mybatis-config.xml中的開發環境就可以簡化為以下寫法:

<environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>

(3)配置類型的別名,簡化開發
在mybatis-config.xml中添加包的別名配置

<!--包的別名配置--><typeAliases><package name="com.zz.pojo"/></typeAliases>

所以在UserMapper.xml中就可以簡化包的寫法,直接寫User

<select id="getUserList" resultType="User">select * from user;</select>

5. ResultMap結果集映射

處理數據庫中的字段名和實體類中的屬性名不一致的問題
實體類:

public class User {private int id;private String name;private String password; }

數據庫:

一個是pwd,而另一個是password

在接口的配置文檔中xxMapper.xml 中,添加如下代碼:

<!-- 結果集映射resultMap,MyBatis推薦的 --><resultMap id="UserMap" type="User"><!-- 數據庫字段和實體類屬性的映射關系 --><id column="id" property="id"/><!-- 細節問題: 主鍵一般使用id標簽,其與字段resultcolumn 對應數據庫中的列名property 對應實體類中的屬性名--><result column="name" property="name"/><result column="pwd" property="password"/></resultMap><select id="selectUserById" resultMap="UserMap">select id,name,pwd from user where id = #{id}</select>

運行結果:

添加了結果集映射后,密碼就能查詢得出來。

注意:如果屬性名和數據庫的列名一致 ,這個時候mybatis 會幫我們自動推斷!=>自動映射
如果屬性名和數據庫的列名,不一致 ,手動實現映射

6. 日志

MyBatis中默認的日志:

<settings><!--配置日志,就可以看到具體的SQL信息,從而找到出錯的原因!--><setting name="logImpl" value="STDOUT_LOGGING"/> </settings>

工作中我們用的更多的 log4j

使用Log4j 步驟
(1)導入包依賴

<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

(2)編寫log4j的配置文件

在resources目錄下創建log4j.properties配置文件,代碼如下:

### 設置### log4j.rootLogger = debug,stdout,D,E### 輸出信息到控制抬 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 輸出DEBUG 級別以上的日志到=E://logs/error.log ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ./log/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 輸出ERROR 級別以上的日志到=E://logs/error.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =./log/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout

(3)修改日志實現為 Log4j,注意大小寫問題即可

<settings><!--配置日志,就可以看到具體的SQL信息,從而找到出錯的原因!切換為Log4j 的之后,大小寫問題,全大寫--><setting name="logImpl" value="LOG4J"/> </settings>

(4)假設我們要使用Log4j 的類去打印日志

import com.zz.mapper.RMapper; import com.zz.pojo.User; import com.zz.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger;public class Test02{// 注意導入包的問題 org.apache.log4j.Loggerstatic Logger logger = Logger.getLogger(Test02.class);public static void main(String[] args) {SqlSession session = MyBatisUtils.getSession();RMapper mapper = session.getMapper(RMapper.class);System.out.println("1231321222222");// 普通的輸出// 通過log4j 可以將日志實現細粒度的控制;logger.error("1231321222222"); // 錯誤信息logger.info("1231321222222"); // 提示信息logger.debug("1231321222222");// 屬性名和字段不一致!User user = mapper.selectUserById(1);System.out.println(user);} }

7. 分頁

作用:提高服務器性能!按照一小部分一小部分的來處理我們的數據!

在SQL中使用limt來進行分頁

-- 語法 Select * from user limit startIndex,Pagesize

在Java中的分頁如下:

(1)接口RMapper中的編寫

package com.zz.mapper;import com.zz.pojo.User;import java.util.HashMap; import java.util.List;// 測試結果集映射問題 public interface RMapper {// 帶分頁的操作// 參數如果超過兩個,可以使用map來進行傳遞指// key valueList<User> selectUserByLimit(HashMap<String, Integer> map); }

(2)接口的配置文件RMapper.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.zz.mapper.RMapper"><!-- 非基本類型之外的數據類型,List,Map,需要顯示的定義 --><select id="selectUserByLimit" parameterType="map" resultMap="UserMap">select * from user limit #{startIndex},#{pageSize}</select><!-- 結果集映射resultMap,MyBatis推薦的 --><resultMap id="UserMap" type="User"><!-- 數據庫字段和實體類屬性的映射關系 --><id column="id" property="id"/><!-- 細節問題: 主鍵一般使用id標簽,其與字段resultcolumn 對應數據庫中的列名property 對應實體類中的屬性名--><result column="name" property="name"/><result column="pwd" property="password"/></resultMap><select id="selectUserById" resultMap="UserMap">select id,name,pwd from user where id = #{id}</select></mapper>

(3)測試類中的編寫

import com.zz.mapper.RMapper; import com.zz.pojo.User; import com.zz.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger;import java.util.HashMap; import java.util.List;public class Test02{// 注意導入包的問題 org.apache.log4j.Loggerstatic Logger logger = Logger.getLogger(Test02.class);public static void main(String[] args) {SqlSession session = MyBatisUtils.getSession();RMapper mapper = session.getMapper(RMapper.class);int currentPage=1; //第幾頁int pageSize=2; //每頁顯示幾個HashMap<String, Integer> map = new HashMap<String, Integer>();map.put("startIndex",(currentPage-1)*pageSize);map.put("pageSize",pageSize);List<User> users = mapper.selectUserByLimit(map);for (User user : users) {System.out.println(user);}} }

(4)運行結果

總結

以上是生活随笔為你收集整理的MyBatis(一)——基本架构、CURD、ResultMap、日志、分页的全部內容,希望文章能夠幫你解決所遇到的問題。

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