SSM框架(Spring+SpringMVC+MyBatis)之 MyBatis入門基本配置
文章目錄
1. MyBatis框架簡介
1.1 什麼是MyBatis
-
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄。
-
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。
1.2 MyBatis 和 Hibernate 的比較,優點與缺點
(SSH框架中的H,SSH框架不能說淘汰了吧,只能說有些過時了,現在[2019年9月29日]主流框架是SSM)
-
Mybatis框架是ORM框架中,最受歡迎的框架。相對於Hibernate而言,Mybatis是一個 輕量級 的ORM框架,也是一個 半自動 的ORM框架。所以,在使用Mybatis時,關於數據庫的操作,開發人員必須書寫SQL代碼,而Hibernate中,開發人員無需書寫SQL代碼,關於數據的庫增刪查改等操作能夠 自動完成。
-
但是,Hibernate這種模式,其SQL語句,是程序自身生成。要進行SQL優化時,無法更好的進行優化,不夠靈活。開發效率高,性能差。而Mybatis,基於開發者自己配置SQL語句的形式,將SQL語句傳給Mybatis封裝的方法,從而實現數據庫的增刪查改。這種模式,最核心的SQL由開發人員自己定義,能夠做到更好的維護和擴展,且能進行優化。
-
在Hibernate中,存在一個HQL語句,基於對象的查詢語句,HQL語句,不查數據庫,查類。因爲在ORM框架中,每個類都對應一個表,查詢類的屬性,即每個類的屬性對應了該對應表的字段.這種方式,可以實現"跨平臺".SSH框架。
1.3 什麼是ORM?
-
對象關係映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。
-
ORM本質上,就是數據庫中的數據和Java中類以及類對象的關係的映射。
2. MyBatis入門基本配置(正題)
2.1 步驟一:下載mybatis的 jar包
可以在mybatis官網下jar包:https://github.com/mybatis/mybatis-3/releases
2.2 步驟二:導入jar包到工程lib文件夾下
還有一些常用的jar包。一鍵下載
-
MyBatis的 jar包:mybatis-3.5.2.jar
-
和mysql數據庫(這裏爲8.0版本的數據庫)連接的jar包:mysql-connector-java-8.0.15.jar
-
Java SQL語句解析:jsqlparser-1.3.jar
-
MyBatis分頁插件:pagehelper-5.1.8.jar
-
log4j和log相關的是 日誌 相關
項目目錄如截圖
2.3 步驟三:編寫映射文件UserMapper.xml,還要建一個User實體類,都是在bean包下
【User.java】----- 建一個user實體類
public class User {
private Integer id;
private String name;
private Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
【UserMapper.xml】 ----- 映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sxt.bean.User">
<select id="selectOne" resultType="com.sxt.bean.User">
select * from 表名 where id = 1
</select>
</mapper>
<select>select標籤中寫的sql語句</select>
namespace : 命名空間 命名空間,即mapper映射文件的唯一值,注意,namespace + id值 一定要是唯一的
注意: 在使用mybatis接口開發時,namespace的值,要是接口的全路徑
select : 表示查詢insert : 表示添加
delete : 表示刪除
update : 表示修改
id : 表示sql 的唯一標識,在同一個mapper.xml文件中,id的只能唯一resultType : 表示查詢結果的返回類型
resultMap : 表示映射結果
parameterType : 表示查詢參數的類型 可以缺省 (不建議)
parameterMap : 已經被廢棄了
//除了select,其它三個都爲更新操作
//在mybatis 做更新操作時 必須手動提交事務
sqlSession.commit(); //如下UserDao中示例
2.4 步驟四:編寫mybatis的核心配置文件 mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- mybatis核心配置文件 ,default用來指定當前默認的數據庫環境 -->
<environments default="development">
<!-- 具體的數據庫執行環境 -->
<environment id="development">
<!-- 使用jdbc控制操作數據的事務 -->
<transactionManager type="JDBC"/>
<!-- 配置數據庫連接池,要有jdbc.properties配置文件 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/項目名稱"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加載mybait數據庫操作的 映射文件 bean包下的xml文件全路徑,即映射到上一步的文件-->
<mappers>
<mapper resource="com/sxt/bean/UserMapper.xml"/>
</mappers>
</configuration>
2.5 步驟五:創建SqlSession ----- UserDao ,測試
2.6 步驟六:通過SqlSession對象調用相關方法
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.sxt.bean.User;
public class UserDao {
public static User selectOne() {
String resource = "myabtis.xml";
InputStream inputStream = UserDao.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//SQL會話
SqlSession sqlSession = sqlSessionFactory.openSession();
//調用相關方法
User user = sqlSession.selectOne("com.sxt.bean.User.selectOne");// namespace + sql 語句ID
//UserMapper.xml中的
// 如果是更新操作,在這裏手動提交事務
// sqlSession.commit();
return user;
}
public static void main(String[] args) {
User user = selectOne();
System.out.println(user);
}
}
2.7 其它一些相關配置
2.7.1 log4j.properties 日誌配置文件(可直接複製配置)
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=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
- 配置日誌的輸出方式
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
2.7.2 如果要jdbc.properties配置文件
#
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/項目名稱?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
username=root
password=123456
MySql8.0數據庫與之前不同的是:
- driver=com.mysql.cj.jdbc.Driver 中多了 cj
- 還有url中 必須設置時區參數:serverTimezone=GMT%2B8
那麼
【mybatis.xml】---- 可做一些修改
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
補充:詳解
Mybatis的核心配置文件 ----- mybatis.xml
和
映射配置文件 ----- UserMapper.xml
【mybatis.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 以上 是mybatis核心配置文件 XML文件中dtd約束,規定了xml中可以寫那些標籤 以及標籤的屬性和標籤的子標籤及屬性等 -->
<!-- configuration : 表示mybatis 配置 根標籤 -->
<configuration>
<!-- 外部properties 配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- settings 設置配置 -->
<settings>
<!-- 緩存配置 在mybatis中 緩存分爲一級緩存和二級緩存 默認開啓一級緩存 -->
<setting name="cacheEnabled" value="true"/>
<!--
日誌的設置 : 指定mybatis 日誌使用 實現類
-->
<setting value="LOG4J" name="logImpl"/>
</settings>
<!-- 類型別名(typeAliases) -->
<typeAliases>
<!-- 在mybatis中 type就是類
type : 表示 類的全路徑
alias : 該類的別名
-->
<!-- <typeAlias type="com.sxt.bean.User" alias="USER_NAME"/> -->
<!-- 表示該包下面的類都有了別名,其別名就是類名 -->
<package name="com.sxt.bean"/>
</typeAliases>
<!--
插件 :
配置mybatis 在執行sql時 進行具體的程序攔截操作
分頁插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
-->
<!-- 表示 持久化化框架 數據庫JDBC操作的環境 -->
<!--
environments : 表示運行環境
default : 表示使用的環境
environment : 表示具體的環境
id : 表示當前環境環境的唯一表示
transactionManager : 事務管理器
type : JDBC|MANAGED 一般都是使用JDBC
JDBC: 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源得到的連接來管理事務作用域
MANAGED : 這個配置幾乎沒做什麼。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命週期
dataSource: 數據源
type :UNPOOLED | POOLED(一般使用這種數據源) | JNDI
UNPOOLED : 這個數據源的實現只是每次被請求時打開和關閉連接。不使用連接池 每次都是新建
POOLED : 這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來,避免了創建新的連接實例時所必需的初始化和認證時間
JNDI : 本地數據源 將數據源配置在服務器中
property : 屬性 ,數據源的屬性
name : 屬性名
value: 屬性值
-->
<environments default="MY_MYSQL">
<environment id="MY_MYSQL">
<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>
</environments>
<!-- 映射文件 -->
<!--
mappers : 映射文件
mapper : 表示具體的映射文件
resource : 具體的配置文件路徑
package :
name="" 包名 一般在mapper.xml文件和其對應實體類的操作類在一起時使用,在實際開發中,一般會將xml配置文件和java分開
-->
<mappers>
<mapper resource="com/sxt/bean/UserMapper.xml"/>
</mappers>
</configuration>
【UserMapper.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
映射配置文件:
namespace : 命名空間 命名空間,即mapper映射文件的唯一值,注意,namespace + id值 一定要是唯一的
注意: 在使用mybatis接口代理開發時,namespace的值,要是接口的全路徑
select : 表示查詢
insert : 表示添加
delete : 表示刪除
update : 表示修改
id : 表示sql 的唯一標識,在同一個mapper.xml文件中,id的只能唯一
resultType : 表示查詢結果的返回類型
resultMap : 表示映射結果
parameterType : 表示查詢參數的類型 可以缺省 (不建議)
parameterMap : 已經被廢棄了
-->
<mapper namespace="com.sxt.bean.User">
<!--
查詢結果映射關係
可以通過映射關係解決 列名和屬性名不一致的問題
-->
<resultMap type="User" id="RESULT_MAP">
<!-- 一般表示主鍵 -->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<select id="selectOne" resultMap="RESULT_MAP" >
select * from tb_user where id = 1
</select>
</mapper>