本例中用到的jar版本:
<!-- jar version control start -->
<properties>
<slf4j.version>1.7.24</slf4j.version>
<log4j2.version>2.8.2</log4j2.version>
<junit.version>4.9</junit.version>
<spring.version>4.3.7.RELEASE</spring.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<!-- jar version control end -->
搭建Mybatis
在pom.xml中引入Mysql和Mybatis的包
<!-- MySQL stat -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- MySQL end -->
<!-- Mybatis start-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- Mybatis end -->
數據庫新建測試表
REATE TABLE test_user(
id int primary key,
name varchar(255) not null,
age int
);
在src/test/java/bean中新建TestUser.class
package bean;
public class TestUser {
private Integer id;
private String name;
private Integer age;
public String 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "ID= "+this.getId()+" NAME= "+this.getName()+" AGE= "+this.getAge();
}
}
在src/test/java/mapper中新建TestUserMapper.class(這裏Mybatis以接口的方式訪問數據庫,僅測試一個方法)
package mapper;
import java.util.List;
import bean.TestUser;
public interface TestUserMapper {
public List<TestUser> getAllUsers();
}
同時在src/test/java/mapper中新建TestUserMapper.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="mapper.TestUserMapper" >
<!--id應該是接口中的方法名字,結果類型如沒有配置別名則應該使用全名稱 -->
<select id="getAllUsers" resultType="bean.TestUser">
select * from test_user
</select>
</mapper>
在src/test/resources中引入Mybatis總配置文件:mybatis-config.xml
(db.properties文件位於同目錄下,記錄了數據庫連接的基本配置信息)
<?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>
<!--類型別名,如果此處沒配置,那麼mapper.xml中的resultType就要用全名 -->
<!-- <typeAliases>
<package name=""/>
</typeAliases>
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${mysql_driver}" />
<property name="url" value="${mysql_url}" />
<property name="username" value="${mysql_username}" />
<property name="password" value="${mysql_password}" />
</dataSource>
</environment>
</environments>
<!-- 每個mapper.xml文件都要被註冊 -->
<mappers>
<mapper resource="mapper/TestUserMapper.xml" />
</mappers>
</configuration>
在src/test/jaca/manager中新建TestUserManager測試Mybatis
package manager;
import java.io.InputStream;
import java.util.List;
import mapper.TestUserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import bean.TestUser;
//手動加載mybatis
public class TestUserManager {
private static SqlSessionFactory factory=null;
public static SqlSessionFactory getSqlSessionFactory(){
if(factory==null){
// 獲得環境配置文件流
InputStream config = TestUserManager.class.getClassLoader()
.getResourceAsStream("mybatis-config.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);
}
@Test
public void testMapperInterface(){
//獲得會話對象
SqlSession session=getSession();
try {
//通過MyBatis實現接口BookTypeDAO,返回實例
TestUserMapper testUserMapper =session.getMapper(TestUserMapper.class);
List<TestUser> userList = testUserMapper.getAllUsers();
for(TestUser user: userList){
System.err.println(user.toString());
}
} finally {
session.close();
}
}
}
運行Junit測試:
Mybatis引入成功後,Junit測試中出現錯誤“ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.”
原因是日誌記錄器沒有找到log4j2的配置文件。
(log4j和log4j2有所不同,log4j配置是.properties,log4j是.xml)
pom.xml配置:
<!-- Log4j start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- Log4j end -->
在src/test/resource中新建log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off" monitorInterval="1800">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
若要打印mapper層的sql語句,需要在 Mybatis-config.xml中加入:
<settings>
<setting name="logImpl" value="LOG4J2" />
</settings>
同時在log4j2.xml的節點中聲明哪些對應的mapper(dao)層需要打印sql:
<logger name="mapper.catalogmapper" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
配置後再次測試:
目前項目目錄結構:
===================================================
用Mybatis-generator插件
Mybatis成功引入後,考慮採用Mybatis-generator插件自動生成數據庫操作接口(該步驟需要對Mybatis的配置進行改動)
在pom.xml中配置Mybatis-generator
a. 引入包mybatis-generator-core
<!-- Mybatis-generator-jar start -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- Mybatis-generator-jar end -->
b. 配置generator插件(在 這個節點的節點內部加入一個,同時該插件依賴了mysql驅動,mybatis核心,)
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<executions>
<execution>
<id>Generate MyBatis Files</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate</phase>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</plugin>
在src/test/resource中建立generatorConfig.xml
(1. classPathEntry最好指定mysql-connector-java-5.1.38.jar的絕對路徑)
(2. targetProject是從項目名開始,指定到對應的包)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration >
<properties resource="./db.properties"/>
<classPathEntry location="D:\Apache\apache-maven-3.5.0\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar" />
<context id="mysqlTables" targetRuntime="MyBatis3">
<!-- 消除插件自動生成的垃圾註釋 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="${mysql_url}" userId="${mysql_username}" password="${mysql_password}" />
<!--指定生成的類型爲java類型,避免數據庫中number等類型字段 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- pojo,mapper,mapper.xml等源文件生成的路徑 -->
<javaModelGenerator targetPackage="bean" targetProject="categorySystem/src/test/java" />
<sqlMapGenerator targetPackage="mapper" targetProject="categorySystem/src/test/java" />
<javaClientGenerator targetPackage="mapper" targetProject="categorySystem/src/test/java" type="XMLMAPPER" />
<!-- 表信息 -->
<table schema="category_system" tableName="test_user" enableCountByExample="true" enableUpdateByExample="true"
enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="ID" sqlStatement="MySql" identity="true" />
</table>
</context>
</generatorConfiguration>
右鍵generatorConfig.xml–>Generator Mybatis/iBatis Artifacts—>運行成功後項目目錄:
===================================================
整合Spring-Mybatis
需要:Mybatis-Spring/ Spring AOP/ Spring Core/ JDBC
在pom.xml中增加依賴:
<!-- Mybatis-Spring Adapter start-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Mybatis-Spring Adapter end -->
<!-- Spring start-->
<!-- Spring core start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- aspectJ AOP start -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!-- Spring java jdbc start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring end -->
接着在src/test/resources中新建ApplicationContext.xml,將mybatis-config.xml的配置交由spring託管,託管前mybatis-config.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>
<!--類型別名,默認引入bean下的所有類 -->
<!-- <typeAliases>
<package name=""/>
</typeAliases>
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${mysql_driver}" />
<property name="url" value="${mysql_url}" />
<property name="username" value="${mysql_username}" />
<property name="password" value="${mysql_password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/TestUserMapper.xml" />
</mappers>
</configuration>
開始配置ApplicationContext.xml(配置jdbc數據源/sqlSessionFactory/註冊mapper.java)
<?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:task="http://www.springframework.org/schema/task" 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/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 1. 指定數據庫連接信息的位置 -->
<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>db.properties</value>
</property>
</bean>
<!-- 2. 配置數據源 -->
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${mysql_driver}"></property>
<property name="url" value="${mysql_url}"></property>
<property name="username" value="${mysql_username}"></property>
<property name="password" value="${mysql_password}"></property>
</bean>
<!-- 3. 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="jdbcDataSource" />
<!-- 指向mybatis-config.xml 由spring託管 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- 4. 將mapper交給spring管理 -->
<bean id="testUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper.TestUserMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
</beans>
注:
配置1,2相當於移植mybatis-config.xml中的節點
配置3相當於之前手動獲取mybatis-config.xml:
// 獲得環境配置文件流
InputStream config = TestUserManager.class.getClassLoader().
getResourceAsStream("mybatis-config.xml");
// 創建sql會話工廠
factory = new SqlSessionFactoryBuilder().build(config);
配置4相當於之前在mybatis-config.xml中配置的mapper:
<mappers>
<mapper resource="mapper/TestUserMapper.xml" />
</mappers>
如果有很多的表,就要對應很多的Mpper.java接口,這樣每個都要在Spring中配置就太麻煩了,我們可以一次性指定需要配置的Mapper.java所在的包,默認註冊的bean的id就是該接口的類名:
<!-- 4. 將mapper交給spring管理 (映射接口類自動掃描) -->
<!-- <bean id="testUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper.TestUserMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"></property>
<!-- 指定基礎包,即自動掃描mapper這個包以及它的子包下的所有映射接口類 -->
<property name="basePackage" value="mapper"></property>
</bean>
我們仍舊在src/test/java/manager/TestUserManager中測試:
@Test
public void testSpringMybatis(){
/**
* 1. init spring context
* 2. get mapper bean from context
* 3. interact to database through mapper bean
*/
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml");
TestUserMapper testUserMapper = ctx.getBean("testUserMapper",TestUserMapper.class);
TestUser user = testUserMapper.selectByPrimaryKey(2);
System.out.println(user);
}
執行後:
此時ApplicationContext.xml是需要手動去加載的,我們可以在web.xml中配置Spring的IOC容器,通過這樣的配置,web容器會自動加載applicationcontext.xml初始化:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 默認情況下容器會去WEB-INF/applicationContex.xml找不到就會報錯 這裏重新指定applicationContext.xml的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
小結:
至此Spring和Mybatis已經整合完成,也說明
Mybatis-config.xml構建sqlSessionFactory的功能也可以由Spring託管了,所以我們可以刪除Mybatis-config.xml裏面數據源的配置以及的配置;
值得一提的是此時的數據源是使用了Spring自帶的數據源 (org.springframework.jdbc.datasource.DriverManagerDataSource)
,該數據源事實上並沒有連接池的作用,即每次有連接都會新建一個connection,會造成資源的浪費和多餘的程序開銷。
如果要更加靈活的配置我們可以使用連接池:
C3P0(com.mchange.v2.c3p0.ComboPooledDataSource)
DBCP(org.apache.commons.dbcp.BasicDataSource)
===================================================
整合SpringMVC-Spring-Mybatis
pom.xml中引入核心包:
<!-- Spring mvc start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring mvc end -->
在web.xml中註冊Springmvc核心控制器
<!-- 2. Spring mvc configuration start -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- init servlet when context startup-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Spring mvc configuration end -->
在src/test/java/action/中新建TestUserController.java
package action;
import mapper.TestUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import bean.TestUser;
@Controller
public class TestUserController {
@Autowired
private TestUserMapper testUserMapper;
@RequestMapping("test/login.do")
// 請求url地址映射,類似Struts的action-mapping
public String testLogin(Model model) {
// @RequestParam是指請求url地址映射中必須含有的參數(除非屬性required=false)
// @RequestParam可簡寫爲:@RequestParam("username")
TestUser user = testUserMapper.selectByPrimaryKey(1);
model.addAttribute("user", user);
return "testSuccess";
}
}
本例中返回了user信息到/jsp/testSuccess.jsp中,在 src/main/webapp/jsp/中新建testSuccess.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
user name:<P> ${user.name}</P>
<br/>
user age<P> ${user.age}</P>
</body>
</html>
啓動tomcat,訪問:http://localhost:8080/categorySystem
訪問:http://localhost:8080/categorySystem/test/login.do
至此Mybatis-Spring-Springmvc已經整合完成,如有錯誤,請指正~
參考資料:
http://www.cnblogs.com/best/p/5638827.html
http://blog.csdn.net/abcd898989/article/details/51316612
相關工具:
http://mvnrepository.com/