在學習Mybatis時我們應該先知道為什麼要學習mybatis,mybatis有什麼,mybatis能做什麼?
MyBatis 是一款優秀的持久層架構,它支援定制化 SQL、存儲過程以及進階映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設定參數以及擷取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生資訊,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成資料庫中的記錄。相對Hibernate和Apache OJB等“一站式”ORM解決方案而言,Mybatis 是一種“半自動化”的ORM實作。
在此可以引出一個問題什麼是半自動化的ORM呢?
- ORM(對象關系映射):利用對象和資料庫之間映射的資料,把Java程式中的對象持久化到資料庫中的表内。
-
MyBatis如何連接配接資料庫 -------mybatis連接配接資料庫進行操作資料-------一、導入jar包二、對應資料表建立一個pojo實體對象三、建立mybatis的配置檔案mybatis-config.xml四、建立上面的TuserMapper.xml(Sql映射wenj) 測試類 - 這裡的“半自動化”,是相對 Hibernate 等提供了全面的資料庫封裝機制的“全自動化”ORM 實作而言,“全自動”ORM 實作了 POJO 和資料庫表之間的映射,以及 SQL 的自動生成和執行。而 MyBatis 的着力點,則在于 POJO 與 SQL 之間的映射關系。也就是說,MyBatis 并不會為程式員在運作期自動生成 SQL 執行。具體的 SQL 需要程式員編寫,然後通過映射配置檔案,将 SQL 所需的參數,以及傳回的結果字段映射到指定 POJO。使用 ibatis 提供的 ORM 機制,對業務邏輯實作人員而言,面對的是純粹的 Java 對象,這一層與通過 Hibernate 實作 ORM 而言基本一緻,而對于具體的資料操作,Hibernate會自動生成 SQL 語句,而 MyBatis 則要求開發者編寫具體的 SQL 語句。相對 Hibernate 等“全自動”ORM 機制而言,ibatis 以 SQL 開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。作為“全自動”ORM 實作的一種有益補充,MyBatis 的出現顯得别具意義。
- ------------------------以上文字部分來自其他路徑 https://www.w3cschool.cn/mybatis 有需要可自行查詢--------------------------------
- 我們可以再說一下mybatis的優缺點:
- 優點:1.簡單易學
- 2.消除了大量的JDBC過多的代碼
- 3.良好的性能
- 3.友好的Spring內建支援
- 4.友好的第三方緩存類庫內建支援
- 缺點:1、編寫SQL語句時工作量很大,尤其是字段多、關聯表多時,更是如此。
- 2、SQL語句依賴于資料庫,導緻資料庫移植性差,不能更換資料庫。
- 3、緩存機制不佳
-------mybatis連接配接資料庫進行操作資料-------
mybatis的核心概念中含有:核心對象、核心配置檔案、sql映射檔案。
一、導入jar包
以下是項目的結構
如果使用myeclipse等工具注意jar包放在lib檔案裡
要下載下傳的jar包(官方):
mysql驅動 jar包:https://dev.mysql.com/downloads/connector/j/
junit測試 jar包:https://junit.org/junit4/
mybatis jar包:https://github.com/mybatis
log4j日志檔案 jar包:http://logging.apache.org/log4j/2.x/download.html
<dependencies>
<dependency>
<!--日志檔案所用的jar包-->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<!--mysql驅動包-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.28</version>
</dependency>
<dependency>
<!--mybatisjar包-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<!--測試所用的jar包-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
log4j所用代碼可以從官網找到
log4j.rootLogger=DEBUG,CONSOLE,file
log4j.logger.cn.smbms.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error
建立database.properties檔案
二、
以下是我項目的結構
如果使用myeclipse等工具注意jar包放在lib檔案裡
對應資料表建立一個pojo實體對象
public class Tuser {
private Integer id;
private String userName,password,nickName;
@Override
public String toString() {
return "Tuser{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
三、建立mybatis的配置檔案mybatis-config.xml
<configuration>
<!--調用database.properties檔案-->
<properties resource="database.properties"></properties>
<!--選擇log4j日志存儲檔案-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--類型别名-->
<typeAliases>
<typeAlias alias="Tuser" type="cn.jdbc.entity.Tuser"></typeAlias>
</typeAliases>
<environments default="dvr">
<environment id="dvr">
<!--事務管理器 選擇jdbc擷取事務-->
<transactionManager type="JDBC"></transactionManager>
<!--資料源有POOLED 和UNPOLED可選擇是否使用資料源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<mappers>
<!--mappers是映射器,把mapper檔案加入到配置檔案中-->
<mapper resource="cn/jdbc/dao/TuserMapper.xml"></mapper>
</mappers>
</configuration>
四、建立上面的TuserMapper.xml(Sql映射wenj)
<mapper namespace="cn.jdbc.dao.TuserMapper">
<!--避免因為資料庫與程式中變量出現不同名,會出現差誤。是以使用resultMap-->
<resultMap id="userMap" type="Tuser">
<id property="id" column="id"></id>
<result property="userName" column="user_name"></result>
<result property="password" column="password"></result>
<result property="nickName" column="nick_name"></result>
</resultMap>
測試類
@Test
public void QueryCount() {
String source="mybatis-config.xml";
int count=0;
SqlSession sqlSession=null;
try {
//1 擷取mybatis-config.xml的輸入流
InputStream is = Resources.getResourceAsStream(source);
//2 建立一個工廠,完成對配置檔案的讀取
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
//3 建立sqlSession,開啟工廠
sqlSession=sqlSessionFactory.openSession();
//4 根據放入工廠的sql語句執行不同的方法
count=sqlSession.selectOne("com.bdqn.dao.TUserMapper.queryCount");
System.out.println(count);
} catch (IOException e) { e.printStackTrace(); }finally { sqlSession.close(); } }}
@Test
public void queryALLTest(){
SqlSession sqlSession=null;
try {
//1 擷取mybatis-config.xml的輸入流
InputStream is = Resources.getResourceAsStream(source);
//2 建立一個工廠,完成對配置檔案的讀取
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
//3 建立sqlSession,開啟工廠
sqlSession=sqlSessionFactory.openSession();
//4 根據放入工廠的sql語句執行不同的方法
以上測試類的方法有很多的備援代碼,我們可以抽取備援的代碼建一個工具類:
注意: 導的包要注意
package cn.jdbc.util;
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 MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession createSqlSession(){
return sqlSessionFactory.openSession();
}
public static void closeSqlSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
首先建立一個TuserMapper接口,注意要和TuserMapper.xml同名
public interface TuserMapper {
//查詢全部使用者資訊
List<Name> queryAll();
//模糊查詢,查詢通過使用者名查詢使用者資訊
List<Name> getUserListByUserName(String name);
//修改資料
public Integer updateTuser(Name name);
//删除使用者資料
Integer deleteTuserByid(Integer id);
//插入資料
Integer addTuser(Name name);
}
測試類
//擷取全部使用者資訊
public void queryAll(){
SqlSession sqlSession=null;
sqlSession=MybatisUtil.createSqlSession();
//第一種方法 通過全限定名擷取資訊
// List<Tuser> n=sqlSession.selectList("cn.jdbc.dao.TuserTest.queryAll");
//第二種方法 通過接口傳回資訊引入映射檔案中
List<Name> n=sqlSession.getMapper(TuserMapper.class).queryAll();
if(n!=null){
for (Name tuser : n) {
System.out.println(tuser);
}
}
}
//添加
public void addTuser(){
SqlSession sqlSession=null;
Tuser user=new Tuser();
user.setUserName("admin");
user.setPassword("121212");
user.setNickName("mingming");
int rows=0;
sqlSession = MybatisUtil.createSqlSession();
rows=sqlSession.getMapper(TuserMapper.class).addTuser(name);
sqlSession.commit();
if(rows>0){
System.out.println("添加成功");
}else{
System.out.println("添加失敗");
}
MybatisUtil.closeSqlSession(sqlSession);
}
//修改
public void testUpdateTuser(){
SqlSession sqlSession=null;
Tuser user=new Tuser();
user.setUserName("admin33");
user.setPassword("00000");
user.setId(002);
user.setNickName("ming");
//删除
public void testDeletTuserByid(){
SqlSession sqlSession=null;
int delete=0;
sqlSession = MybatisUtil.createSqlSession();
delete=sqlSession.getMapper(TuserMapper.class).deleteTuserByid(1);
sqlSession.commit();
if(delete>0){
System.out.println("删除成功");
}else{
System.out.println("删除失敗");
}
MybatisUtil.closeSqlSession(sqlSession);
}
此文是筆者初學乍練,準備不足之作,如有錯誤,歡迎向筆者提出,以避免筆者誤導其他讀者。