使用者增刪改查:在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.javapackage 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
修改web.xml檔案,註冊載入Spring容器所需的監聽器,註冊Spring MVC前置控制器Servlet,添加了一個全域性的編碼過濾器。
<?xml version="1.0" encoding="UTF-8"?> <