過久沒用Mybatis了,基本都忘了,整理一下基本用法,其它高級的使用方法,用到的時候再看。 java
注意:本文代碼還未測試驗證。 mysql
1. Maven工程POM文件添加的依賴(JUNIT依賴未列出) git
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.2</version> </dependency>
2. Mybatis三個必備元素和一個輔助元素 github
(1) Mybatis環境配置文件:主要設置鏈接數據庫所須要的信息(如:鏈接方式、驅動、數據庫URL、用戶名和密碼等),同時也放了一些其它的信息,方便開發;(對應Demo文件:mybatis-config.xml) sql
(2) SQL映射文件:主要存放本身編輯的SQL語句及一些表與類的映射關係;(對應Demo文件:UserMapper.xml) 數據庫
(3) 接口類:接口類的方法主要與SQL映射文件中對應ID的SQL語句進行映射(映射方式有兩種,具體在Demo後有說明),實如今調用接口類對應方法時,方法會調相應SQL語句,並根據配置返回相應結果;(對應Demo文件:UserDao.java) apache
(4) 接口實現類:這是一個輔助元素,主要是爲了自主地配置接口類中方法與SQL映射文件中SQL語句的映射關係。(對應Demo文件:UserDaoImpl.java) session
工程文件結構: mybatis
紅框部分爲本文內容相關的文件。 app
3. Demo代碼
(1) mybatis-config.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前面 --> <typeAliases> <typeAlias alias="User" type="tutorial.demo.database.User"/> </typeAliases> <!-- 若是沒有在調用的時候 沒有指定數據庫環境時,默認建立鏈接id=development數據庫環境的session --> <environments default="development"> <!-- 開發環境數據 --> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/demo"/> <property name="username" value="root"/> <property name="password" value="cdyanfa"/> </dataSource> </environment> <!-- 生產環境數據 --> <environment id="product"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/demo"/> <property name="username" value="root"/> <property name="password" value="cdyanfa"/> </dataSource> </environment> <!-- 備用環境數據 --> <environment id="other"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://110.110.110.110:3306/demo"/> <property name="username" value="root"/> <property name="password" value="cdyanfa"/> </dataSource> </environment> </environments> <!-- SQL映射文件 --> <mappers> <mapper resource="resources/mybatis/UserMapper.xml"/> </mappers> </configuration>(2) 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="userDao"> <!-- type映射的類名,id後面設置resultMap時用到,表示結果對應哪一個類型的映射關係 --> <!-- 注:若是表中列名與類的屬性名一致,且類按javaBean規範構造,映射關係可省略,具體緣由可參考java的反射原理 --> <resultMap type="User" id="UserMapper"> <id column="id" property="userId" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> </resultMap> <select id="selectAllUser" resultMap="UserMapper"> select * from user; </select> <select id="selectUserById" parameterType="int" resultMap="UserMapper"> select * from user where id = #{userId, jdbcType=INTEGER} limit 0, 1; </select> <!-- useGeneratedKeys="true" keyProperty="id" 將生成的主鍵 值返回 --> <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id"> insert into user(username, password) values(#{username, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR}); <!-- 第二種返回主鍵的方式 --> <!-- <selectKey resultType="long" order="AFTER" keyProperty="id" > SELECT LAST_INSERT_ID() </selectKey> --> </insert> <update id="update" parameterType="User"> update user <set> <if test="username != null"> username = #{username,jdbcType=VARCHAR}, </if> <if test="password != null"> password = #{password,jdbcType=VARCHAR}, </if> </set> where id = #{userId, jdbcType=INTEGER}; </update> <delete id="delete" parameterType="int"> delete from user where id = #{userId, jdbcType=INTEGER}; </delete> </mapper>(3) UserDao.java文件:
package tutorial.demo.database; import java.util.List; public interface UserDao { public long insert(User user); public long update(User user); public long delete(long userId); public List<User> selectAllUser(); public User selectUserById(long userId); }
(4) UserDaoImpl.java文件:
package tutorial.demo.database; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; public class UserDaoImpl implements UserDao { SqlSessionFactory factory = null; public UserDaoImpl() { } public UserDaoImpl(SqlSessionFactory factory) { this.factory = factory; } public SqlSessionFactory getFactory() { return factory; } public void setFactory(SqlSessionFactory factory) { this.factory = factory; } public long insert(User user) { SqlSession session = factory.openSession(); session.insert("insert", user); return user.getUserId(); } public long update(User user) { SqlSession session = factory.openSession(); session.update("update", user); return user.getUserId(); } public long delete(long userId) { SqlSession session = factory.openSession(); session.delete("delete", userId); return userId; } public List<User> selectAllUser() { SqlSession session = factory.openSession(); List<User> userList = session.selectList("selectAllUser"); return userList; } public User selectUserById(long userId) { SqlSession session = factory.openSession(); User user = session.selectOne("selectUserById", userId); return user; } }(5) MybatisTest.java文件(這個是一個基於JUNIT的測試類):
package tutorial.demo.database.test; 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; import org.junit.Before; import org.junit.Test; import tutorial.demo.database.User; import tutorial.demo.database.UserDao; import tutorial.demo.database.UserDaoImpl; public class MybatisTest { SqlSessionFactory factory; // 在測試用例執行前執行 @Before public void init() throws IOException { // 在使用數據時,加載數據配置文件,在需時與數據庫通訊時,根據配置建立會話。 String resource = "classpath:resources/mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); factory = builder.build(reader); } // 直接使用接口的測試用例:由mybatis相關功能建立方法與對應SQL操做id的映射 @Test public void testDao() { // 建立會話 SqlSession session = factory.openSession(); // 創建UserMapper.xml定義的SQL語句與UserDao接口中方法的映射關係 UserDao userDao = session.getMapper(UserDao.class); User user = new User(); user.setUserName("fengfeng"); user.setPassword("123456"); userDao.insert(user); // 輸出返回的用戶ID System.out.println("The user id is: " + user.getUserId()); } // 使用接口實現的測試用例:開發人員自定義方法與SQL操做id的映射關係 @Test public void testDaoImpl() { UserDao userDao = new UserDaoImpl(factory); User user = new User(); user.setUserName("tiantian"); user.setPassword("654321"); userDao.insert(user); List<User> userList = userDao.selectAllUser(); for (User u: userList) { System.out.println(u.getUserId() + "\t\t" + u.getUserName() + "\t\t" + u.getPassword()); } } }
4. 說明
在上面的測試類中,咱們能夠看到有兩種方式的調用方式:使用接口類的調用方式和使用接口實現類的調用方式,其中,
(1) 接口類的調用方式
接口類的調用方式使用
UserDao userDao = session.getMapper(UserDao.class);這一句使得接口類中的方法與SQL映射文件中 同名ID的SQL語句構成一個映射關係,當調用接口方法時,自動去執行相應的SQL語句,SQL語句執行結果以接口返回類型返回。
(2) 接口實現類的調用方式
對使用接口實現類調用方式中,咱們沒有使用到上述的方法,由於在實現類中,咱們已經在方法實現裏映射的SQL語句,因此再也不須要調用SqlSession.getMapper()進行映射。