小白學習MyBatis的第一天,學習資料包括MyBatis3的官方文檔,以及孤傲蒼狼大佬的博客。這里先致敬大佬。
· 首先,什么是MyBatis?
引用官網的一段話,“MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。”
MyBatis的一個強大之處在於,“避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集”。舉個栗子,傳統的JDBC在拼接SQL語句的過程中,經常會出現少加空格、多個逗號、多個AND/OR之類的錯誤,不勝其煩;MyBatis的動態SQL中的<if>,<choose>,<where>等語法很好的解決了這一問題。這段在后面動態SQL部分細說。
好了,閑話少說,進入正題。
· 建立Java項目,導入Jar包
首先展示一下工程目錄。在classpath目錄下,建立一個lib文件夾,導入以下三個jar包。
mybatis-3.4.6.jar即是MyBatis的jar包,要使用MyBatis, 只需將mybatis-x.x.x.jar文件置於 classpath 中即可;
mysql-connector-java即數據庫驅動;
log4j用於顯示日志,可以在調試過程中打印出SQL語句,便於學習。
【挖個坑:log4j的jar包和log4j.properties共同用於輸出日志,至於原理……我也沒搞懂】
——————————————————————————————————————————————————————————
數據庫方面,建立一張user表,插入張三和李四兩個用戶。
· 先實現一個最簡單的查詢
先看一眼工程目錄,建立如下的文件:
目前src下需要bean,dao,config和util四個包,分別存放JavaBean,配置文件,客戶端代碼(使用MyBatis執行各種操作),以及工具類(封裝了獲取SqlSession的方法)。
首先在src下的config文件下,寫一個總的配置文件MyBatisConfiguration.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="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="Danny2036"/> </dataSource> </environment> </environments> </configuration>
這里先只需要環境配置,即environments中的driver,url,username和password四項。
driver為驅動,在mysql-connector-java 5中,值為"com.mysql.jdbc.Driver"; mysql-connector-java 6中,值為"com.mysql.cj.jdbc.Driver"。其他項包括url,username,password,根據自己的數據庫進行配置。
在bean目錄下建立JavaBean。(這里先不要管那個UID)
package com.alleymeowy.bean; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 3305858088000394142L; private Integer id; private String name; private Integer age; // 快速生成構造函數 toString方法 以及get&set方法的快捷鍵 alt+insert public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public User(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age='" + age + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getage() { return age; } public void setage(Integer age) { this.age = age; } }
在util包里添加一個獲取SqlSession的方法。
package com.alleymeowy.util; 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.Reader; public class DBUtil { public static SqlSession getSqlSession() throws IOException { // 1.reader Reader reader = Resources.getResourceAsReader("com/alleymeowy/config/MyBatisConfiguration.xml"); // 2.SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 3.SqlSession return sqlSessionFactory.openSession(); } }
在config包下建一個sql包,添加Users.xml文件,實現selectOne和selectAll方法。
<?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.alleymeowy.config.sql.Users"> <select id="selectOne" parameterType="int" resultType="com.alleymeowy.bean.User"> select id, name, age from user where id = #{id} </select> <select id="selectAll" resultType="com.alleymeowy.bean.User"> select id, name, age from user </select> </mapper>
【注意:這里需要在總配置文件里加上mappers的聲明,放在<environments>標簽之后。總配置文件的標簽需要按順序擺放,詳見官方文檔。】
<mappers> <mapper resource="com/alleymeowy/config/sql/Users.xml"/> <!--<mapper class="com.alleymeowy.annotation.UserMapper"/>--> <!--<mapper class="com.alleymeowy.mapper.BlogMapper"/>--> </mappers>
在dao包里寫一個實現類。先實現一個最簡單的selectOne和selectAll方法。
package com.alleymeowy.dao; import com.alleymeowy.bean.User; import com.alleymeowy.util.DBUtil; import org.apache.ibatis.session.SqlSession; import java.io.IOException; import java.util.List; public class UserDAO { /** * 根據id查詢一條記錄 * @param id * @throws IOException */ public static User selectOne(int id) throws IOException { SqlSession sqlSession = null; User user; try { sqlSession = DBUtil.getSqlSession(); user = sqlSession.selectOne("com.alleymeowy.config.sql.Users.selectOne", id); } finally { sqlSession.close(); } return user; } /** * 查詢多條記錄 * @throws IOException */ public static List<User> selectAll() throws IOException { SqlSession sqlSession = null; List<User> users; try { sqlSession = DBUtil.getSqlSession(); users = sqlSession.selectList("com.alleymeowy.config.sql.Users.selectAll"); } finally { sqlSession.close(); } return users; } public static void main(String[] args) throws IOException { System.out.println(selectOne(1)); System.out.println("************"); System.out.println(selectAll()); } }
最后給出查詢結果(只給出查詢結果,不顯示日志等)
User{id=1, name='Zhang3', age='10'} ************[User{id=1, name='Zhang3', age='10'}, User{id=2, name='Li4', age='20'}, User{id=3, name='erha', age='10'}, User{id=4, name='NotUser', age='21'}, User{id=5, name='NotUser2', age='22'}] Process finished with exit code 0
完畢。