程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Mybatis學習筆記(二) 之實現數據庫的增刪改查,mybatis學習筆記

Mybatis學習筆記(二) 之實現數據庫的增刪改查,mybatis學習筆記

編輯:JAVA綜合教程

Mybatis學習筆記(二) 之實現數據庫的增刪改查,mybatis學習筆記


開發環境搭建

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved