mybatis 的開發環境搭建,選擇: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。這些軟件工具均可以到各自的官方網站上下載。
首先建立一個名字為 MyBaits 的 dynamic web project
1. 可以創建maven項目,依賴的包mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar
<!-- mybatis包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.0</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.22</version> </dependency>
2、構建後的項目結構
需求:
根據id(主鍵)查詢用戶信息
根據用戶名模糊查詢用戶信息
添加用戶
更新用戶
刪除用戶
在新建一個源代碼目錄config,在config目錄下使用以下的log4j屬性文件(可以從mybatis示例程序中拷貝):
添加log4j
# 開發環境中日志的級別使用DEBUG,生產環境中日志級別為ERROR log4j.rootLogger=DEBUG, stdout
log4j.logger.org.mybatis.example.BlogMapper=TRACE # 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
1. 設置mybatis 配置文件:Configuration.xml, 在src/main/java目錄下建立此文件
注意:這裡的typeAlias就相當於起別名,為com.yihaomen.mybatis.model.User包起一個user別名。
內容如下:
<?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="User" type="com.yihaomen.mybatis.model.User"/> </typeAliases> <!-- spring整合之後,environments配置將廢除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理,事務控制有mybatis --> <transactionManager type="JDBC"/> <!-- 數據庫連接池 ,有mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.6.1:3306/test"/> <property name="username" value="dev"/> <property name="password" value="123qwe"/> </dataSource> </environment> </environments> <!-- 加載映射文件 --> <mappers> <mapper resource="com/yihaomen/mybatis/model/User.xml"/> </mappers> </configuration>
2、建立與數據庫對應的 java class,以及映射文件.
package com.yihaomen.mybatis.model; public class User { private int id; private String userName; private int userAge; private String userAddress; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserAge() { return userAge; } public void setUserAge(int userAge) { this.userAge = userAge; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } }
3、同時建立這個User 的映射文件 User.xml:這裡邊的sql就包括對數據庫的增刪改查操作。
<?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"> <!-- namespace命名空間,作用就是對sql進行分類化管理,注意:使用mapper代理方法開發,namespace有特殊重要作用 --> <mapper namespace="com.yihaomen.mybatis.dao.IUserOperation"> <!-- 在映射文件中配置很多sql --> <!-- id標識映射文件的sql,稱為statement的id ,將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸入類型 resultType:指定sql輸出結果的所映射的java對象,select指定resultType表示將單挑記錄 映射成java對象--> <select id="selectUserByID" parameterType="int" resultType="User"> select * from `user` where id = #{id} </select> <insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> insert into user(userName,userAge,userAddress) values(#{userName},#{userAge},#{userAddress}) </insert> <update id="updateUser" parameterType="User"> update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <select id="list" resultType="User"> select * from `user` </select> <!-- ${}表示拼接sql串,指定就是單挑記錄所映射的java對象類型,使用${}拼接,容易導致sql注入 ${value}:拼接輸入參數的內容,如果傳入類型是簡單類型,${}中只能使用value --> <select id="findUserByName" parameterType="String" resultType="User"> select * from `user` where username like '%${value}%' </select> </mapper>
下面對這幾個配置文件解釋下:
1.Configuration.xml 是 mybatis 用來建立 sessionFactory 用的,裡面主要包含了數據庫連接相關東西,還有 java 類所對應的別名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 這個別名非常重要,你在 具體的類的映射中,比如User.xml 中 resultType 就是對應這裡的。要保持一致,當然這裡的 resultType 還有另外單獨的定義方式,後面再說。
2. Configuration.xml 裡面 的<mapper resource="com/yihaomen/mybatis/model/User.xml"/>是包含要映射的類的xml配置文件。
3. 在User.xml 文件裡面 主要是定義各種SQL 語句,以及這些語句的參數,以及要返回的類型等.
4、為了以接口方式編程,而且是更好的方法,使用合理描述參數和SQL語句返回值的接口(比如IUserOperation.class),這樣現在就可以至此那個更簡單,更安全的代碼,沒有容易發生的字符串文字和轉換的錯誤.下面是詳細過程:
在目錄下建立 com.yihaomen.mybatis.dao 這個包,並建立接口類 IUserOperation , 內容如下
package com.yihaomen.mybatis.dao; import java.util.List; import com.yihaomen.mybatis.model.Article; import com.yihaomen.mybatis.model.User; //注意:接口名字必須與 xml中的namespace名字一樣 2、接口實現方法每個名字 與xml中的id對應 public interface IUserOperation { //查詢數據 public User selectUserByID(int id); //增加數據 public void addUser(User user); //更新數據 public void updateUser(User user); //刪除數據 public void deleteUser(int id); //聯合查詢 public List<Article> getUserArticles(int id); //list獲取 public List<User> list(); //模糊查詢 public List<User> findUserByName(String name); }
5、開始測試,測試類:
package com.yihaomen.mybatis.ui; 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 com.yihaomen.mybatis.dao.IUserOperation; import com.yihaomen.mybatis.model.User; public class Test { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; //創建會話工廠,傳入mybatis的配置文件信息 static{ try{ //得到配置文件流 reader = Resources.getResourceAsReader("Configuration.xml"); //創建會話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); }catch(Exception e){ e.printStackTrace(); } } //公共方法,返回初始化的sqlSessionFactory對象 public static SqlSessionFactory getSession(){ return sqlSessionFactory; } //查詢數據 public void select() { //通過工廠得到sqlsession SqlSession session = sqlSessionFactory.openSession(); try { //通過SqlSession操作數據庫 //第一個參數:映射文件中statement的id //第二個參數:指定和映射文件所匹配的parameterType類型參數 User user = (User) session.selectOne("com.yihaomen.mybatis.model.User.selectUserByID", 1); System.out.println(user.getUserAddress()); System.out.println(user.getUserName()); } finally { session.close(); } } //增加數據 public void addUser(String address,String name){ //創建user對象 User user=new User(); user.setUserAddress(address); user.setUserName(name); user.setUserAge(80); //通過工廠得到SqlSession SqlSession session = sqlSessionFactory.openSession(); try { IUserOperation userOperation=session.getMapper(IUserOperation.class); //添加數據 userOperation.addUser(user); //提交 session.commit(); //System.out.println("當前增加的用戶 id為:"+user.getId()); } finally { session.close(); } } //更新數據 public void updateUser(int id,String address){ //先得到用戶,然後修改,提交。 SqlSession session = sqlSessionFactory.openSession(); try { IUserOperation userOperation = session.getMapper(IUserOperation.class); User user = userOperation.selectUserByID(id); user.setUserAddress(address); userOperation.updateUser(user); session.commit(); System.out.println("更新成功!!"); } finally { session.close(); } } //刪除數據 public void deleteUser(int id) { SqlSession session = sqlSessionFactory.openSession(); try{ IUserOperation userOperation = session.getMapper(IUserOperation.class); userOperation.deleteUser(id); session.commit(); System.out.println("刪除數據:id= "+id); }finally { session.close(); } } //list獲取 public void getList() { SqlSession session = sqlSessionFactory.openSession(); try{ IUserOperation userOperation = session.getMapper(IUserOperation.class); List<User> us = userOperation.list(); session.commit(); //System.out.println("生成list: "+us.size()); }finally { session.close(); } } //模糊查詢 public void geFindUserByName(String name) { SqlSession session = sqlSessionFactory.openSession(); try{ IUserOperation userOperation = session.getMapper(IUserOperation.class); List<User> us = userOperation.findUserByName(name); System.out.println(us.size()); session.commit(); }finally { session.close(); } } public static void main(String[] args) { Test test = new Test(); test.getList(); test.geFindUserByName("小"); //test.addUser("杭州","小江"); } }
結果日志:
[2017-01-10 20:22:33] DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. [2017-01-10 20:22:33] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. [2017-01-10 20:22:33] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. [2017-01-10 20:22:33] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. [2017-01-10 20:22:33] DEBUG [main] - PooledDataSource forcefully closed/removed all connections. [2017-01-10 20:22:33] DEBUG [main] - Opening JDBC Connection [2017-01-10 20:22:34] DEBUG [main] - Created connection 238157928. [2017-01-10 20:22:34] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@e320068] [2017-01-10 20:22:34] DEBUG [main] - ==> Preparing: select * from `user` where username like '%小%' [2017-01-10 20:22:34] DEBUG [main] - ==> Parameters: [2017-01-10 20:22:34] DEBUG [main] - <== Total: 7 7 [2017-01-10 20:22:34] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@e320068] [2017-01-10 20:22:34] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@e320068] [2017-01-10 20:22:34] DEBUG [main] - Returned connection 238157928 to pool.
parameterType在映射文件中通過parameterType指定輸入參數的類型。
resultType在映射文件中通過resultType指定輸出結果的類型。
#{}
和${}
#{}
表示一個占位符號,#{}
接收輸入參數,類型可以是簡單類型,pojo、hashmap。如果接收簡單類型,#{}中可以寫成value或其它名稱。#{}
接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。
${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。如果接收簡單類型,${}中只能寫成value。
${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。
selectOne和selectList
selectOne表示查詢出一條記錄進行映射。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個對象)。
selectList表示查詢出一個列表(多條記錄)進行映射。如果使用selectList查詢多條記錄,不能使用selectOne。
如果使用selectOne報錯:
org.apache.ibatis.exceptions.TooManyResultsException: Expected oneresult (or null) to be returned by selectOne(), but found: 4
1、mybatis學習筆記(一)--基本crud操作:https://segmentfault.com/a/1190000003771372
2、mybatis學習筆記入門:http://www.cnblogs.com/hellokitty1/p/5216025.html
3、mybatis實戰教程:http://blog.csdn.net/techbirds_bao/article/details/9233599/
4、深入理解mybatis原理:http://blog.csdn.net/column/details/mybatis-principle.html?page=1