mybatis else,mybatis 不等于_MyBatis 第一天

 2023-10-05 阅读 33 评论 0

摘要:1. Mybatis概述1.1. Mybatis是什么mybatis else、Mybatis是一個持久層框架。1.2. Mybatis的作用Mybatis是一個持久層框架,當然作用就是操作數據庫的(增刪改查).java idea、1.3. 為什么需要學習MybatisMybatis的理念:讓開發者是10%的代碼就可以實現數據庫的操作。

fa7833378dcf3dc6ade52845cda300ee.png

1. Mybatis概述

1.1. Mybatis是什么

mybatis else、Mybatis是一個持久層框架。

1.2. Mybatis的作用

Mybatis是一個持久層框架,當然作用就是操作數據庫的(增刪改查).

java idea、1.3. 為什么需要學習Mybatis

Mybatis的理念:讓開發者是10%的代碼就可以實現數據庫的操作。

解決方案: 持久層(DAO)的零實現. 所謂的零實現,就是不用寫實現類代碼,直接使用接口就可以操作數據庫.

java lambda foreach。Mybatis的定義,提高開發的效率!!!真的寫很少代碼!!!就可以增刪改查。

1.4. Mybatis的作用

Mybatis框架能夠讓我們以最少的代碼就可以操作數據庫。從而提高開發的效率!!!

mybatis、--如何將代碼減少呢?

持久層的零實現 (不需要寫實現類)

可以自動將數據封裝到對象里面不需要手工編寫映射的關系

1.5. Mybatis配置流程圖

9c2ec3f8ed54e6c0a19d88a76baeee00.png

b3cc6245ffe282195670c5a6d71ac9d6.png

Resources:資源類,用于讀取總配置文件

SqlSessionFactoryBuilder:會話工廠構造類,通過讀取的總配置文件構建會話工廠

SqlSessionFactory:會話工廠

SqlSession:會話,就是操作數據庫的操作類

2. 入門示例

2.1. 配置流程說明

--獲得數據庫連接

第一步:導入包(任何框架需要的事情)

第二步:創建總配置文件,文件名隨便寫

第三步:創建一個MybatisUtils工具類,(獲得操作對象)

--需求:插入數據到數據庫

第四步:創建一個映射接口

第五步:創建一個映射文件

第六步:在總配置文件加載映射文件。

第七步:編寫測試插入數據代碼

2.2. 配置步驟

2.2.1. 下載mybatis框架

https://github.com/mybatis/mybatis-3

2.2.2. 創建一個普通java項目并導入相關

8539d3e397251bb7401c3f554e8c2de9.png

2.2.3. 創建主配置文件 mybatis-config.xml

在項目的 src 下面創建 配置文件 mybatis-config.xml

具體配置參考mybatis的官方文檔即可

<?xml version="1.0" encoding="UTF-8" ?>
<!-- dtd約束 -->
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根元素: 用于配置mybatis -->
<configuration><!-- 配置mybatis的運行環境 ,可以配置多個環境,但是一次只能使用一個 default屬性 : 當前使用的環境 ,使用下面環境的id 即可  --><environments default="dev_mysql"><!-- 環境配置  id 屬性,就是當前環境的表示 --><environment id="dev_mysql"><!-- 配置MyBatis事務管理器 type屬性 :  事物類型JDBC  使用事務(正常提交commit,異常回滾事務 rollback) 默認MANAGED : 不使用事務 --><transactionManager type="JDBC"/><!-- 配置MyBatis的數據源type : 配置連接池POOLED :mybatis內置的一個連接池(默認)后期都交給spring管理了,配置 dbcp連接池,阿里巴巴的 druid連接池--><dataSource type="POOLED"><!-- 連接數據庫的操作 --><!-- 數據庫驅動 --><property name="driver" value="com.mysql.jdbc.Driver"/><!-- 連接數據庫的url --><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><!-- 連接數據庫賬號 --><property name="username" value="root"/><!-- 連接數據庫密碼 --><property name="password" value="admin"/></dataSource></environment></environments><!-- 配置映射文件 --><mappers><!-- 配置包掃描映射文件 --><!-- <package name=""/> --><!-- 配置單個映射文件 --><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

2.2.4. 創建MyBatisUtil工具類

MyBatisUtil工具類的作用主要用于 讀取配置文件,創建工廠對象,提供創建SqlSession數據庫操作對象的方法

package cn.zj.mybatis.util;import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private MyBatisUtil() {}//SqlSessionFactory 會話工廠對象private static SqlSessionFactory  factory;//類加載到JVM中就立馬執行static代碼塊,并且只會執行一次static {//資源文件String resource = "mybatis-config.xml";//try(){}catch(Exception e){} try的圓括號內部能夠自動釋放/關閉資源try(InputStream inputStream = Resources.getResourceAsStream(resource)) {//創建SqlSessionFactory 對象factory = new SqlSessionFactoryBuilder().build(inputStream);} catch (Exception e) {e.printStackTrace();}}/*** 創建SqlSession對象* @return SqlSession對*/public static SqlSession openSession() {//創建Session對象SqlSession session = factory.openSession();return session;}}

2.2.5. 創建數據庫表對應的實體類

package cn.zj.mybatis.pojo;public class User {private Integer id;private String name;private String password;private Integer age;public User() {super();}public User(Integer id, String name, String password, Integer age) {super();this.id = id;this.name = name;this.password = password;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";}}

2.2.6. 創建一個操作接口

package cn.zj.mybatis.mapper;import cn.zj.mybatis.pojo.User;/** 使用MyBatis的動態代理開發編寫代碼遵循四個原則*  1.映射文件的namespace命名空間的值必須是對應接口的全限定名2.映射文件的對應功能 id值必須等于映射接口中方法的名稱3.映射文件的參數類型必須和接口中方法的參數類型一致4.映射文件查詢的返回結果類型必須和接口的方法的返回數據類型一致,DML操作返回的受影響的行數,除外*/
public interface UserMapper {int insertUserInfo(User u);
}

2.2.7. 創建表對應的映射文件 :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">
<!-- 配置映射
namespace : 命名空間(通俗說法: 給當前映射文件的唯一標識:起一個唯一的名字)	-->
<mapper namespace="cn.zj.mybatis.pojo.UserMapper"><!-- 新增操作id: 當前功能的唯一標識,和接口方法同名parameterType : 參數的類型useGeneratedKeys:是否返回數據庫生成的主鍵 true是/false否 keyProperty : 數據庫主鍵對應java的pojo對象的屬性keyColumn : 數據表的主鍵列明--><insert id="insertUserInfo" parameterType="User" useGeneratedKeys="true"keyProperty="id"keyColumn="id"></mapper>

2.2.8. 創建測試類準備測試

//插入操作
// 新增操作
@Test
public void testInsert() throws Exception {//1.創建SqlSession操作對象SqlSession session = MyBatisUtil.openSession();//2.創建UserMapper接口的代理對象UserMapper userMapper = session.getMapper(UserMapper.class);//3.創建用戶對象User user = new User(null, "喬峰", "qf", 30);//4.執行UserMapper的插入操作userMapper.insertUserInfo(user);//5.提交事務session.commit();//6.關閉sessionsession.close();}

2.3. Mybatis框架配置文件提示問題

MyBatis的配置文件使用dtd約束,如果在沒有聯網的情況想,默認開發者在使用時沒有提示,這樣不方便開發者編寫代碼。通過配置約束文件可讓xml文件編寫代碼有提示

1.聯網

2.手動管理DTD約束文件

e680f24471cf99e06974a69c03bd2566.png

配置完約束文件以后,關閉xml文件,重新打開即可有提示

3. log4j日志框架的配置

3.1. 說明

log4j是一個日志輸出框架,就是用于輸出日志的。

Mybatis的日志輸出是通過Log4J輸出的。主流框架大部分都是Log4j輸出的。Spring框架也可以通過Log4j輸出日志!!

問題:既然Log4j功能類似System.out.println(),為什么使用log4j而不直接使用System.out.println()?

答:Log4j提供了強大的日志輸出的自定義功能。

1. 通過級別輸出日志 (調試、信息、警告、錯誤、致命異常)

2. 可以指定輸出到控制臺,以及輸出到文件。

3. 可以設置輸出的日志格式

所以學習LOG4J.需要學會自定義配置LOG4J的輸出格式以及輸出等級

3.2. 下載路徑

Log4j的下載地址:http://logging.apache.org/log4j/1.2/

3.3. 配置步驟

3.3.1. 第一步:導入log4j-1.2.17.jar的包

eb19a7fbb174f08a0f439a8792acce18.png

3.3.2. 第二步:在src下創建一個log4j.propertis文件

注意:文件名必須為log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
# log4j.logger.org.mybatis.example.BlogMapper=TRACE
#  前綴(log4j.logger)+點(.)需要記錄日志的命名空間 = 日志級別
log4j.logger.cn.zj.mybatis.mapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3.4. 運行效果

3f3e093ec9b04d1a4476a78c1bcc34ac.png

4. MyBatis完成CRUD操作

4.1. 單行查詢

4.1.1. 映射文件

 <!-- 單行查詢resultType : 查詢結果對應的封裝的返回類型--><select id="selectByUserId" parameterType="integer" resultType="cn.zj.mybatis.pojo.User">select * from user where id = #{id}</select>

4.1.2. 測試方法

// 單行查詢
@Test
public void testFindById() throws Exception {//1.創建SqlSession操作對象SqlSession session = MyBatisUtil.openSession();//2.創建UserMapper接口的代理對象UserMapper userMapper = session.getMapper(UserMapper.class);//3.執行單行查詢操作User user = userMapper.selectByPrimaryKey(1);System.out.println(user);// 4.關閉sessionsession.close();
}

4.2. 多行查詢

4.2.1. 映射文件

<!-- 多行查詢resultType : 無論是多行查詢還是單行查詢,返回的結果類型都是對應的JavaBean的類型--><select id="selectAll" resultType="cn.zj.mybatis.pojo.User">select * from user</select>

4.2.2. 測試方法

@Test
public void testFindAll() throws Exception {SqlSession session = MyBatisUtil.openSession();// 創建UserMaper的代理對象UserMapper mapper = session.getMapper(UserMapper.class);// 3.執行多行查詢List<User> users = mapper.selectAll();for (User user : users) {System.out.println(user);}// 4.關閉sessionsession.close();
}

4.3. 刪除操作

4.3.1. 映射文件

<!-- 刪除操作  --><delete id="deleteById" parameterType="integer">delete from user where id = #{id}</delete>

4.3.2. 測試方法

// 刪除操作
@Test
public void testDelete() throws Exception {// 1.創建SqlSession操作對象SqlSession session = MyBatisUtil.openSession();// 2.創建UserMapper接口的代理對象UserMapper userMapper = session.getMapper(UserMapper.class);// 3.執行UserMapper的插入操作userMapper.deleteById(3);// 4.提交事務session.commit();// 5.關閉sessionsession.close();
}

4.4. 修改操作

4.4.1. 映射文件

<!-- 修改操作 --><update id="updateByUserId" parameterType="cn.zj.mybatis.pojo.User">update user set name = #{name},password = #{password},age = #{age} where id = #{id}</update>

4.4.2. 測試方法

// 修改操作
@Test
public void testUpdate() throws Exception {// 1.創建SqlSession操作對象SqlSession session = MyBatisUtil.openSession();// 2.創建UserMapper接口的代理對象UserMapper userMapper = session.getMapper(UserMapper.class);// 3.創建用戶對象User user = new User(2, "段譽", "dy", 25);// 4.執行UserMapper的插入操作userMapper.updateUserInfo(user);// 5.提交事務session.commit();// 6.關閉sessionsession.close();
}

5. ResultMap 手動映射

MyBatis的查詢結果集都是自動映射封裝的,單行查詢將數據庫一條數據封裝成對應的Java對象。多行查詢,先將每一行封裝成對象,再將每個對象添加到集合中,最后返回一個List集合對象。

但是:必須保證查詢結果集和pojo對象的屬性名相同,否則無法自動封裝

問題: 如何解決查詢結果集名稱和pojo對象屬性不同的映射封裝?

解決方案:

1. 使用手動映射封裝 <ResultMap>標簽

2. 可以使用mybatis的駝峰命名法. ResultMap 手動映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 映射配置namespace : 命名空間,通俗講,每個映射文件唯一的標識名稱-->
<mapper namespace="cn.zj.mybatis.mapper.UserMapper"><!-- resultType : 自動映射resultMap : 手動映射,值 自定義對應手動映射標簽的 id的值注意:自動映射和手動映射二選一,不能同時使用--><select id="findByUserId" parameterType="Integer"  resultMap="user_map"><!-- #{} OGNL表達式語言  -->select id  u_id,name u_name,password u_password ,age u_age from user  where id = #{id}</select><!-- 手動映射type :需要手動映射的數據類型id :唯一標識--><resultMap type="User" id="user_map"><!-- 主鍵列映射<id column="" property="" javaType="" jdbcType=""/>column :結果的列名property:domain對象的對應的屬性名javaType :domian對象的屬性的類型(可選,默認自動關聯)jdbcType :結果集列類型(可選,默認自動關聯)--><id column="u_id" property="id" javaType="Integer" jdbcType="INTEGER"/><!-- 主鍵列映射<result column="" property="" javaType="" jdbcType=""/>column :結果的列名property:domain對象的對應的屬性名javaType :domian對象的屬性的類型(可選,默認自動關聯)jdbcType :結果集列類型(可選,默認自動關聯)--><result column="u_name" property="name"/><result column="u_age" property="age"/><result column="u_password" property="password"/></resultMap><!-- 多行查詢 注意:查詢不管單行還是多行查詢,返回的數據類型都是數據表對應的domain類型多行不是放回集合--><select id="selectAll" resultMap="user_map">select id  u_id,name u_name,password u_password ,age u_age from user</select></mapper>

6. 主配置文件說明與細節配置

<environments>:環境集標簽,就是用于配置數據庫的連接信息的

<environment>:用于配置具體環境參數

<transactionManager>:配置使用的事務類型,JDBC

<dataSource>:配置數據源的參數,POOLED

具體參數參看PooledDataSource的set方法

<property>:配置屬性

<mappers>:配置映射文件信息的

<mapper class|resource>:配置具體指定的mapper文件

class:配置使用注解時指定有注解的映射接口

resource:指定映射文件

<properties>:mybatis對propertis文件的支持

<typeAliases>:用于配置別名

<typeHandlers>:用于配置自定義類型處理器.

<settings>:配置Mybatis的默認設置的.

總配置文件的標簽順序

<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

這句話的意思就是configuration 標簽下的標簽的順序以及標簽出現的個數的聲明

根據這個聲明可以看到順序為:

1.properties

2.settings

3.typeAliases

4.typeHandlers

5.objectFactory

6.objectWrapperFactory

7.reflectorFactory

8.plugins

9.environments

10.databaseIdProvider

11.mappers

DTD規則文件標簽的出現的次數說明

如果聲明的標簽后?:表示出現0-1次

如果聲明的標簽后*:表示出現0-N次

如果聲明的標簽后+:表示出現1-N次

如果聲明的標簽后什么都沒有:表示出現1次

6.1. 別名typeAliases標簽

在UserMapper.xml文件中User無論是作為參數還是作為查詢返回數據類型,都需要寫上全限定名,實際可以寫上簡單類名即可,但是需要配置別名

MyBatis框架提供了兩種別名機制,一種是自定義別名,一種是內置別名|

6.1.1. 自定義別名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<!-- XMLConfigBuilder是總配置文件的構建類 -->
<configuration>
<!-- 別名設置  --><typeAliases><!-- 設置單個類的別名 type :要設置別名的全限定名alias :別名 --><typeAlias type="cn.zj.mybatis.pojo.User" alias="User"/></typeAliases><!-- 用于配置數據庫的連接參數 ,environments這個標簽可以配置多個數據庫的連接,default表示默認使用的配置--><environments default="default-msql"><!-- 數據庫的連接參數 Configuration查看參數--><!-- 所有框架的靜態屬性都可以在這個框架的類里面找到,不用死記硬背 --><!-- id:就是一個標識符 --><environment id="default-msql"><!-- 事務類型 --><!-- 事務類型有哪些JDBC:使用JDBC事務MANAGED:不用事務--><transactionManager type="JDBC"></transactionManager><!-- 數據源 --><!-- type表示數據庫的類型JNDI:使用JNDI獲得數據源.POOLED:使用默認的連接池獲得數據源UNPOOLED:不用數據源--><!-- org.apache.ibatis.datasource.pooled.PooledDataSource --><dataSource type="POOLED"><!-- 所有的property對應的是一個set方法 --><!-- 四要素 --><property name="driver" value="org.gjt.mm.mysql.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/school"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 加載映射文件 --><mappers><mapper resource="mybatis-mapper/StudentMapper.xml"/></mappers>
</configuration>

如果配置成功,在映射文件里面可以直接使用別名

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 映射配置namespace : 命名空間,通俗講,每個映射文件唯一的標識名稱-->
<mapper namespace="test"><!-- 單行查詢操作<select id="">id :當前功能唯一標識parameterType : 當前參數的數據類型resultType :查詢結果要封裝返回對象的數據類型標簽內部的文本內容: 要操作SQL語句--><select id="findById" parameterType="Integer" resultType="User"><!-- #{} OGNL表達式語言  -->select * from user where id = #{id}</select><!-- 多行查詢 注意:查詢不管單行還是多行查詢,返回的數據類型都是數據表對應的pojo類型多行不是放回集合--><select id="findAll" resultType="User">select * from user</select><!-- 新增數據keyProperty : 數據庫表主鍵對應的pojo類型的屬性useGeneratedKeys: 是否生成主鍵,如果為true,數據保存以后MyBatis會自動把數據庫當前數據的主鍵值設置pojo對應的id中去--><insert id="insertUserInfo" parameterType="User" keyProperty="id"useGeneratedKeys="true"><!-- #{對象的屬性名稱} -->insert into user (name,password,age)values(#{name},#{password},#{age})		</insert><!-- 刪除數據 --><delete id="deleteById" parameterType="Integer" >delete from user where id = #{id}</delete><!-- 修改操作--><update id="updateUserInfoById" parameterType="User">update user set name = #{name} ,password = #{password},age = #{age} where id = #{id}</update></mapper>

6.1.2. 內置別名

所謂的內置別名,就是Mybatis框架自帶別名.

Mybatis已經將常用的數據類型的別名內置聲明了.所以這些內置的別名不需要配置就可以直接使用.

內置的別名就是,Mybatis框架默認已經設置的別名.

別名	           映射的類型
_byte	             byte
_long	             long
_short	             short
_int	              int
_integer	      int
_double	        	double
_float	             	float
_boolean        	boolean
string  	java.lang.String
byte            	Byte
long            	Long
short		             Short
int		             Integer
integer	             	Integer
double		             Double
float		             Float
boolean		             Boolean
date		             java.util.Date
decimal	             	BigDecimal
bigdecimal	             	BigDecimal
object		             Object
map		             java.util.Map
hashmap	             	HashMap
list		             List
arraylist	             	ArrayList
collection	             	Collection
iterator		             Iterator

6.2. properties 讀取配置文件

一般開發會將單獨的數據庫連接字符串配置到一個獨立的 以 .properties 的配置文件中

Mybaits框架中配置文件 的 <properties>標簽可以讀取配置文件中的內容。并可以使用${}的語法設置給框架的數據庫連接操作代碼

6.2.1. 在classpath下面創建一個db.properties數據庫連接配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

6.2.2. 在mybatis-config.xml主配置文件中配置<properties>標簽讀取配置文件

 <!-- 根標簽,在內部配置MyBatis框架信息 -->
<configuration><!-- 讀取classpath下面的 數據庫配置文件、讀取以后再下面鏈接數據庫的配置中就可以使用${配置文件key} 獲取對應的數據庫連接相關信息--><properties resource="db.properties"/>

6.2.3. 連接數據庫的配置修改為 ${key}的方式

 	 --><environment id="mysql"><!-- 配置事務管理器type : 事務管理器的類型,使用的MyBatis框架自定義的一種別名JDBC :使用原生的JDBC作為事務管理--><transactionManager type="JDBC"/><!-- 配置MyBatis的數據源type : 配置連接池POOLED :mybatis內置的一個連接池(默認)后期都交給spring管理了,配置 dbcp連接池,阿里巴巴的 druid連接池--><dataSource type="POOLED"><property name="driver" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>

6.3. settings標簽

Mybatis默認設置了很多默認配置.有時候,我們需求與默認的配置的參數不一樣,

我們就需要修改這些默認配置的參數.

如:Mybatis已經對駱駝命名法的支持,但默認是不開啟的.可以通過mapUnderscoreToCamelCase參數設置為true支持

;}

表示Mybatis啟動可以配置的設置

設置參數	描述	有效值	默認值
cacheEnabled	該配置影響的所有映射器中配置的緩存的全局開關。	true | false	TRUE
lazyLoadingEnabled	延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。	true | false	FALSE
aggressiveLazyLoading	當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載(參考lazyLoadTriggerMethods).	true | false	false (true in ≤3.4.1)
multipleResultSetsEnabled	是否允許單一語句返回多結果集(需要兼容驅動)。	true | false	TRUE
useColumnLabel	使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。	true | false	TRUE
useGeneratedKeys	允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。	true | false	FALSE
autoMappingBehavior	指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。	NONE, PARTIAL, FULL	PARTIAL
autoMappingUnknownColumnBehavior	指定發現自動映射目標未知列(或者未知屬性類型)的行為。	NONE, WARNING, FAILING	NONENONE: 不做任何反應		WARNING: 輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等級必須設置為 WARN)		FAILING: 映射失敗 (拋出 SqlSessionException)		
defaultExecutorType	配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句并執行批量更新。	SIMPLE REUSE BATCH	SIMPLE
defaultStatementTimeout	設置超時時間,它決定驅動等待數據庫響應的秒數。	任意正整數	Not Set (null)
defaultFetchSize	為驅動的結果集獲取數量(fetchSize)設置一個提示值。此參數只可以在查詢設置中被覆蓋。	任意正整數	Not Set (null)
safeRowBoundsEnabled	允許在嵌套語句中使用分頁(RowBounds)。 If allow, set the false.	true | false	FALSE
safeResultHandlerEnabled	允許在嵌套語句中使用分頁(ResultHandler)。 If allow, set the false.	true | false	TRUE
mapUnderscoreToCamelCase	是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。	true | false	FALSE
localCacheScope	MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。	SESSION | STATEMENT	SESSION
jdbcTypeForNull	當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。	JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER	OTHER
lazyLoadTriggerMethods	指定哪個對象的方法觸發一次延遲加載。	A method name list separated by commas	equals,clone,hashCode,toString
defaultScriptingLanguage	指定動態 SQL 生成的默認語言。	A type alias or fully qualified class name.	org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
callSettersOnNulls	指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。	true | false	FALSE
returnInstanceForEmptyRow	當返回行的所有列都是空時,MyBatis默認返回null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用于嵌套的結果集 (i.e. collectioin and association)。(從3.4.2開始)	true | false	FALSE
logPrefix	指定 MyBatis 增加到日志名稱的前綴。	Any String	Not set
logImpl	指定 MyBatis 所用日志的具體實現,未指定時將自動查找。	SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING	Not set
proxyFactory	指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。	CGLIB | JAVASSIST	JAVASSIST (MyBatis 3.3 or above)
vfsImpl	指定VFS的實現	自定義VFS的實現的類全限定名,以逗號分隔。	Not set
useActualParamName	允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的工程必須采用Java 8編譯,并且加上-parameters選項。(從3.4.1開始)	true | false	TRUE
configurationFactory	Specifies the class that provides an instance of Configuration. The returned Configuration instance is used to load lazy properties of deserialized objects. This class must have a method with a signature static Configuration getConfiguration(). (Since: 3.2.3)	A type alias or fully qualified class name.	Not set

如支持駱駝命名法

<!-- 配置默認的參數 --><settings><!-- 默認支持駱駝命名法 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings>

7. MyBatis的注解開發

MyBatis的映射配置除了使用xml配置以外,還支持注解配置sql語句

問題: 為什么有了xml配置還有注解配置

答 :MyBatis的注解開發更簡潔,只需要將對應的SQL語句的注解標注對應的功能方法上即可,直接連 XxxMapper.xml映射文件都可以省略了

本身注解開發就是Java配置的一種趨勢,后期學習SpringBoot時候,發現全部用純注解配置

MyBatis提供了下面注解進行映射文件配置

@Select 查詢數據注解
@Insert 插入數據注解
@Delete 刪除數據注解
@Update 修改數據注解
@Options 選項配置
@Results 手動映射配置
@Result  : @results中的具體的某一列的映射信息配置

7.1. 案例代碼

package cn.zj.mybatis.mapper;
import java.util.List;import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import cn.zj.mybatis.domain.User;/*** * @Select 查詢注解* @Insert**/
public interface UserMapper {@Select("select id u_id,name u_name,password u_password,age u_age from user where id = #{id}")@Results({@Result(id=true,property="id",column="u_id"),@Result(property="name",column="u_name"),@Result(property="password",column="u_password"),@Result(property="age",column="u_age")})User selectByPrimaryKey(Integer id);@Select("select * from user")List<User> findAll();@Insert("insert into user (name,password,age)values(#{name},#{password},#{age})")@Options(keyProperty="id",useGeneratedKeys=true)int insertUserInfo(User user);@Delete("delete from user where id = #{id}")int deleteByUserId(Integer id);@Update("update user set name = #{name} ,password = #{password},age = #{age} where id = #{id}")int updateUserInfoById(User user);}

7.2. 注解映射的配置

 <mappers><!-- 配置具體的映射文件 ,映射xml文件--><!--  <mapper resource="cn/zj/mybatis/mapper/UserMapper.xml"/>  --><!-- 接口映射權限定名 --><mapper class="cn.zj.mybatis.mapper.UserMapper"/></mappers>

8. 方法多參數傳遞使用-@Param注解

Mybatis默認情況下是不支持傳入多個參數的.只能傳入一個參數.

所謂的傳入參數指定是Mybatis操作
(<insert><delete><update><select>)的傳入參數.
方案1:將這些參數封裝到一個對象里面(JavaBean/Map),再傳入.
方案2:給參數設置一個@Param注解支持,而且多參數的類型要統一問題:為什么不支持多個參數?
因為Java語法1.7以前.是不能通過反射技術獲得方法的參數名的.解決方案使用  @Param 參數注解

案例代碼

import java.util.Map;import org.apache.ibatis.annotations.Param;import cn.zj.mybatis.domain.User;public interface UserMapper {/*** 模擬登陸操作* @param user 封裝有賬號密碼的User對象* @return 查詢結果封裝的User對象*/User login1(User user);/*** 模擬登陸操作* @param user 封裝有賬號密碼的Map集合* @return 查詢結果封裝的User對象*/User login2(Map<String, Object> map);User login3(@Param("username")String name,@Param("pwd")String password);}

測試代碼

	@Testpublic void testlogin3() throws Exception {SqlSession session = MyBatidUtil.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.login3("楊過", "yangguo");System.out.println(user);}

9. #{}與${}的區別

在MyBatis框架中支持兩種 OGNL語法

#{}基于JDBC的PreparedStatement類,SQL語句參數使用 ?占位符,在運行階段動態設置參數,但是 ?不能作為表名.

預編譯語句對象的SQL語句只能 操作 DML和DQL 語句,不能操作DDL語句

1.#{}表示設置預編譯的參數,就是?的參數,所以如果要不固定的表名不能使用#{},只能使用${}

2.${}直接把值輸出來,直接把參數拼接到SQL語句中.而#{]是使用?來代替. 所以${}是不安全的.

3.${}只能獲得參數池的值,而#{}可以獲得方法的參數值,也可以獲得參數池的值,如果使用${}獲得參數的值,這個參數必須要加上@Param

如果非必要情況,不要使用${}

問題:那么${}有什么用呢?

答:注意基于JDBC的接口的原來的表名是不可以使用?的,?只能用于傳入的參數。

如果操作的涉及表名這些非參數的 數據時,需要使用${}

9.1. 刪除案例代碼

package cn.zj.mybatis.mapper;import org.apache.ibatis.annotations.Param;public interface UserMapper {/*** 動態刪除數據庫中指定表名* @param tableName 表名* @return*/int dropTable(@Param("tableName")String tableName);
}________________________________________________________________________<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 映射配置namespace : 命名空間,通俗講,每個映射文件唯一的標識名稱-->
<mapper namespace="cn.zj.mybatis.mapper.UserMapper"><!-- 使用 #{} 不能使用在表名操作 --><delete id="dropTable" parameterType="String"><!-- drop table #{tableName} -->drop table ${tableName}</delete>
</mapper>

9.2. 打印效果

9.2.1. 使用 #{}

使用此種方法無法刪除數據庫表

f050c52bcfa1296724262fe0f1176669.png

9.2.2. 使用${}

f6680f5469886f089eabfc528d5b8ea1.png

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/114278.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息