<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # MyBatis 教程 > 原文: [http://zetcode.com/db/mybatis/](http://zetcode.com/db/mybatis/) 這是 MyBatis Java 教程。 本教程介紹了使用 Java 和 MyBatis 進行 MySQL 編程的基礎。 [Tweet](https://twitter.com/share) ZetCode 擁有用于 MySQL Java 的完整電子書,其中包含 MyBatis 章節: [MySQL Java 編程電子書](/ebooks/mysqljava/)。 ## MyBatis MyBatis 是 Java 持久性框架,使用 XML 描述符或注解將對象與存儲過程或 SQL 語句耦合。 與 ORM 框架不同,MyBatis 不會將 Java 對象映射到數據庫表,而是將 Java 方法映射到 SQL 語句。 MyBatis 允許使用所有數據庫功能,例如存儲過程,視圖,任何復雜性和供應商專有功能的查詢。 使用 MyBatis 的好處是: * 開箱即用的表/查詢緩存 * 減少了許多 JDBC 樣板 * 提高生產力 * SQL 代碼與 Java 類的分離 ## 關于 MySQL 數據庫 MySQL 是領先的開源數據庫管理系統。 它是一個多用戶,多線程的數據庫管理系統。 MySQL 在網絡上特別流行。 MySQL 有兩個版本:MySQL 服務器系統和 MySQL 嵌入式系統。 ## Maven 依賴 在`pom.xml`文件中,添加以下依賴項: ```java <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.2</version> </dependency> </dependencies> ``` POM 文件具有兩個依賴項:MyBatis 庫和 MySQL 驅動程序。 ## `MyBooks`表 本教程中的某些示例使用`MyBooks`表。 `mybooks.sql` ```java CREATE TABLE MyBooks(Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, Author VARCHAR(30), Title VARCHAR(60), Published INTEGER, Remark VARCHAR(150)); INSERT INTO MyBooks(Author, Title, Published, Remark) VALUES ('Leo Tolstoy', 'War and Peace', 1869, 'Napoleonic wars'); INSERT INTO MyBooks(Author, Title, Published, Remark) VALUES ('Leo Tolstoy', 'Anna Karenina', 1878, 'Greatest book of love'); INSERT INTO MyBooks(Author, Title, Published, Remark) VALUES ('Jeff Prosise', 'Programming Windows with MFC', 1999, 'Classic book about MFC'); INSERT INTO MyBooks(Author, Title, Published, Remark) VALUES ('Tom Marrs', 'JBoss at Work', 2005, 'JBoss practical guide'); INSERT INTO MyBooks(Author, Title, Published, Remark) VALUES ('Debu Panda', 'EJB3 in Action', 2007, 'Introduction to Enterprice Java Beans'); ``` 這些 SQL 命令在 MySQL `testdb`數據庫中創建`MyBooks`表。 ## MySQL 版本 在第一個示例中,我們獲得 MySQL 的版本。 在此示例中,我們使用注解將對象映射到 SQL 語句。 ![MyBatisMySQLVersion project structure](https://img.kancloud.cn/2b/33/2b333af8f00b0971f657ca9af178e8d8_264x254.jpg) 圖:MyBatisMySQLVersion 項目結構 這是 NetBeans 中的項目結構。 mybatis-config.xml ```java <?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:3306/testdb"/> <property name="username" value="testuser"/> <property name="password" value="test623"/> </dataSource> </environment> </environments> </configuration> ``` 每個 MyBatis 項目都有一個主要的 XML 配置文件。 在這里,我們為 MySQL 定義了一個數據源。 `MyMapper.java` ```java package com.zetcode.version; import org.apache.ibatis.annotations.Select; public interface MyMapper { @Select("SELECT VERSION()") public String getMySQLVersion(); } ``` 使用`@Select`注解,我們將`getMySQLVersion()`方法映射到該注解中指定的 SQL 語句。 獲取 MySQL 版本的 SQL 語句為`SELECT VERSION()`。 `MyBatisMySQLVersion.java` ```java package com.zetcode.version; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisMySQLVersion { private static SqlSessionFactory factory = null; public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; Reader reader = null; SqlSession session = null; reader = Resources.getResourceAsReader(resource); factory = new SqlSessionFactoryBuilder().build(reader); factory.getConfiguration().addMapper(MyMapper.class); reader.close(); try { session = factory.openSession(); String version = session.selectOne("getMySQLVersion"); System.out.println(version); } finally { if (session != null) { session.close(); } } } } ``` 我們連接到數據庫并獲取 MySQL 的版本。 ```java String resource = "mybatis-config.xml"; Reader reader = null; SqlSession session = null; reader = Resources.getResourceAsReader(resource); ``` 讀取配置文件。 ```java factory = new SqlSessionFactoryBuilder().build(reader); ``` `SqlSessionFactoryBuilder`用于構建`SqlSession`實例。 ```java factory.getConfiguration().addMapper(MyMapper.class); ``` 使用`addMapper()`方法,將映射類添加到工廠。 ```java session = factory.openSession(); ``` `openSession()`方法創建一個`SqlSession`。 `SqlSession`是用于 MyBatis 的主要 Java 接口。 通過該接口,我們執行命令,獲取映射器并管理事務。 ```java String version = session.selectOne("getMySQLVersion"); ``` `selectOne()`方法從語句鍵檢索映射的單個行。 語句鍵是映射器類中方法的名稱。 ```java System.out.println(version); ``` 該版本將打印到控制臺。 ```java } finally { if (session != null) { session.close(); } } ``` 最后,會話關閉。 ## MySQL 版本 2 在第二個示例中,我們還將檢索 MySQL 的版本。 這次我們使用 XML 映射器代替注釋。 mybatis-config.xml ```java <?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:3306/testdb"/> <property name="username" value="testuser"/> <property name="password" value="test623"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mymapper.xml"/> </mappers> </configuration> ``` 使用`<mappers>`標簽,指定映射文件。 `mymapper.xml` ```java <?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.zetcode"> <select id="mysqlVersion" resultType="String"> SELECT VERSION() </select> </mapper> ``` 我們使用`<select>`標簽定義映射。 `MyBatisMySQLVersion2.java` ```java package com.zetcode.version2; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisMySQLVersion2 { private static SqlSessionFactory factory = null; public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; Reader reader = null; SqlSession session = null; reader = Resources.getResourceAsReader(resource); factory = new SqlSessionFactoryBuilder().build(reader); reader.close(); try { session = factory.openSession(); String version = session.selectOne("mysqlVersion"); System.out.println(version); } finally { if (session != null) { session.close(); } } } } ``` 這是主要的類。 區別在于我們沒有在映射器中添加`addMapper()`,而是從配置文件中讀取映射器。 ## MyBatis Java 配置 可以在不使用 XML 的情況下以純 Java 配置 MyBatis。 在下面的示例中,我們將查找表中的書籍數量。 `MyMapper.java` ```java package com.zetcode.map; import org.apache.ibatis.annotations.Select; public interface MyMapper { @Select("SELECT COUNT(*) FROM MyBooks") public int getNumberOfBooks(); } ``` `MyMapper`包含對`MyBooks`表中的行數進行計數的 SQL 代碼。 `MyDataSourceFactory.java` ```java package com.zetcode.jconfig; import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.datasource.DataSourceFactory; import org.apache.ibatis.datasource.pooled.PooledDataSource; public class MyDataSourceFactory implements DataSourceFactory { private Properties prop; @Override public DataSource getDataSource() { PooledDataSource ds = new PooledDataSource(); ds.setDriver(prop.getProperty("driver")); ds.setUrl(prop.getProperty("url")); ds.setUsername(prop.getProperty("user")); ds.setPassword(prop.getProperty("password")); return ds; } @Override public void setProperties(Properties prprts) { prop = prprts; } } ``` `MyDataSourceFactory`從給定的屬性創建一個`PooledDataSource`。 `PooledDataSource`是一個簡單,同步,線程安全的數據庫連接池。 `MyBatisJavaConfClient.java` ```java package com.zetcode.client; import com.zetcode.jconfig.MyDataSourceFactory; import com.zetcode.jconfig.MyMapper; import java.io.IOException; import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; public class MyBatisJavaConfClient { private static SqlSessionFactory sesFact = null; public static void main(String[] args) throws IOException { Properties prop = new Properties(); prop.setProperty("driver", "com.mysql.jdbc.Driver"); prop.setProperty("url", "jdbc:mysql://localhost:3306/testdb"); prop.setProperty("user", "testuser"); prop.setProperty("password", "test623"); MyDataSourceFactory mdsf = new MyDataSourceFactory(); mdsf.setProperties(prop); DataSource ds = mdsf.getDataSource(); TransactionFactory trFact = new JdbcTransactionFactory(); Environment environment = new Environment("development", trFact, ds); Configuration config = new Configuration(environment); config.addMapper(MyMapper.class); sesFact = new SqlSessionFactoryBuilder().build(config); try (SqlSession session = sesFact.openSession()) { int numOfBooks = session.selectOne("getNumberOfBooks"); System.out.format("There are %d books", numOfBooks); } } } ``` 在`MyBatisJavaConfClient`中,我們用 Java 代碼配置 MyBatis,構建 SQL 會話,并執行`getNumberOfBooks()`方法。 ```java Properties prop = new Properties(); prop.setProperty("driver", "com.mysql.jdbc.Driver"); prop.setProperty("url", "jdbc:mysql://localhost:3306/testdb"); prop.setProperty("user", "testuser"); prop.setProperty("password", "test623"); ``` 在這里,我們設置數據庫屬性。 ```java MyDataSourceFactory mdsf = new MyDataSourceFactory(); mdsf.setProperties(prop); DataSource ds = mdsf.getDataSource(); ``` 我們使用`MyDataSourceFactory`獲得數據源。 ```java TransactionFactory trFact = new JdbcTransactionFactory(); Environment environment = new Environment("development", trFact, ds); Configuration config = new Configuration(environment); config.addMapper(MyMapper.class); ``` 此代碼替換 XML 配置。 我們使用`JdbcTransactionFactory`,`Environment`和`Configuration`類。 ```java sesFact = new SqlSessionFactoryBuilder().build(config); ``` `Configuration`類的實例傳遞給`SqlSessionFactoryBuilder`的`build()`方法。 ## 動態 SQL 動態 SQL 允許我們使用`<if>`,`<where>`或`<foreach>`之類的標簽創建動態 SQL 查詢。 mybatis-config.xml ```java <?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> <typeAliases> <typeAlias alias="Book" type="com.zetcode.mybatisdynamicsql.bean.Book"/> </typeAliases> <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:3306/testdb"/> <property name="username" value="testuser"/> <property name="password" value="test623"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mymapper.xml"/> </mappers> </configuration> ``` 首先,我們提供`mybatis-config.xml`配置文件。 `mymapper.xml` ```java <?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.zetcode"> <select id = "getBook" resultType = "Book"> SELECT * FROM MyBooks <where> <if test = "_parameter != null"> Id = #{id} </if> </where> </select> </mapper> ``` `mymapper.xml`包含動態 SQL 表達式。 ```java <where> <if test = "_parameter != null"> Id = #{id} </if> </where> ``` 僅當`Id`參數不為`null`時,才包含`<where>`標記的內容。 實際上,SQL 表達式返回一本由其 ID 標識的書,否則返回所有書。 `Book.java` ```java package com.zetcode.mybatisdynamicsql.bean; public class Book { private Long id; private String author; private String title; private int published; private String remark; public Book() {}; public Book(String author, String title, int published, String remark) { this.author = author; this.title = title; this.published = published; this.remark = remark; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPublished() { return published; } public void setPublished(int published) { this.published = published; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "Book{" + "id=" + id + ", author=" + author + ", " + "title=" + title + ", published=" + published + ", remark=" + remark + '}'; } } ``` 這是`Book` bean,它映射到我們的結果數據。 `Book.java` ```java package com.zetcode.mybatisdynamicsql; import com.zetcode.mybatisdynamicsql.bean.Book; import java.io.IOException; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisDynamicSQL { private static SqlSessionFactory factory = null; public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; Reader reader = null; SqlSession session = null; reader = Resources.getResourceAsReader(resource); factory = new SqlSessionFactoryBuilder().build(reader); try { session = factory.openSession(); Book book = session.selectOne("getBook", 1); System.out.println(book); List<Book> books = session.selectList("getBook"); for (Book b : books) { System.out.println(b); } } finally { if (session != null) { session.close(); } } } } ``` 使用一個聲明鍵,我們檢索一本特定的書和所有書。 ```java Book book = session.selectOne("getBook", 1); ``` 在這里,我們檢索由 ID 標識的一本書。 ```java List<Book> books = session.selectList("getBook"); ``` 在這里,我們檢索所有書籍; 第二個參數未傳遞。 ## 圖書 在下一個示例中,我們將插入數據庫表并從中讀取書籍。 ![MyBatisMySQLBooks project structure](https://img.kancloud.cn/f6/ad/f6ad95280b796a4028143a89809fe034_248x343.jpg) 圖:MyBatisMySQLBooks 項目結構 這是 NetBeans 中的項目結構。 `Book.java` ```java package com.zetcode.books.bean; public class Book { private Long id; private String author; private String title; private int published; private String remark; public Book() {}; public Book(String author, String title, int published, String remark) { this.author = author; this.title = title; this.published = published; this.remark = remark; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPublished() { return published; } public void setPublished(int published) { this.published = published; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "Book{" + "id=" + id + ", author=" + author + ", " + "title=" + title + ", published=" + published + ", remark=" + remark + '}'; } } ``` 這是`Book` bean。 MyBatis 將表列映射到此類。 注意空構造器的顯式用法。 mybatis-config.xml ```java <?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> <typeAliases> <typeAlias alias="Book" type="com.zetcode.books.bean.Book"/> </typeAliases> <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:3306/testdb"/> <property name="username" value="testuser"/> <property name="password" value="test623"/> </dataSource> </environment> </environments> </configuration> ``` 在`mybatis-config.xml`文件中,我們使用`<typeAlias>`標簽定義新的`Book`類型。 `MyMapper.java` ```java package com.zetcode.map; import com.zetcode.books.bean.Book; import java.util.List; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; public interface MyMapper { @Select("SELECT * FROM MyBooks WHERE Id = #{id}") public Book getBookById(Long id); @Select("SELECT * FROM MyBooks WHERE Author = #{author}") public List<Book> getBooksByAuthor(String author); @Insert("INSERT INTO MyBooks(Author, Title, Published, Remark) " + "VALUES(#{author}, #{title}, #{published}, #{remark})") public void insertBook(String author, String title, int published, String remark); } ``` 在`MyMapper`接口中,我們有三個注解。 ```java @Select("SELECT * FROM MyBooks WHERE Id = #{id}") public Book getBookById(Long id); ``` 該注解將`getBookById()`方法映射到指定的`SELECT`語句。 該方法返回一個`Book`對象。 ```java @Select("SELECT * FROM MyBooks WHERE Author = #{author}") public List<Book> getBooksByAuthor(String author); ``` 我們將`SELECT`語句映射到`getBooksByAuthor()`方法的列表,該方法返回書對象的列表。 ```java @Insert("INSERT INTO MyBooks(Author, Title, Published, Remark) " + "VALUES(#{author}, #{title}, #{published}, #{remark})") public void insertBook(String author, String title, int published, String remark); ``` 使用`@Insert`注解,我們將`INSERT`語句映射到`insertBook()`方法名稱。 `MyBatisBooks.java` ```java package com.zetcode.client; import com.zetcode.map.MyMapper; import com.zetcode.books.bean.Book; import com.zetcode.util.MyBatisUtils; import java.io.IOException; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; public class MyBatisBooks { private static SqlSessionFactory factory = null; public static void main(String[] args) throws IOException { SqlSession session = null; factory = MyBatisUtils.getSqlSessionFactory(); factory.getConfiguration().addMapper(MyMapper.class); try { session = factory.openSession(); Book book = session.selectOne("getBookById", 4L); System.out.println(book); List<Book> books = session.selectList("getBooksByAuthor", "Leo Tolstoy"); for (Book b : books) { System.out.println(b); } Book newBook = new Book("Miguel de Cervantes", "Don Quixote", 1605, "First modern novel"); session.update("insertBook", newBook); session.commit(); } finally { if (session != null) { session.close(); } } } } ``` 在主類中,我們通過 ID 來選擇一本書,從作者中選擇所有書籍,然后將新書籍插入表中。 ```java Book book = session.selectOne("getBookById", 4L); ``` 使用會話的`selectOne()`方法檢索一本新書。 ```java List<Book> books = session.selectList("getBooksByAuthor", "Leo Tolstoy"); for (Book b : books) { System.out.println(b); } ``` 列夫·托爾斯泰的所有書籍都是使用會話的`selectList()`方法檢索的。 ```java session.update("insertBook", newBook); session.commit(); ``` 使用會話的`update()`方法插入一本新書。 該方法將`Book`實例作為第二個參數。 更改將通過`commit()`提交到數據庫。 這是 MyBatis 教程。 您可能也對 [JDBI 教程](/db/jdbi/), [PostgreSQL Java 教程](/db/postgresqljavatutorial/), [MongoDB Java 教程](/db/mongodbjava/)或 [MySQL 教程](/databases/mysqltutorial/)感興趣。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看