1. 程式人生 > >Spring整合Mybatis案例,獻給初學的朋友

Spring整合Mybatis案例,獻給初學的朋友

  • 今天我們來學習Spring整合Mybatis。

  開發環境:Ide:MyEclipse 2017 CI

      JDK:1.8

   首先我們簡單的認識下這兩個框架

 1、Mybatis

 

   MyBatis是一個支援普通SQL查詢儲存過程高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。

  入門:1.所需Jar包 

  

 2、資料庫搭建

  

 1 DROP TABLE IF EXISTS `smbms_user`;
 2 CREATE TABLE `smbms_user`  (
 3   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
 4   `userCode` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '使用者編碼',
 5   `userName` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT
NULL COMMENT '使用者名稱稱', 6 `userPassword` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '使用者密碼', 7 `gender` int(10) DEFAULT NULL COMMENT '性別(1:女、 2:男)', 8 `birthday` date DEFAULT NULL COMMENT '出生日期', 9 `phone` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT
NULL COMMENT '手機', 10 `address` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址', 11 `userRole` bigint(20) DEFAULT NULL COMMENT '使用者角色(取自角色表-角色id)', 12 `createdBy` bigint(20) DEFAULT NULL COMMENT '建立者(userId)', 13 `creationDate` datetime(0) DEFAULT NULL COMMENT '建立時間', 14 `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)', 15 `modifyDate` datetime(0) DEFAULT NULL COMMENT '更新時間', 16 PRIMARY KEY (`id`) USING BTREE 17 ) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic; 18 19 -- ---------------------------- 20 -- Records of smbms_user 21 -- ---------------------------- 22 INSERT INTO `smbms_user` VALUES (1, 'admin', '系統管理員', '1234567', 1, '1983-10-10', '13688889999', '北京市海淀區成府路207號', 1, 1, '2013-03-21 16:52:07', NULL, NULL); 23 INSERT INTO `smbms_user` VALUES (2, 'liming', '李明', '0000000', 2, '1983-12-10', '13688884457', '北京市東城區前門東大街9號', 2, 2, '2014-12-31 19:52:09', NULL, NULL); 24 INSERT INTO `smbms_user` VALUES (5, 'hanlubiao', '韓路彪', '0000000', 2, '1984-06-05', '18567542321', '北京市朝陽區北辰中心12號', 2, 3, '2014-12-31 19:52:09', NULL, NULL); 25 INSERT INTO `smbms_user` VALUES (6, 'zhanghua', '張華', '0000000', 2, '1983-06-15', '13544561111', '北京市海淀區學院路61號', 3, NULL, '2013-02-11 10:51:17', NULL, NULL); 26 INSERT INTO `smbms_user` VALUES (7, 'wangyang', '王洋', '0000000', 2, '1982-12-31', '13444561124', '北京市海淀區西二旗輝煌國際16層', 3, NULL, '2014-06-11 19:09:07', NULL, NULL); 27 INSERT INTO `smbms_user` VALUES (8, 'zhaoyan', '趙燕', '0000000', 2, '1986-03-07', '18098764545', '北京市海淀區回龍觀小區10號樓', 3, NULL, '2016-04-21 13:54:07', NULL, NULL); 28 INSERT INTO `smbms_user` VALUES (10, 'sunlei', '孫磊', '0000000', 3, '1981-01-04', '13387676765', '北京市朝陽區管莊新月小區12樓', 3, NULL, '2015-05-06 10:52:07', NULL, NULL); 29 INSERT INTO `smbms_user` VALUES (11, 'sunxing', '孫興', '0000000', 3, '1978-03-12', '13367890900', '北京市朝陽區建國門南大街10號', 3, NULL, '2016-11-09 16:51:17', NULL, NULL); 30 INSERT INTO `smbms_user` VALUES (12, 'zhangchen', '張晨', '0000000', 3, '1986-03-28', '18098765434', '朝陽區管莊路口北柏林愛樂三期13號樓', 3, NULL, '2016-08-09 05:52:37', 1, '2016-04-14 14:15:36'); 31 INSERT INTO `smbms_user` VALUES (13, 'dengchao', '系鄧超', '0000000', 1, '1981-11-04', '13689674534', '北京市海淀區北航家屬院10號樓', 3, NULL, '2016-07-11 08:02:47', NULL, NULL); 32 INSERT INTO `smbms_user` VALUES (14, 'yangguo', '系楊過', '0000000', 1, '1980-01-01', '13388886623', '北京市朝陽區北苑家園茉莉園20號樓', 3, NULL, '2015-02-01 03:52:07', NULL, NULL); 33 INSERT INTO `smbms_user` VALUES (15, 'zhaomin', '系趙敏', '0000000', 1, '1987-12-04', '18099897657', '北京市昌平區天通苑3區12號樓', 2, NULL, '2015-09-12 12:02:12', NULL, NULL);

 

 3、匯入Log4j配置

log4j.rootLogger=debug, stdout,logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}%l %F %p %m%n

  4、匯入Jdbc配置

jdbc.driver=com.mysql.jdbc.Driver
jdbc.uri=jdbc\:mysql\://localhost\:3306/smbms?useUnicode\=true&characterEncoding\=utf8
jdbc.name=root
jdbc.pwd=1234

  專案目錄:

  Mybatis是一個開源的持久化框架,用於優化專案中的Dao的Impl,替代Dao的為Mapper的介面,具體實現一樣,只是名字不一,便於區分

  我們在對應的Mapper中寫入具體需要執行的操作,並且建立對應相同名字的Xml檔案

  

  

  類:UserMapper.java

    

package com.mapper;

import java.util.List;

import com.entuty.User;

public interface UserMapper {
    /*
     * 查詢所有的使用者
     */
    List<User> Cxall();
}

  UserMapper.xml配置

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 
4 <mapper namespace="com.mapper.UserMapper">
5     <select id="Cxall" resultType="User">
6         select * from smbms_user
7     </select>
8 </mapper>

  注意上述4行 需要引入Mapper名稱空間,如果在整合Spring時使用的是Mapper 代理的方式需要注意 Id必須和UserMapper中的方法名保持一致。

  建立SqlMapperConfig.xml(Mybatis核心配置檔案)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" >
 3 <configuration>
 4      <properties resource="Jdbc.properties"></properties>
 5     <typeAliases>                                                         給當前包中的所有類取別名,別名為類名
 6         <package name="com.entuty" />
 7     </typeAliases>    
 8 <environments default="development">                                配置資料來源
 9         <environment id="development">
10             <transactionManager type="JDBC"></transactionManager>
11             <dataSource type="POOLED">
12                 <property name="driver" value="${jdbc.driver}" />
13                 <property name="url" value="${jdbc.uri}" />
14                 <property name="username" value="${jdbc.name}" />
15                 <property name="password" value="${jdbc.pwd}" />
16             </dataSource>
17         </environment>
18     </environments>
19     <mappers>                                      配置對映的Mapper
20         <mapper resource="com/mapper/UserMapper.xml"/>
21     </mappers>
22 </configuration>

  Mybatis環境搭建完畢。

  2、Spring

  匯入Spring Jar包 其中的核心包是

  建立業務層和業務層的實現類

  建立Spring核心配置檔案 applicationContext.xml

  在Spring釋出的時候並未想到和Mybatis整合,而後也沒為了mybatis釋出版本,所以是由Mybtais 提供的整合。

  1、優化資料來源 將資料來源轉交給Spring容器管理,那麼Mybatis配置中的原有配置資料來源以及 對應實現類的Mapper.xml都交於Spring容器

  

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" >
 3 <configuration>
 5     <typeAliases>                                                         給當前包中的所有類取別名,別名為類名
 6         <package name="com.entuty" />
 7     </typeAliases>    
 8 </configuration>

 

  2.applicationContext.xml

  將jdbc配置也使用Spring獲取  同時使用Dbcp資料來源建立JDBc連結<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- DBCP/C3p0 -->

    <context:property-placeholder location="jdbc.properties" />
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.uri}"></property>
        <property name="username" value="${jdbc.name}"></property>
        <property name="password" value="${jdbc.pwd}"></property>
    </bean>

   在Mybatis中 使用者執行一個操作的順序是 首先獲取Sqlsessionfactoey
    然後由Selsessionfactory建立 Sqlsession
    之後確認是Mapper代理還是 原生的Steamnemet
    在Spring中配置SqlsessionFactoryBean

<!-- 會話工廠通過Spring獲取 --> <!-- 配置org.mybatis.spring.SqlSessionFactoryBean 將會話工廠交給Spring --> <bean id="SqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定Mybatis核心配置檔案位置 --> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> <!-- 指定資料來源 --> <property name="dataSource" ref="dataSource"></property> <!-- 載入對映檔案 --> <property name="mapperLocations"> <list> <value>com/mapper/*.xml</value> </list> </property> </bean>

</beans>

  Userserviceimpl.Java

  

package com.service.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.entuty.User;
import com.mapper.UserMapper;
import com.service.Userservice;

public class Userserviceimpl implements Userservice {
    

    private UserMapper userMapper;


    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public List<User> Cxall() {
        return userMapper.Cxall();
    }

}

  對 private UserMapper userMapper; 進行注入

  同時使Spring容器來掃描對應的Mapper

  

  
    <bean id="map" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.mapper"></property>
    </bean>
    

    

    <!-- 配置工廠 -->
     <bean id="sqlFactory" class="com.service.impl.Userserviceimpl">
        <property name="userMapper" ref="userMapper" />
    </bean> 
    

   測試:

    

package com.Test;

import java.io.IOException;
import java.io.InputStream;
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 org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.entuty.User;
import com.mapper.UserMapper;
import com.service.Userservice;
import com.service.impl.Userserviceimpl;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ap=new ClassPathXmlApplicationContext("applicationContext.xml");
        Userservice us=(Userservice) ap.getBean("sqlFactory");
        List<User> arr=us.Cxall();
        for (User user : arr) {
            System.out.println(user.getUsername());
        }
    }
}

  結果:

  

DEBUG - Fetching JDBC Connection from DataSource
DEBUG - JDBC Connection [1606286799, URL=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8, [email protected], MySQL-AB JDBC Driver] will not be managed by Spring
DEBUG - ==>  Preparing: select * from smbms_user 
DEBUG - ==> Parameters: 
DEBUG - <==      Total: 22
DEBUG - Closing non transactional SqlSession [[email protected]]
DEBUG - Returning JDBC Connection to DataSource
系統管理員
李明
韓路彪
張華
王洋
趙燕
孫磊
孫興
張晨
系鄧超
系楊過
系趙敏
admin
張三
張三
張三啊
張三啊
張三啊
張三啊
張三啊
張三啊
張三啊

  感謝大家,如有問題,敬請大牛指正!