mybatis從入門到精通(一) 入門
一丶什么是mybatis
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
-- 資料來源於官方文檔
二丶入門文檔資料
(mybatis其實很簡單, 有一定編程基礎的可以直接查看官方文檔, 進行學習, 筆者認為這是一種進步, 可以獲得第一手資料)
三丶准備開發環境
1. 筆者使用idea開發工具新建maven項目(至於如何安裝使用idea開發工具, 可以直接百度, 本文不做介紹), 然后在maven倉庫中搜索mybatis對應的坐標, 筆者使用的版本如下
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency>
可以將上面maven坐標復制到pom.xml文件中, 筆者完整的pom.xml配置文件可以點此查看
2. 准備mysql數據庫
可以直接mysql官網下載社區版,(至於如何安裝使用, 可以直接百度, 本文不做介紹). 可以使用mysql workbench 或者navicat等數據庫界面工具導入執行user.sql和email.sql兩個數據腳本, 至此環境准備結束
四丶准備mybatis配置文件
在resources文件夾新建mybatis-config.xml配置文件和datasource.properties數據源屬性文件
mybatsi-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> <!-- 配置外部屬性 --> <properties resource="datasource.properties" /> <!-- 添加日志實現 --> <settings> <setting name="logImpl" value="LOG4J"/> <!-- 是否開啟下划線和駝峰式的自動轉換, http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <environments default="development"> <environment id="development" > <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> </configuration>
datasource.properties, 注意, username, password改成自身數據庫對應的賬號密碼
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username=root password=root
為方便調試, 添加log4j日志配置, 需要與mybatis-config.xml中的配置一致, 同時需要在pom.xml文件中引入對應的jar包
log4j.properties
# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n # mybatis 打印sql log4j.logger.com.ttx.example.mapper=DEBUG
五丶准備數據庫表實體類和對應的mapper文件
1. 在src/main/java中新建實體類, User
public class User { private Integer userId; private String userName; private Integer age; private String country; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
2.新建mapper接口類文件UserMapper, 並寫下查詢方法, 參數為userId, 注意, 當參數為多個時, 需要使用@Param注解標明參數的名稱
public interface UserMapper { User selectUser(@Param("userId") int userId); }
3. 新建mapper對應的查詢語句映射文件UserMapper.xml ,
注意, 名稱需要和上一步的類名一致
其中, resultMap為查詢結果的映射配置, 用於指定數據表字段名和user實體類屬性名的映射關系, id指明該字段為數據唯一標識
<select>元素對應查詢語句, id對應上一步中的查詢方法名, resultMap指定如何映射轉換查詢結果,
'select * from user where user_id = #{userId}' 為查詢語句, #{userId} 為查詢的參數, 和上一步中的@Param("userId")對應
<?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.ttx.example.mapper.UserMapper"> <resultMap id="UserMap" type="com.ttx.example.entity.User"> <id column="user_id" property="userId"/> <result column="user_name" property="userName"/> <result column="age" property="age"/> <result column="country" property="country"/> </resultMap> <sql id="baseColumn"> user_id, user_name, age, country </sql> <select id="selectUser" resultMap="UserMap"> select * from user where user_id = #{userId} </select> </mapper>
六丶在mybatis-config.xml中添加UserMapper.xml映射文件
注意, <mappers>元素在<environments>元素下方
<mappers> <mapper resource="com/ttx/example/mapper/UserMapper.xml"/> </mappers>
七丶使用junit測試框架測試本demo
需要在pom.xml文件中引入對應的jar包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
在src/test中新建對應的測試類
public class MybatisTests { private SqlSession sqlSession; private UserMapper userMapper; @Before public void init() throws IOException { //讀取mybatis-config.xml配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //根據配置文件創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); this.sqlSession=sqlSessionFactory.openSession(); this.userMapper=sqlSession.getMapper(UserMapper.class); } @After public void destroy(){ this.sqlSession.close(); } @Test public void selectTest(){ // 查詢 User user=userMapper.selectUser(1); sqlSession.commit(); System.out.println("name: "+user.getUserName()+", age: "+user.getAge()); Assert.assertEquals(new Integer(1), user.getUserId()); } }
最后運行selectTest()方法即可
運行結果為:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - PooledDataSource forcefully closed/removed all connections. DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 41489123. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@27912e3] DEBUG [main] - ==> Preparing: select * from user where user_id = ? DEBUG [main] - ==> Parameters: 1(Integer)'socket' DEBUG [main] - <== Total: 1 name: ttx, age: 11 DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@27912e3] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@27912e3] DEBUG [main] - Returned connection 41489123 to pool.
注意事項, service層的通用模板如下, 本文的測試用例並沒有這樣寫
SqlSession sqlSession=null; try{ sqlSession=sqlSessionFactory.openSession(); //默認是開啟事務, 不自動提交 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=userMapper.selectUser(1); sqlSession.commit(); //提交事務 }catch (Exception e){ e.printStackTrace(); if(sqlSession!=null){ sqlSession.rollback(); //出現異常, 回滾 } }finally { if(sqlSession!=null){ sqlSession.close(); // 需要關閉連接 } }
完整源碼: 點此查看
學習資料: