MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。項目GitHub地址
下載MyBatis源碼,導入到IDEA工程(Maven工程)中,工程結構如下:

在pom.xml中新增如下依賴:
<!-- MySQL相關 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
等待依賴更新完畢后,如果出現了@Override覆蓋接口方法報錯問題,請參考IDEA中 @override報錯的解決方法。
MyBatis配置conf.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> <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="false"/> <!--setting name="logImpl" value="STDOUT_LOGGING"/--> <!-- 日志 --> </settings> <typeAliases> <typeAlias type="com.luoxn28.dao.User" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 聲明使用那種事務管理機制 JDBC/MANAGED --> <!-- 配置數據庫連接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://192.168.1.150:3306/xxx" /> <property name="username" value="xxx" /> <property name="password" value="xxx" /> </dataSource> </environment> </environments> <mappers> <mapper resource="userMapper.xml"/> </mappers> </configuration>
User類的映射文件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"> <mapper namespace="com.luoxn28.dao.UserDao"> <select id="getById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id=#{id}; <!-- #{xxx} xxx為類中的數據域名稱 --> </select> <select id="getAll" resultType="com.luoxn28.dao.User"> SELECT * FROM user; </select> </mapper>
測試代碼:
/** * MyBatis測試類 */ public class TestMain { public static void main(String[] args) throws IOException { String resouce = "conf.xml"; //InputStream is = TestMain.class.getClassLoader().getResourceAsStream(resouce); InputStream is = Resources.getResourceAsStream(resouce); // 構建sqlSession工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession session = sqlSessionFactory.openSession(); /** * 第一種方式: 直接執行已映射的 SQL 語句 */ String statement = "com.luoxn28.dao.UserDao.getById"; User user = session.selectOne(statement, 1); System.out.println(user); System.out.println("---------------------"); /** * 第二種方式: 執行更清晰和類型安全的代碼 */ UserDao userDao = session.getMapper(UserDao.class); user = userDao.getById(1); System.out.println(user); } }
User用戶類:
/** * User - 用戶類 */ public class User { public static final int MAN = 0; // 男生 public static final int WOMAN = 1; // 女生 public static final int OTHER = 2; // 其他 private int id; // 用戶id private String name; // 用戶名 private String password; // 用戶密碼 private int sex; // 用戶性別 private String email; // 用戶郵箱 private String phone; // 用戶手機 private String admin; // 用戶是否是管理員,"admin"表示是管理員,其他為普通用戶 public User() { } public User(String name, String password, int sex, String email, String phone) { this.name = name; this.password = password; this.sex = sex; this.email = email; this.phone = phone; this.admin = ""; } public User(String name, String password, String sex, String email, String phone) { this.name = name; this.password = password; setSex(sex); // this.sex = sex; this.email = email; this.phone = phone; this.admin = ""; } 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 getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public void setSex(String sexStr) { int sex = Integer.valueOf(sexStr); switch (Integer.valueOf(sexStr)) { case 0: { this.sex = MAN; break; } case 1: { this.sex = WOMAN; break; } default: { this.sex = OTHER; break; } } } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAdmin() { return admin; } public void setAdmin(String admin) { this.admin = admin; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", sex=" + sex + ", email='" + email + '\'' + ", phone='" + phone + '\'' + ", admin='" + admin + '\'' + '}'; } }
UserDao用戶操作類
/** * UserDao - User操作類 */ public interface UserDao { public User getById(int id); public List<User> getAll(); }
以上示例代碼是用XML來設置映射語句的,當然,也可以用Java注解來做。比如,上面的 XML 示例可被替換如下:
/** * UserDao - User操作類 */ public interface UserDao { @Select("SELECT * FROM user WHERE id=#{id}") public User getById(int id); @Select("SELECT * FROM user") public List<User> getAll(); }
使用注解時調用實例:
UserDao userDao = session.getMapper(UserDao.class); user = userDao.getById(1); System.out.println(user);
對於簡單語句來說,注解使代碼顯得更加簡潔,然而 Java 注解對於稍微復雜的語句就會力不從心並且會顯得更加混亂。因此,如果你需要做很復雜的事情,那么最好使用 XML 來映射語句。選擇何種方式以及映射語句的定義的一致性對你來說有多重要這些完全取決於你和你的團隊。換句話說,永遠不要拘泥於一種方式,你可以很輕松的在基於注解和 XML 的語句映射方式間自由移植和切換。注意:UserDao接口的getById方法配置了注解,那么就不要XML中配置<select id="getById">xxx</select>了,否則程序會報異常。
參考:
