一、創建maven工程並導入座標
編輯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.ccut</groupId>
<artifactId>day01_eesy_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- mybatis持久化工具
- mysql數據庫
- log4j日誌工具
- junit單元測試
- 等等。。。
二、創建實體類和dao接口
實體類:day01_eesy_01mybatis\src\main\java\com\ccut\domain\User.java
package com.ccut.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
//和數據庫中的字段名一致
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
//get和set方法
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;
}
//toString方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
接口:C:\Users\DELL\IdeaProjects\day01_eesy_01mybatis\src\main\java\com\ccut\dao\IUserDao.java
package com.ccut.dao;
import com.ccut.domain.User;
import java.util.List;
/**
* 用戶的持久層接口
*/
public interface IUserDao {
/**
* 查詢所有操作
* @return
*/
List<User> findAll();
}
三、創建主配置文件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">
<!--上面config約束-->
<!--mybatis主配置文件-->
<configuration>
<!--配置環境-->
<environments default="mysql">
<!--配置mysql環境-->
<environment id="mysql">
<!--配置事務類型-->
<transactionManager type="JDBC"/>
<!--配置數據源(連接池)-->
<dataSource type="POOLED">
<!--配置連接數據庫的基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="20194680"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件-->
<mappers>
<mapper resource="com/ccut/dao/IUserDao.xml"/>
</mappers>
</configuration>
四、創建映射配置文IUserDao.xml
day01_eesy_01mybatis\src\main\resources\com\ccut\dao\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約束-->
<mapper namespace="com.ccut.dao.IUserDao">
<!--配置查詢所有-->
<select id="findAll" resultType="com.ccut.domain.User">
SELECT * FROM user;
</select>
</mapper>
五、編寫測試方法
test\java\com\ccut\test\MybatisTest.java
package com.ccut.test;
import com.ccut.dao.IUserDao;
import com.ccut.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
/**
* 入門案例
* @param args
*/
public static void main(String[] args) throws IOException {
//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();
}
}
六、運行結果
注意事項
創建IUserDao.xml和IUserDao.java時名稱一致,在Mybatis中把持久層的操作接口和映射文件叫做:Mapper
常遇到的問題及解決方案
- ### Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.ccut.dao.IUserDao.findAll'. It's likely that neither a Result Type nor a Result Map was specified.
原因:
IUserDao.xml中的findAll沒有返回值類型,編譯器不知道將值返回給誰。
解決方案:
在後邊添加上resultType="你的實體類的全限定類名",
比如,我的是 resultType="com.ccut.domain.User"
- Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ccut.dao.IUserDao.findAll
原因:
IUserDao.xml的 id 與 IUserDao接口的方法名finAll 不匹配,編譯器找不到方法。
解決方案:
保持名稱一致性
- ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
原因:
pom.xml中的配置的MySQL版本與系統中安裝的MySQL 版本不一致
解決方案:
保持MySQL版本一致
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.
原因:
SqlMapConfig.xml中的driver屬性的value值配置錯誤,這種情況還是歸根於所使用的MySQL版本不同,不同版本的MySQL對應不同的value值。
解決方案:
com.mysql.jdbc.Driver ----------更改爲-------> com.mysql.cj.jdbc.Driver
- ### Error querying database. Cause: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
原因:
時差問題,不同地區的時差不同。
解決方案:
更改SqlMapConfig.xml的name屬性的value值,
jdbc:mysql://localhost:3306/test ——更改爲-—>jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai