1. 程式人生 > >使用者增刪改查:在eclipse建立Spring+SpringMVC+Mybatis的專案

使用者增刪改查:在eclipse建立Spring+SpringMVC+Mybatis的專案

1. 新建maven專案

  • 點選“File”->“New”->”Other”->輸入“Maven”,新建一個“Maven Project”,如下圖所示:

    這裡寫圖片描述

  • 請勾選“Create a simple project”,建立一個簡單的專案。

    這裡寫圖片描述

  • 填寫好包名、專案名,選擇打包型別為:war,如下圖所示

    這裡寫圖片描述

  • 專案建立好後可能會發現有錯誤,選擇專案,右鍵“屬性properties”->”層面Project Facets”->”Java”修改版本號為1.7,預設為1.5;點選“Ok”儲存後關閉。如下圖所示

    這裡寫圖片描述

  • 重複上一個步驟,反勾Dynamic Web Module,將專案暫時變成非Web專案。點選“Ok”儲存後關閉

    這裡寫圖片描述

  • 重複上一個步驟,勾選“Dynamic Web Module”選擇Version為3.0。點選左下角的超連結“Further Configuration available…“

    這裡寫圖片描述

  • 勾選“Generate web.xml deployment descriptor”生成web.xml部署描述檔案。點選“Ok”儲存後關閉。

    這裡寫圖片描述

  • 將生成的WebContent目錄下的兩個資料夾“META-INF”與“WEB-INF”複製到src/main/webapp目錄下

    這裡寫圖片描述

  • 刪除WebContent目錄

    這裡寫圖片描述

  • 刪除後會發現專案的pom.xml檔案報錯,是因為找不到指定位置的web.xml檔案引起的。再進入專案的屬性,選擇“Deployment Assembly”專案部署項,刪除“src/test/java”、“src/test/resources”與“WebContent”目錄,因為這三項不需要部署出去。

    這裡寫圖片描述

  • 點選“Add新增”後選擇“Folder資料夾”為專案的最終部署結果指定Web內容根資料夾

    這裡寫圖片描述

  • 選擇src\main\webapp目錄為目標目錄,點選“Finish完成”儲存並關閉

    這裡寫圖片描述

  • 如果此時專案還報錯,隨便修改pom.xml檔案後儲存後錯誤就會消失

  • 在src\main\webapp目錄下新建一個index.jsp檔案,作為測試使用

    這裡寫圖片描述

  • 新建完成後發現有錯誤,是因為沒有JavaEE Server Runtime引起的,在專案上右鍵屬性選擇“Java Build Path”項,點選“Add Library…”新增引用

    這裡寫圖片描述

  • 選擇Server Runtime項,點選“Next下一步”,再選擇“Apache Tomcat v7.0”,要根據自己的執行環境選擇,如果沒Server先整合Tomcat。

    這裡寫圖片描述

    這裡寫圖片描述

  • 在index.jsp檔案中寫上測試內容

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        hello the world!
    </body>
    </html>
  • 在專案上右鍵選擇“Run as”-> “Run on Server”執行專案,執行結果如下

    這裡寫圖片描述

2. 新增依賴

  • 依賴包可以去共享資源庫中搜索,地址是:http://mvnrepository.com/. 這裡以搜尋連線驅動為示例,搜尋後的結果有5.xx版許多,也有6.xx版,但不建議使用6.xx版,因為MyBatis3不支援

    這裡寫圖片描述

  • 選擇版本後,將Maven的依賴資訊複製到專案中的pom.xml的dependencies結點下

    這裡寫圖片描述

  • 專案的pom.xml檔案如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.yc</groupId>
      <artifactId>UserManager</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- spring-mvc包 -->  
         <dependency>  
             <groupId>org.springframework</groupId>  
             <artifactId>spring-webmvc</artifactId>  
             <version>4.2.0.RELEASE</version>  
         </dependency>  
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>
             <dependency>  
             <groupId>org.springframework</groupId>  
             <artifactId>spring-jdbc</artifactId>  
             <version>4.2.0.RELEASE</version>  
         </dependency>  
         <!--spring事務tx包的引用 -->  
         <dependency>  
             <groupId>org.springframework</groupId>  
             <artifactId>spring-tx</artifactId>  
             <version>4.2.0.RELEASE</version>  
         </dependency>  
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.0.RELEASE</version>
         </dependency>
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.0.RELEASE</version>
         </dependency>
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.0.RELEASE</version>
         </dependency>
         <!-- jsp顯示資料需要的jar包 -->  
         <dependency>  
             <groupId>jstl</groupId>  
             <artifactId>jstl</artifactId>  
             <version>1.2</version>  
         </dependency>  
         <!--日誌 -->  
         <dependency>  
             <groupId>log4j</groupId>  
             <artifactId>log4j</artifactId>  
             <version>1.2.17</version>  
         </dependency>  
         <dependency>  
             <groupId>org.apache.logging.log4j</groupId>  
             <artifactId>log4j-core</artifactId>  
             <version>2.0</version>  
         </dependency>  
         <dependency>  
             <groupId>org.apache.logging.log4j</groupId>  
             <artifactId>log4j-api</artifactId>  
             <version>2.0</version>  
         </dependency>  
         <!--spring4.0以上json和java物件的轉換jackson包 spring4.0以上需要jackson2.6版本 -->  
         <dependency>  
             <groupId>com.fasterxml.jackson.core</groupId>  
             <artifactId>jackson-core</artifactId>  
             <version>2.6.1</version>  
         </dependency>  
         <dependency>  
             <groupId>com.fasterxml.jackson.core</groupId>  
             <artifactId>jackson-databind</artifactId>  
             <version>2.6.1</version>  
         </dependency>  
         <dependency>  
             <groupId>com.fasterxml.jackson.core</groupId>  
             <artifactId>jackson-annotations</artifactId>  
             <version>2.6.1</version>  
         </dependency>  
         <!--mybatis的包 -->  
         <dependency>  
             <groupId>org.mybatis</groupId>  
             <artifactId>mybatis</artifactId>  
             <version>3.2.8</version>  
         </dependency>  
         <!--mybatis和spring整合包 -->    
         <!-- 我使用的連線資料的jar包 -->  
         <dependency>  
             <groupId>commons-dbcp</groupId>  
             <artifactId>commons-dbcp</artifactId>  
             <version>1.4</version>  
         </dependency>  
    
         <!--資料庫jar包 -->  
         <dependency>  
             <groupId>mysql</groupId>  
             <artifactId>mysql-connector-java</artifactId>  
             <version>5.1.39</version>  
         </dependency>  
         <dependency>  
             <groupId>commons-io</groupId>  
             <artifactId>commons-io</artifactId>  
             <version>2.2</version>  
         </dependency> 
         <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.6</version>
        </dependency>
    
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>
      </dependencies>  
    
    </project>
  • 如果在網速不穩定的情況下,下載包很有可能失敗,可以試試強制專案重新下載,也可以手動將jar包下載後複製到本地資源庫對應路徑。

    這裡寫圖片描述

3. 使用MyBatis完成MySQL資料庫訪問

  • 建立一個表,這裡以user表為例

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      `account` varchar(20) NOT NULL,
      `phone` varchar(20) NOT NULL,
      `email` varchar(20) NOT NULL,
      `address` varchar(50) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE(`account`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO user(`name`,`account`,`phone`,`email`,`address`) VALUES ('張三','zhangsan','13787878787','[email protected]','黑河'),('李四','lisi','13478787878','[email protected]','李村');
  • 新建包com.yc.po,建立java Bean User,get和set方法可通過快捷鍵ALT+SHIFT+S->Generate getters and setters生成

    package com.yc.po;
    
    public class User {
        private int id;
        private String name;
        private String account;
        private String phone;
        private String email;
        private String address;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAccount() {
            return account;
        }
        public void setAccount(String account) {
            this.account = account;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
  • 建立例項與表的對映檔案

    新建包com.yc.mybatis.mapper,用介面+XML的形式完成
    User資料訪問介面UserDAO如下:

    package com.yc.mybatis.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Param;
    import org.springframework.stereotype.Repository;
    
    import com.yc.po.User;
    
    @Repository
    public interface UserDAO {
        //取全部使用者 + 分頁 + 按條件匹配
        public List<User> getAllUsers(@Param("skip") int skip,@Param("size") int size, 
                @Param("search_name") String search_name, @Param("search_account") String search_account);
        //使用者數量
        public int getCount(@Param("search_name") String search_name, @Param("search_account") String search_account); 
        //新增使用者
        public int addUser(User user);
        //更新
        public int updateUser(User user);
        //刪除
        public int deleteUserById(int id);
    }

    UserDAOMapper.xml檔案如下:

    <?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.yc.mybatis.mapper.UserDAO">  
        <!-- 使用者總數 + 賬號和名稱匹配 -->
        <select id="getCount" resultType="int">  
            select count(*) from user where name like #{search_name} and account like #{search_account}
        </select> 
        <!-- 查詢使用者 + 分頁 + 按賬號和名稱匹配 -->
        <select id="getAllUsers" resultType="com.yc.po.User">  
            select * from user where name like #{search_name} and account like #{search_account} limit #{skip},#{size}
        </select>   
        <!--新增使用者 -->
        <insert id="addUser" parameterType="User">
            insert into user(name,account,phone,email,address) values(#{name},#{account},#{phone},#{email},#{address});
        </insert>
        <!-- 更新使用者 -->
        <update id="updateUser" parameterType="User">
            update user set name=#{name},account=#{account},phone=#{phone},email=#{email},address=#{address} where id=#{id}
        </update>
        <!--刪除使用者 -->
        <delete id="deleteUserById" parameterType="int">
             delete from user where id=#{id}
        </delete>
    </mapper>  
  • 在src/main/resources建立config/mybatis/mybatisconfig.xml檔案,用於配置MyBatis的執行環境

    <?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>
        <!--類型別名,預設引入com.yc.po下的所有類 -->
        <typeAliases>
            <package name="com.yc.po"/>
        </typeAliases>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--引入對映檔案 -->
            <mapper resource="com/yc/mybatis/mapper/UserDAOMapper.xml" />
        </mappers>
    </configuration>

    因為配置中依賴了db.properties檔案,該檔案用於指定資料庫的連線資訊,內容如下:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.username=root
    jdbc.password=root
  • 實現資料訪問功能
    為了更加方便的複用MyBatis實現資料訪問不需要頻繁的建立SQLSessionFactory和SQLSession物件,在src/test/java下新建包com.yc.test, 封裝一個MyBatisUtil工具類如下:

    package com.yc.test;
    
    import java.io.InputStream;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public abstract class MyBatisUtil {
        private static SqlSessionFactory factory=null;
        public static SqlSessionFactory getSqlSessionFactory(){
            if(factory==null){
                // 獲得環境配置檔案流
                InputStream config = MyBatisUtil.class.getClassLoader().getResourceAsStream("/config/mybatis/mybatisconfig.xml");
                // 建立sql會話工廠
                factory = new SqlSessionFactoryBuilder().build(config);
            }
            return factory;
        }
    
        //獲得會話
        public static SqlSession getSession(){
            return getSqlSessionFactory().openSession(true);
        }
    
        /**
         * 獲得得sql會話
         * @param isAutoCommit 是否自動提交,如果為false則需要sqlSession.commit();rollback();
         * @return sql會話
         */
        public static SqlSession getSession(boolean isAutoCommit){
            return getSqlSessionFactory().openSession(isAutoCommit);
        }
    
    }
    
  • 使用JUnit進行單元測試
    新建測試用例UserTest.java

    package com.yc.test;
    
    import static org.junit.Assert.*;
    
    import java.util.List;
    
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import com.yc.mybatis.mapper.UserDAO;
    import com.yc.po.User;
    
    import junit.framework.Assert;
    
    public class UserTest{
    
        @Test
        public void insertTest() {
            SqlSession session=MyBatisUtil.getSession();
            try {
                User entity=new User();
                entity.setName("王五");
                entity.setAccount("wangwu");
                entity.setPhone("13566666666");
                entity.setEmail("[email protected]");
                entity.setAddress("黑河");
                UserDAO userdao=session.getMapper(UserDAO.class);
                Assert.assertEquals(1, userdao.addUser(entity));
            } finally {
                session.close();
            }
        }
    
        @Test
        public void getCountTest(){
            SqlSession session=MyBatisUtil.getSession();
            try {
                UserDAO userdao=session.getMapper(UserDAO.class);
                System.out.println(userdao.getCount("%%", "%%"));
            } finally {
                session.close();
            }
        }
    
        @Test
        public void getUserTest(){
            SqlSession session = MyBatisUtil.getSession();
            try {
                UserDAO userdao=session.getMapper(UserDAO.class);
                //%% 查詢條件為空
                List<User> users=userdao.getAllUsers(0, 10, "%%", "%%");
                for(User user : users){
                    System.out.println(user.getId() + " " + user.getName() + " "
                            + user.getAccount() + " " + user.getPhone() + " " 
                            + user.getEmail() + " " + user.getAddress());
                }
                assertNotNull(users);
            } finally {
                session.close();
            }
        }
    
        @Test
        public void updateTest(){
            SqlSession session=MyBatisUtil.getSession();
            try {
                UserDAO userdao=session.getMapper(UserDAO.class);
                User edituser = userdao.getAllUsers(0, 10, "%%", "%%").get(0);
                edituser.setAddress("紅山");
                Assert.assertEquals(1, userdao.updateUser(edituser));
            } finally {
                session.close();
            }
        }
    
        @Test
        public void deleteTest(){
            SqlSession session=MyBatisUtil.getSession();
            try {
                UserDAO userdao=session.getMapper(UserDAO.class);
                Assert.assertEquals(1, userdao.deleteUserById(3));
            } finally {
                session.close();
            }
        }
    }
    

    執行測試,一切正常,測試結果如下:
    這裡寫圖片描述

4. 完成Spring整合MyBatis配置

  • 在src/main/resources下新建檔案config/spring/spring-dao.xml檔案,用於整合MyBatis與Spring

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-4.2.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
        <!--配置資料庫連線屬性-->
        <!--配置資料庫連線屬性載入db.properties的資料庫連線資訊檔案-->
        <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>  
            <property name="url" value="${jdbc.url}"/>  
            <property name="username" value="${jdbc.username}"/>  
            <property name="password" value="${jdbc.password}"/>  
            <property name="maxActive" value="30"/>  
            <property name="maxIdle" value="5"/> 
        </bean>
    
        <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--注入資料庫連線物件-->
            <property name="dataSource" ref="dataSource"/>
            <!--載入mybatis配置檔案 這裡mybatis配置檔案的工作都在spring中配置了所以mybatis只是配置別名就可以-->
            <property name="configLocation" value="classpath:/config/mybatis/mybatisconfig.xml"/>
            <!--指定sql對映xml檔案的路徑 -->
            <property name="mapperLocations"
                value="classpath:com/yc/mybatis/mapper/*Mapper.xml"></property>
        </bean>
    
        <!-- mapper掃描器 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 掃描的包,如果要掃描多個,中間用,隔開 -->
            <property name="basePackage" value="com.yc.mybatis.mapper"></property>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        </bean>
    
        <!--定義事物管理器,由spring管理事務 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    </beans>
  • 修改mybatisconfig.xml檔案內容如下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://www.mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>  
            <typeAlias type="com.yc.po.User" alias="user"/>  
        </typeAliases>
    
    </configuration>

5. 配置web.xml載入Spring容器與MVC