MyBatis 和 Spring 的整合(二)

    d. 本次使用的是 Oracle 11g 數據庫,建表SQL 腳本:java

-------Table : users-----------------------------------------------------------------------------------------------------------------------------------
drop table users;

create table users(
  userId number(10) not null,
  username varchar2(30) not null,
  birthday date default null,
  sex char(1) default 1 check (sex in (0, 1)),
  address varchar2(200) not null,
  detail varchar2(1000) default 'no detail',
  score number(4,2) default null,
  primary key (userId));

comment on column users.sex is '0: female 1: male';

/*
--添加註釋
-- comment on table users is '用戶表';
-- comment on column users.userId is '用戶編號';
-- comment on column users.sex is '0: female 1: male';
--修改表中字段的默認值
  alter table users modify (detail varchar2(1000) default ('no detail'));
  alter table users modify (sex char(1) default 1 check (sex in (0, 1)));
-- 
*/


/*
--建立序列Sequence
create sequence seq_userId
minvalue 100100      --最小值
nomaxvalue      --不設置最大值(由機器決定),或 根據表字段的值範圍設置 maxvalue
start with 100100    --從1開始計數,數值可變
increment by 2  --每次加1,數值可變
nocycle         --一直累加,不循環
nocache         --不建緩衝區,若是創建cache那麼系統將自動讀取cache值 個seq,這樣會加快運行速度;若是當機或oracle死了,那麼下次讀取的seq值將不連貫
*/

create sequence seq_userId minvalue 100100 maxvalue 9999999999 start with 100100 increment by 1;

--建立觸發器
create or replace trigger tg_insertUser
before insert on users for each row when (new.userId is null)
begin
  select seq_userId.Nextval into:new.userId from dual;
end;

--測試:
insert into users (username, birthday, sex, address, socre) values ('Oracle', to_date('1991-08-25 19:55:45', 'yyyy-mm-dd hh24:mi:ss'), 1, 'ShangHai', 99.50);


-------Table : orders-----------------------------------------------------------------------------------------------------------------------------------
drop table orders;

create table orders(
  orderId number(11) not null,
  user_id number(10) not null,
  orderNumber varchar2(20) not null,
  primary key (orderId),
  constraint fk_orders_users foreign key (user_id) references users (userId) on delete cascade
);

create sequence seq_orderId minvalue 1000000 maxvalue 99999999999 start with 1000000 increment by 1;

create or replace trigger tg_insertOrders
before insert on orders for each row when (new.orderId is null)
begin
  select seq_orderId.Nextval into:new.orderId from dual;
end;

insert into orders values(seq_orderId.Nextval, 100102, 'ord100101');
insert into orders values(seq_orderId.Nextval, 100106, 'ord100102');
insert into orders values(seq_orderId.Nextval, 100108, 'ord100103');
insert into orders values(seq_orderId.Nextval, 100108, 'ord100104');

-------Table : items-----------------------------------------------------------------------------------------------------------------------------------
drop table items;

create table items(
  itemId number(11) not null,
  itemName varchar2(30) not null,
  itemPrice number(11,2) not null,
  itemDetail varchar2(200) not null,
  primary key (itemId)
);

create sequence seq_itemId minvalue 1000000 maxvalue 99999999999 start with 1000000 increment by 1;

create or replace trigger tg_insertItem
before insert on items for each row when (new.itemId is null)
begin
  select seq_itemId.Nextval into:new.itemId from dual;
end;

insert into items values(seq_itemId.Nextval, 'milk', 12.50, 'good milk');
insert into items values(seq_itemId.Nextval, 'car', 65000.50, 'fast car');
insert into items values(seq_itemId.Nextval, 'Australia Steak', 188.50, 'delicious');
insert into items values(seq_itemId.Nextval, 'UA Bag', 350, 'cool');

-------Table : orderDetail-----------------------------------------------------------------------------------------------------------------------------------
drop table orderDetail;

create table orderDetail(
  orderDetailId number(11) not null,
  order_id number(11) not null,
  item_id number(11) not null,
  item_number number(8) not null,
  item_price number(11,2) not null,
  primary key (orderDetailId),
  constraint fk_orderDetail_orders foreign key (order_id) references orders (orderId),
  constraint fk_orderDetail_items foreign key (item_id) references items (itemId)
);

create sequence seq_orderDetailId minvalue 1000000 maxvalue 99999999999 start with 1000000 increment by 1;

create or replace trigger tg_insertOrderDetail
before insert on orderDetail for each row when (new.orderDetailId is null)
begin
  select seq_orderDetailId.Nextval into:new.orderDetailId from dual;
end;

insert into orderDetail values(seq_orderDetailId.Nextval, 1000001, 1000002, 1, 65000.50);
insert into orderDetail values(seq_orderDetailId.Nextval, 1000003, 1000001, 3, 12.50);
insert into orderDetail values(seq_orderDetailId.Nextval, 1000002, 1000003, 1, 188.50);
insert into orderDetail values(seq_orderDetailId.Nextval, 1000004, 1000004, 2, 350);
insert into orderDetail values(seq_orderDetailId.Nextval, 1000004, 1000001, 1, 12.50);

    e. 配置 mapper.xml 和 Mapper 接口,本次只配置一個簡單的查詢 mapper.xml,更多的mapper.xml 配置請參考我前面的 MyBatis blog。
spring

    userMapper.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">
<mapper	namespace="ssm.mapper.UserMapper">
  <!-- namespace:本 mapper.xml 對應的 Mapper 接口的類路徑
	這樣在調用接口的時候,MyBatis 會經過 mapper 自動找到要執行的 SQL 語句
  -->
  <!-- 定義SQL 片斷,可重複使用 -->
  <sql id="query_user_ByUserId">
  	<!-- 注意:要作不爲null 和 '' 校驗 -->
	<if test="value != null and value != ''">
 	  and users.userId = #{value}
 	</if>
  </sql>
  
  <!-- 動態 sql 查詢用戶信息 -->
  <select id="findUserById" parameterType="int" resultType="user">
  	select * from users
  	<!-- where 能夠自動處理第一個 and -->
  	<where>
  	  <include refid="query_user_ByUserId"></include>
 	</where>
  </select>
</mapper>

    UserMapper.java 接口
數據庫

package sam.mapper;

import sam.model.User;

public interface UserMapper {
	//根據用戶Id 查詢用戶
	public User findUserById(int userId) throws Exception;
}

    f. MyBatis 的配置基本都完成了,下面寫一個測試類 測試一下mybatis 是否好用。右鍵 UserMapper.java new 一個 Junit Test Case,將 package 修改爲 test package。而後下一步。勾選 UserMapper 接口中須要測試的方法。以下:
apache

    

    UserMapperTest.java
session

package ssm.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;
import org.junit.Before;
import org.junit.Test;

import ssm.mapper.UserMapper;
import ssm.model.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;

	String resource = "mybatis/SqlMapConfig.xml";
	
	@Before
	public void setUp() throws Exception {
		// 經過輸入流讀取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 經過SqlSessionFactoryBuilder,獲取SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void testFindUserById() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		User user = userMapper.findUserById(100101);
		
		System.out.println(user);
		
		sqlSession.commit();
		sqlSession.close();
	}
}

    運行 Test case,應該能夠查詢出 User。至此,mybatis 部分算是搞定了。下面整合 spring。
mybatis

相關文章
相關標籤/搜索