1. 程式人生 > >MyBatis學習——第一篇(增刪改查實現)

MyBatis學習——第一篇(增刪改查實現)

1:MyBatis入門

 

1.1  Mybatis概述

        MyBatis 是一款優秀的持久層(ORM)框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。 

物件關係對映(ORM Object-Relational Mapping)面向物件的開發方法是當今企業級應用開發環境中的主流開發方法,關係

資料庫是企業級應用環境中永久存放資料的主流資料儲存系統。物件和關係資料是業務實體的兩種表現形式,業務實體在記憶體中表現為物件,在資料庫中表現為關係資料。記憶體中的物件之間存在關聯和繼承關係,而在資料庫中,關係資料無法直接表達多對多關聯和繼承關係。因此,物件-關係對映(ORM)系統一般以中介軟體的形式存在,主要實現程式物件到關係資料庫資料的對映。

1.2  ORM簡介

A . 簡單:ORM以最基本的形式建模資料。比如ORM會將MySQL的一張表對映成一個Java類(模型),表的欄位就是這個類的成員變數 
B . 精確:ORM使所有的MySQL資料表都按照統一的標準精確地對映成java類,使系統在程式碼層面保持準確統一 
C .易懂:ORM使資料庫結構文件化。比如MySQL資料庫就被ORM轉換為了java程式設計師可以讀懂的java類,java程式設計師可以只把注意力放在他擅長的java層面(當然能夠熟練掌握MySQL更好) 
D.易用:ORM包含對持久類物件進行CRUD操作的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是講sql查詢全部封裝成了程式語言中的函式,通過函式的鏈式組合生成最終的SQL語句。通過這種封裝避免了不規範、冗餘、風格不統一的SQL語句,可以避免很多人為Bug,方便編碼風格的統一和後期維護。

 

1.3   ORM的優缺點:

  1.  什麼是Mybatis?

優點: 
1)它支援定製化 SQL、儲存過程以及高階對映,
2)MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊
3)文件社群支援,有apache-google-github 前身是iBatis
4)配置化便於上手,動態sql,可以很方便地引入資料快取之類的附加功能 
缺點: 
1)自動化進行關係資料庫的對映需要消耗系統性能。其實這裡的效能消耗還好啦,一般來說都可以忽略之。 
2)在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。

例項如下:

Java物件User()--------Mapping對映---------Relational 資料庫表(User表)

 

 

     Java物件                          對映                    關係資料庫

2:Mybatis實現增刪改查

說明:該案例是一個簡單的mybatis入門案例  實現了資料的增刪改查基本操作,更多屬性配置請參考mybatis官網

主要是新建一個表M_test,包含主鍵、賬戶、密碼、賬戶金額四個欄位資料。實現簡單的入門案例。

2.1建立表:M_test   id為主鍵自增

bean程式碼:

package com.thit.entity;

public class User {
	private Integer id;
	private String name;
	private String  password;
	private Double  account;
	public Integer getId() {
		return id;
	}
	public void setId(Integer 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 Double getAccount() {
		return account;
	}
	public void setAccount(Double account) {
		this.account = account;
	}
	@Override
	public String toString() {
		return "user [id=" + id + ", name=" + name + ", password=" + password + ", account=" + account + "]";
	}
	
	

}

 

 mybatis.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="db.properties"></properties>

<environments default="demo">
    <!-- environment 可以有多個 對應開發測試生產不同的環境-->
	<environment id="demo">
	  	<!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 -->
		<transactionManager type="JDBC"></transactionManager>
	 	    <!-- mybatis提供了3種資料來源型別,分別是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支援JDBC資料來源連線池 -->
            <!-- UNPOOLED 表示不支援資料來源連線池 -->
            <!-- JNDI 表示支援外部資料來源連線池 -->
		
		<dataSource type="POOLED">
	        <property name="driver" value="${mysqldriver}"/>
	        <property name="url" value="${mysqlurl}"/>
	        <property name="username" value="${mysqlusername}"/>
	        <property name="password" value="${mysqlpassword}"/>
		</dataSource>
	</environment>
</environments>
 
 <mappers>
   <!-- 引入實體對映 -->
     <mapper resource="mapper/userMapper.xml"/>
 </mappers>
 
 </configuration>

 資料庫配置db.properties

#\u6570\u636E\u5E93
mysqldriver=com.mysql.jdbc.Driver
mysqlurl=jdbc:mysql://localhost:3306/huyiju?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8
mysqlusername=root
mysqlpassword=123456

使用者表對映配置:

<?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.thit.entity.User">

	<resultMap id="userResultMap" type="com.thit.entity.User">
		<!-- 主鍵和欄位繫結 -->
	  <id property="id" column="id" />
	  <result property="name" column="username" />
	  <result property="password" column="password"/>
	  <result property="account" column="account"/>
	</resultMap>

	<insert id="insert" >
		insert into M_test(username,password,account) values (#{name},#{password},#{account})
	
	</insert>
	
	<update id="updatebyid" >
		 update M_test set username=#{name},password=#{password},account=#{account} where id=#{id}
	</update>
	
	<delete id="deletebyid" >
	 delete from  M_test where 
	  id=#{id}
	</delete>
	
	<!-- <select id="selectbyid" parameterType="int" resultType="com.thit.entity.User">
		select id,username as name,password,account from M_test where
		id= #{id}
	</select> -->
	
	<select id="selectbyid" parameterType="int" resultMap="userResultMap">
		select id,username,password,account from M_test where
		id= #{id}
	</select>
	
	<select id="selectall" resultType="com.thit.entity.User">
		select id,username as name,password,account from M_test
	</select>
	
</mapper>


 

最後的程式碼測試:

工具類:

package com.thit.test;

import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Dbtools {
	private static SqlSessionFactory sessionFactory;
	  static{
	        try {
	        	String resource="mybatis.xml";
	    		InputStream inputStream=Resources.getResourceAsStream(resource);
	    		//sqlSessionFactory通過SqlSessionFactoryBuilder構建出DefaultSqlSessionFactory
	    		//DefaultSqlSessionFactory繼承了SqlSessionFactory介面
	    		sessionFactory=new SqlSessionFactoryBuilder()
	    				.build(inputStream);
	            //使用MyBatis提供的Resources類載入mybatis的配置檔案

	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        
	    }
	    //建立能執行對映檔案中sql的sqlSession
	    public static SqlSession getSession(){
	        return sessionFactory.openSession();
	    }

}

測試主方法:測試不同的新增修改刪除查詢和查詢全部等方法

package com.thit.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.thit.entity.User;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test t=new Test();
		t.selectbyid();
		t.selectall();
		t.updatebyid();
		t.insert();
	}
	
	void selectbyid(){
		Dbtools dbtools=new Dbtools();
		SqlSession sqlSession= dbtools.getSession();
		User u=sqlSession.selectOne("selectbyid", 1);
		System.out.println("根據id查詢"+u);
	}
	
	void selectall(){
		Dbtools dbtools=new Dbtools();
		SqlSession sqlSession= dbtools.getSession();
		List<User> list=sqlSession.selectList("selectall");
		System.out.println("查詢所有:"+list.size());
		for(User u:list) {
			System.out.println(u);
		}
	}
	
	void deletebyid(){
		Dbtools dbtools=new Dbtools();
		SqlSession sqlSession= dbtools.getSession();
		int result=sqlSession.delete("deletebyid", 5);
		sqlSession.commit();
		System.out.println(result);
	}
	
	
	void updatebyid(){
		Dbtools dbtools=new Dbtools();
		SqlSession sqlSession= dbtools.getSession();
		User u=new User();
		u.setId(3);
		u.setusername("土豆修改0903");
		u.setPassword("123");
		u.setAccount(11.11);
		int a=sqlSession.update("updatebyid",u);
		sqlSession.commit();
	}
	
	
	void insert(){
		Dbtools dbtools=new Dbtools();
		SqlSession sqlSession= dbtools.getSession();
		User u=new User();
		
		u.setusername("土豆新增111");
		u.setPassword("3333");
		u.setAccount(11.11);
		int a=sqlSession.insert("insert", u);
		sqlSession.commit();
	}
	
}

最後資料庫的執行結果如圖: