# 我的第一個Mybatis程式 ###### tags: `Mybatis-基礎` 思路:搭建環境->導入Mybatis->編寫代碼->測試 ### 搭建環境 1.搭建數據庫 ```sql= //创建资料库 CREATE DATABASE mybatis; USE mybatis; //创剑表单 CREATE TABLE `user`( `id` INT(20) NOT NULL PRIMARY KEY, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL )ENGINE=INNODB DEFAULT CHARSET=utf8; //在表单创建资料 INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'), (2,'張三','123456'), (3,'李四','123456') ``` 2.新建项目 2-1新建一个普通maven项目 2-2删除src目录 2-3 導入maven依賴 ```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>org.example</groupId> <artifactId>Mybatis-Study</artifactId> <version>1.0-SNAPSHOT</version> <!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <!--mybatis--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> </dependency> </dependencies> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> </project> ``` 3.創建模塊 ![](https://i.imgur.com/Fp7LeGA.png) ![](https://i.imgur.com/DT56F0n.png) 透過先刪除src資料夾,將pom.xml的配置作為父工程,後續新建的Module就不用再導入依賴 **隨著子工程創立,在pom.xml自建了<module>mybatis-01</module>** ```xml <groupId>org.example</groupId> <artifactId>Mybatis-Study</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>mybatis-01</module> </modules> ``` 查看依賴中,可以發現mybatis-01導入的依賴與Mybatis-study相同 ![](https://i.imgur.com/0ImBuMs.png) ### 編寫mybatis的核心配置文件 在mybatis-config配置文件中,編寫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核心配置文件--> <configuration> <environments default="development"> <environment id="development"> <!--transactionManager事務管理--> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration> ``` #### 內容說明 environments:運行環境,默認為**development** driver:連接數據庫的驅動程式,留意 #### 如果是5.xx版本,用 ```xml= <property name="driver" value="com.mysql.jdbc.Driver"/> ``` #### 如果是8.xx版本,用 ```xml= <property name="driver" value="com.mysql.cj.jdbc.Driver"/> ``` url:連接數據庫的網址 #### 取得數據庫連接的方式 1.先在Database取得與MySQL的連接 ![](https://i.imgur.com/gXWDfhl.png) 2.輸入正確的使用者以及密碼 ![](https://i.imgur.com/5YAAkXh.png) 3.在Schemas找到要連接的數據庫 ![](https://i.imgur.com/W00BOZA.png) 4.連接後,能在General找到對應的Url ![](https://i.imgur.com/RPP10rW.png) 5.在url輸入,並補齊對應所需的資料 ![](https://i.imgur.com/q8Q3UcI.png) **注意:留意是否連接到正確的數據庫,或是帳密** mybatis-連接的數據庫名稱 useSSL=true-安全連接 &amp-相當於&,當在xml需要轉義,因此改使用&amp useUnicode=true-決定是否使用Unicode字符集,如果參數characterEncoding設置為gb2312或gbk,本參數值必須設置為true characterEncoding-當useUnicode設置為true時,指定字符編碼。 serverTimezone-設置時區 ### 編寫mybatis的工具類 利用SqlSessionFactory來生成SqlSession,以便操作Sql語句 因為不想再每次使用都重新寫一遍,因此獨立成工具類,以便需要使用時,直接創建sqlSession對象即可 ```java= //sqlSessionFactory --> sqlSession public class MybatisUtils { //提升作用域:原本sqlSessionFactory只能在static作用,從局部變量提升到全局變量,變成全局作用域,可以被外部訪問 private static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis第一步:獲取sqlSessionFactory對象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } // 既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。 // SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。 // 你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } } ``` sqlSessionFactory提供的方法,可以進行sql相關操作 ![](https://i.imgur.com/qGXmhOv.png) ### 編寫代碼 * 實體類 ```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接口 ```java= public interface UserDao { List<User> getUserList(); } ``` * 接口實現類:由原來的UseDaoImpl轉變為一個Mapper配置文件 #### 原先寫法 會寫一個實現Dao接口的實現類,將實現的方法以SQL語句執行,並收集結果集 ```java= public class UserDaoImpl implements UserDao { @Override public List<User> getUserList() { //執行SQL String sql = "select * from mybatis.user" //結果集 ResultSet->取出所有對象 } } ``` #### Mybatis寫法 不使用Dao實現類,改使用xml文件來執行SQL語句 綁定對應的Dao/Mapper接口,並在對應方法下方執行SQL語句 ```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=綁定一個對應的Dao/Mapper接口--> <mapper namespace="com.kuang.dao.UserDao"> <!--select查詢語句--> <select id="getUserList" resultType="com.kuang.pojo.User"> select * from mybatis.user </select> </mapper> ``` ### 測試 #### 注意點: org.apache.ibatis.binding.BindingException:Type interface com.kuang.dao.UserDao is not known to the MapperRegistry. **MapperRegistry是什麼?** 核心配置文件(pom.xml)中註冊mapper ```xml= <!--在build中配置resource,來防止我們資源導出失敗的問題--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> ``` 註冊成功後,就會在資料夾中生成UserMapper.xml文件 ![](https://i.imgur.com/tuBqzlx.png) * junit測試 ```java= public class UserDaoTest { @Test public void test(){ //第一步:獲得SqlSession對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //執行SQL //方式一:getMapper:獲取映射器,也就是獲取xml文件中的mapper配置 //這裡使用(UserDao.class)是透過反射,獲取Mapper中的UserDao實例 UserDao userDao = sqlSession.getMapper(UserDao.class); //創建UserDao實例後,執行其中的方法 List<User> userList = userDao.getUserList(); for(User user : userList){ System.out.println(user); } sqlSession.close(); } } ``` 成功 ![](https://i.imgur.com/XZJkGYd.png) ### 可能遇到的問題 1.配置文件沒有註冊 2.綁定接口錯誤 3.方法名不對 4.返回類型不對 5.Maven導出資源問題 ### 如果要關閉SqlSession的寫法 ```java= @Test public void test(){ //第一步:獲得SqlSession對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try { //執行SQL //方式一:getMapper:獲取映射器,也就是獲取xml文件中的mapper配置 //這裡使用(UserDao.class)是透過反射,獲取Mapper中的UserDao實例 UserDao userDao = sqlSession.getMapper(UserDao.class); //創建UserDao實例後,執行其中的方法 List<User> userList = userDao.getUserList(); //方式二:不推薦 // List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList"); for(User user : userList){ System.out.println(user); } }catch (Exception e){ e.printStackTrace(); }finally { //關閉SqlSession sqlSession.close(); } } } ```