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包
(3)編寫配置文件,配置數據庫連接
在main目錄的resources目錄下創建mybatis-config.xml配置文件
(4)編寫一個工具類操作數據庫
在main目錄的java目錄下創建一個工具包util,在包下創建MyBatisUtils類
(5)編寫一個實體類
在mian目錄的java目錄下創建一個實體包pojo,在包下創建User類
由于在前面的依賴中導入了Lombok包,就方便了實體類的編寫
(6)編寫一個操作用戶的接口類
在mian目錄的java目錄下創建一個接口包mapper,在包下創建userMapper類
(7)編寫一個實現接口類的配置文件
在main目錄的resources目錄下跟java目錄下一樣,創建一個接口包mapper,在包下創建UserMapper.xml文件,跟接口類同名且綁定接口類。
原來我們需要編寫接口實現類,使用了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
運行結果如下:
整個項目的目錄如下:
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文件:
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文件:
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文件:
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文件:
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配置文件中的代碼
(2)配置db.properties 讓配置文件讀取
在resources目錄下創建一個db.properties 文件,代碼如下:
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中添加包的別名配置
所以在UserMapper.xml中就可以簡化包的寫法,直接寫User
<select id="getUserList" resultType="User">select * from user;</select>5. ResultMap結果集映射
處理數據庫中的字段名和實體類中的屬性名不一致的問題
實體類:
數據庫:
一個是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)導入包依賴
(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、日志、分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring(二)——Junit测试工具
- 下一篇: MyBatis(二)——多对一、一对多