目錄
- MyBatis 框架概述
- JDBC 編程的分析
- jdbc 程式的回顧
- jdbc 問題分析
- Mybatis 框架快速入門
- Mybatis 框架開發的準備
- 搭建 Mybatis 開發環境
- mybatis的環境搭建
- 環境搭建的注意事項
- 1、創建一個新的maven專案
- 目錄結構*
- 2、在pom.xml中匯入相關的依賴
- 3、準備資料庫
- 4、撰寫User物體類
- 5、撰寫持久層介面 IUserDao
- 6、撰寫持久層介面的映射檔案 IUserDao.xml
- 7、撰寫 SqlMapConfig.xml 組態檔
- 8、引入log4j.properties檔案
- 9、撰寫測驗類
- 運行結果
- 分析
- 可能遇到的錯誤
- Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
- [Error querying database. Cause: java.sql.SQLNonTransientConnectionException:報錯解決](https://keafmd.blog.csdn.net/article/details/113730753)
- [Could not find resource xxx/xxxx/xxx.xml報錯解決](https://keafmd.blog.csdn.net/article/details/113730579)
MyBatis 框架概述
mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 陳述句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的程序,
mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 物件和 statement 中sql 的動態引數進行映射生成最終執行的 sql 陳述句,最后由 mybatis 框架執行 sql 并將結果映射為 java 物件并回傳,
采用 ORM 思想解決了物體和資料庫映射的問題,對 jdbc 進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我們不用與 jdbc api 打交道,就可以完成對資料庫的持久化操作,
JDBC 編程的分析
jdbc 程式的回顧
下面的是使用 jdbc 的原始方法(未經封裝)實作了查詢資料庫表記錄的操作,
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加載資料庫驅動
Class.forName("com.mysql.jdbc.Driver");
//通過驅動管理類獲取資料庫鏈接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", " root");
//定義 sql 陳述句 ?表示占位符
String sql = "select * from user where username = ?";
//獲取預處理 statement
preparedStatement = connection.prepareStatement(sql);
//設定引數,第一個引數為 sql 陳述句中引數的序號(從 1 開始),第二個引數為設定的引數值
preparedStatement.setString(1, "王五");
//向資料庫發出 sql 執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
//遍歷查詢結果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " "+resultSet.getString(" username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//釋放資源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
jdbc 問題分析
1、資料庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫鏈接池可解決此問題,
2、Sql 陳述句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變 java代碼,
3、使用 preparedStatement 向占有位符號傳引數存在硬編碼,因為 sql 陳述句的 where 條件不一定,可能多也可能少,修改 sql 還要修改代碼,系統不易維護,
4、對結果集決議存在硬編碼(查詢列名),sql 變化導致決議代碼變化,系統不易維護,如果能將資料庫記錄封裝成 pojo 物件決議比較方便,
Mybatis 框架快速入門
Mybatis 框架開發的準備

如果使用 Maven 來構建專案,則需將下面的依賴代碼置于 pom.xml 檔案中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
搭建 Mybatis 開發環境
mybatis的環境搭建
第一步:創建maven工程并匯入坐標
第二步:創建物體類和dao的介面
第三步:創建Mybatis的主組態檔 SqlMapConifg.xml
第四步:創建映射組態檔 IUserDao.xml
環境搭建的注意事項
第一個:創建IUserDao.xml 和 IUserDao.java時名稱是為了和我們之前的知識保持一致,
在Mybatis中它把持久層的操作介面名稱和映射檔案也叫做:Mapper
所以:IUserDao 和 IUserMapper是一樣的
第二個:在idea中創建目錄的時候,它和包是不一樣的
包在創建時:com.itheima.dao它是三級結構
目錄在創建時:com.itheima.dao是一級目錄
第三個:mybatis的映射組態檔位置必須和dao介面的包結構相同
第四個:映射組態檔的mapper標簽namespace屬性的取值必須是dao介面的全限定類名
第五個:映射組態檔的操作配置(select),id屬性的取值必須是dao介面的方法名
注意:當我們遵從了第三,四,五點之后,我們在開發中就無須再寫dao的實作類,
1、創建一個新的maven專案
目錄結構*
最后完成的目錄結構如下:

2、在pom.xml中匯入相關的依賴
pom.xml:
<?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.keafmd</groupId>
<artifactId>day01_eesy_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3、準備資料庫
創建個資料庫eesy_mybatis,入門案例中只使用到了user表,

sql檔案:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龍'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龍'),(45,'傳智播客','2018-03-04 12:04:06','男','北京金燕龍'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小馬寶莉','2018-03-08 11:44:00','女','北京修正');
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`ID` int(11) NOT NULL COMMENT '編號',
`UID` int(11) default NULL COMMENT '用戶編號',
`MONEY` double default NULL COMMENT '金額',
PRIMARY KEY (`ID`),
KEY `FK_Reference_8` (`UID`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `account`(`ID`,`UID`,`MONEY`) values (1,41,1000),(2,45,1000),(3,41,2000);
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`ID` int(11) NOT NULL COMMENT '編號',
`ROLE_NAME` varchar(30) default NULL COMMENT '角色名稱',
`ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院長','管理整個學院'),(2,'總裁','管理整個公司'),(3,'校長','管理整個學校');
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`UID` int(11) NOT NULL COMMENT '用戶編號',
`RID` int(11) NOT NULL COMMENT '角色編號',
PRIMARY KEY (`UID`,`RID`),
KEY `FK_Reference_10` (`RID`),
CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user_role`(`UID`,`RID`) values (41,1),(45,1),(41,2);
4、撰寫User物體類
User類:
package com.keafmd.domain;
import java.util.Date;
/**
* Keafmd
*
* @ClassName: User
* @Description: user物體類
* @author: 牛哄哄的柯南
* @date: 2021-02-06 19:26
*/
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
5、撰寫持久層介面 IUserDao
IUserDao:
package com.keafmd.dao;
import com.keafmd.domain.User;
import java.util.List;
/**
* Keafmd
*
* @ClassName: IUserDao
* @Description: 用戶的持久層介面
* @author: 牛哄哄的柯南
* @date: 2021-02-06 19:29
*/
public interface IUserDao {
/**
* 查詢所有操作
* @return
*/
List<User> findAll();
}
6、撰寫持久層介面的映射檔案 IUserDao.xml
要求:
創建位置:必須和持久層介面在相同的包中,
名稱:必須以持久層介面名稱命名檔案名,擴展名是.xml
IUserDao.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.keafmd.dao.IUserDao">
<!--配置查詢所有-->
<!--id為方法名稱-->
<select id="findAll" resultType="com.keafmd.domain.User">
select * from user
</select>
</mapper>
7、撰寫 SqlMapConfig.xml 組態檔
SqlMapConfig.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的主組態檔-->
<configuration>
<!--配置環境-->
<environments default="mysql">
<!--配置mysql的環境-->
<environment id="mysql">
<!--配置事務的型別-->
<transactionManager type="JDBC"></transactionManager>
<!--配置資料源(連接池)-->
<dataSource type="POOLED">
<!--配置連接資料庫的4個基本資訊-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="18044229"/>
</dataSource>
</environment>
</environments>
<!--指定映射組態檔的位置,映射組態檔指的是每個dao獨立的組態檔-->
<mappers>
<mapper resource="com/keafmd/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
8、引入log4j.properties檔案
log4j.properties:
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
9、撰寫測驗類
第一步:讀取組態檔
第二步:創建SqlSessionFactory工廠
第三步:創建SqlSession
第四步:創建Dao介面的代理物件
第五步:執行dao中的方法
第六步:釋放資源
MybatisTest:
package com.keafmd.test;
import com.keafmd.dao.IUserDao;
import com.keafmd.domain.User;
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 javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;
/**
* Keafmd
*
* @ClassName: MybatisTest
* @Description: 測驗類
* @author: 牛哄哄的柯南
* @date: 2021-02-06 19:55
*/
public class MybatisTest {
/**
* 入門案例
* @param args
*/
public static void main(String[] args) throws Exception{
//1.讀取組態檔
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工廠生產SqlSession物件
SqlSession session = factory.openSession();
//4.使用SqlSession創建Dao介面的代理物件
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理物件執行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.釋放資源
session.close();
in.close();
}
}
運行結果
2021-02-06 20:50:29,169 0 [ main] DEBUG ache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2021-02-06 20:50:29,224 55 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2021-02-06 20:50:29,224 55 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2021-02-06 20:50:29,224 55 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2021-02-06 20:50:29,225 56 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2021-02-06 20:50:29,523 354 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2021-02-06 20:50:30,265 1096 [ main] DEBUG source.pooled.PooledDataSource - Created connection 738433734.
2021-02-06 20:50:30,265 1096 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2c039ac6]
2021-02-06 20:50:30,304 1135 [ main] DEBUG om.keafmd.dao.IUserDao.findAll - ==> Preparing: select * from user
2021-02-06 20:50:30,368 1199 [ main] DEBUG om.keafmd.dao.IUserDao.findAll - ==> Parameters:
2021-02-06 20:50:30,494 1325 [ main] DEBUG om.keafmd.dao.IUserDao.findAll - <== Total: 6
User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龍'}
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龍'}
User{id=45, username='傳智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龍'}
User{id=46, username='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex='男', address='北京'}
User{id=48, username='小馬寶莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex='女', address='北京修正'}
2021-02-06 20:50:30,497 1328 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2c039ac6]
2021-02-06 20:50:30,499 1330 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2c039ac6]
2021-02-06 20:50:30,499 1330 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 738433734 to pool.
Process finished with exit code 0
分析

可能遇到的錯誤
Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:
解決辦法:


把1和2保持一致,我的上面是1.8,下面就改成8,
Error querying database. Cause: java.sql.SQLNonTransientConnectionException:報錯解決
Could not find resource xxx/xxxx/xxx.xml報錯解決
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/257833.html
標籤:其他
上一篇:產品經理的私房菜 排版篇

