第一個mybatis程式(IDEA)
1. 第一個mybatis程式
思路:
-->搭建環境 (新建Maven專案)
-->在pom.xml中,匯入Mybatis,mysql,Junit依賴
-->在resources資料夾中新建mybatis-config.xml檔案
-->編寫mybatis的工具類(MybatisUtils.java)
-->編寫實體類(User.java)
-->編寫Dao介面(UserDao.java)
-->編寫UserMapper.xml配置檔案
-->編寫測試類,進行Junit測試
1.1 搭建環境
搭建資料庫
//建立資料庫 CREATE DATABASE `mybatis`; use `mybatis`; //建立表 CREATE TABLE `user`( `id` INT(20) not NULL PRIMARY KEY, `name` VARCHAR(100) DEFAULT NULL, `pwd` VARCHAR(50) DEFAULT NULL )ENGINE=INNODB default CHARSET=utf8; //插入資料 insert into user values(1,'望穿先生','123456'),(1,'張三','123456')
新建專案
1.新建一個普通的maven專案
2.刪除src目錄
3.匯入依賴
<!--匯入依賴--> <dependencies> <!--mysql驅動--> <!--mysql驅動5.1.47版本的依賴5.7可以用--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
1.2 建立一個模組
-
編寫mybatis的核心配置檔案 (在resources資料夾中新建mybatis-config.xml檔案)
(在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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3305/mybatis?serverTimezone=GMT&useSSL=false&useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="lyl188338"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
-
編寫mybatis的工具類(MybatisUtils.java)
//sqlsessionFactory public class MybatisUtils { //提升sqlsession的作用域 private static SqlSessionFactory sqlSessionFactory; //static程式碼塊讓他初始就去載入 static{ try { //使用mybatis獲取sqlsession物件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的例項。 // SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法。 public static SqlSession getsqlsession(){ return sqlSessionFactory.openSession(); } }
1.3 編寫程式碼
- 實體類(User.java)
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
- Dao介面(UserDao.java)
//此處的UserDao等價於以後的mapper
public interface UserDao {
List<User> getUserList();
}
- 介面實現類由原來的JDBC中的UserImpl轉變成為一個Mapper配置檔案(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">
<!--namesapce(名稱空間)繫結一個對應的Dao/Mapper介面-->
<mapper namespace="com.lyl.dao.UserDao">
<!--select為查詢語句,此處的id值為介面中的方法-->
<!--resultType為返回型別,值為要返回的實體類-->
<select id="getUserList" resultType="com.lyl.pojo.User">
select * from mybatis.user
</select>
</mapper>
1.4 測試
-
Junit測試
(測試儘量寫在對應的test資料夾下,綠色的包中,並且包的結構儘量也要和上面儘可能對應)
public class UserDaoTest {
@Test
public void test() {
//第一步,獲取sqlsession物件
SqlSession sqlSession = MybatisUtils.getsqlsession();
//執行sql
//方式1:通過getMapper()
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//關閉sqlsession
sqlSession.close();
}
}
測試中可能遇到的問題:
-
錯誤一:找不到mybatis配置檔案java.io.IOException: Could not find resource org/mybatis/example/mybatis-config.xml
解決方案:
在pom.xml中增加build
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
如果該方法仍然無法解決找不到配置檔案的話,(1)再注意自己的mapper檔案,在mybatis-config.xml配置檔案中有沒有註冊;(2)檢視自己的mybatis的工具類(MybatisUtils.java)中resources 的路徑寫的是否正確
-
錯誤二: java.lang.ExceptionInInitializerError
在mapper.xml檔案中寫了中文註釋,導致報錯
解決方案:將標頭檔案中的
encoding="UTF-8"
改成UTF8重新執行後問題解決
-
錯誤三:
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure資料庫連線問題
解決方案:
將mybatis-config.xml核心配置檔案中
useSSL=true
改成false後問題解決<property name="url" value="jdbc:mysql://localhost:3305/mybatis?serverTimezone=GMT&useSSL=true&useUnicode=true&characterEncoding=utf-8"/>
-
錯誤四:
org.apache.ibatis.binding.BindingException: Type interface com.lyl.dao.UserDao is not known to the MapperRegistry.
UserMapper.xml檔案中,namespace名稱空間繫結問題
<mapper namespace="com.lyl.dao.UserDao">
解決方案:
檢視自己的Dao/Mapper介面包的路徑是否正確(路徑要從java資料夾下開始寫,com.xx.xx),修改正確後即可。