SSM框架之--spring(二)spring集成mybatis

(一)spring集成mybatis第一種方式

1.添加jar包 (18個)

【mybatis】 4個
mybatis-3.1.1.jar
log4j-1.2.16.jar
asm-3.3.1.jar
cglib-2.2.2.jar
【mybatis-spring】 1個
mybatis-spring-1.2.1.jar
【spring】 10個
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
commons-logging-1.1.1.jar

    spring-web-3.2.4.RELEASE.jar

    spring-aop-3.2.4.RELEASE.jar
    spring-jdbc-3.2.4.RELEASE.jar
    spring-tx-3.2.4.RELEASE.jar
    spring-test-3.2.4.RELEASE.jar

【MYSQL驅動包】 1個
mysql-connector-java-5.0.4-bin.jar
【數據庫連接池】 2個
commons-dbcp-1.4.jar
commons-pool-1.6.jar
共18個jar包

2.數據庫表

CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT);
)

3.實體類:User

public class User implements Serializable{
private int id;
private String name;
private int age;
//set,get方法
}

4.DAO接口:UseDaor

package com.dao.inter;

import java.util.List;
import com.po.User;

public interface UserDao {
//一.增加
public int addUser(User user);
//二.刪除
public int deleteUser(User user);
//三.修改
public int updateUser(User user);
//四.查1
public User getUserById(Integer userid);
//五.按SQL語句查
public List getPageByQuery(String sql);
//六.查詢總共有多少條記錄
public int getTotalRecordSum(String sql);

}

5.DAO接口:UserDaoImpl.java

package com.dao.impl;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.dao.inter.UserDao;
import com.po.User;

public class UserDaoImpl implements UserDao {

private SqlSession sqlSession;

public void setSqlSession(SqlSession sqlSession) {
    this.sqlSession = sqlSession;
}

@Override
public int addUser(User user) {

    int count;
    String statement = "com.po.userMapper.addUser";

    count = sqlSession.insert(statement, user);

    return count;
}

@Override
public int deleteUser(User user) {
    int count;
    String statement = "com.po.userMapper.deleteUser";

    count = sqlSession.delete(statement, user);

    return count;
}

@Override
public int updateUser(User user) {
    int count;
    String statement = "com.po.userMapper.updateUser";

    count = sqlSession.update(statement, user);

    return count;
}

@Override
public User getUserById(Integer userid) {
    User user = null;

    String statement = "com.po.userMapper.getUser";

    user = sqlSession.selectOne(statement, userid);

    return user;
}

@Override
public List<User> getPageByQuery(String sql) {
    List<User> list = null;

    String statement = "com.po.userMapper.getPageByQuery";

    list = sqlSession.selectList(statement, sql);

    return list;
}

@Override
public int getTotalRecordSum(String sql) {
    int count = 0;
    String statement = "com.po.userMapper.getTotalRecordSum";

    count = sqlSession.selectOne(statement, sql);

    return count;
}

}

6.數據庫屬性文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
maxActive=20
maxIdle=10
maxWait=-1

7.mybatis的配置文件conf.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>

     <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
         <!--打開延遲加載的開關  -->
        <setting name="lazyLoadingEnabled" value="true"/>
           <!--將積極加載改爲消極加載及按需加載  -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    <typeAliases>
        <package name="com.po"/>
    </typeAliases>

    <mappers>
        <mapper resource="com/po/userMapper.xml"/>

    </mappers>

</configuration>

8.SQL映射文件:userMapper.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.po.userMapper">

    <insert id="addUser" parameterType="User">
        insert into user values(null,#{name}, #{age});
    </insert>

    <delete id="deleteUser" parameterType="User">
        delete from user where id=#{id}
    </delete>

    <update id="updateUser" parameterType="User">
        update user set name=#{name},age=#{age} where id=#{id}
    </update>

    <select id="getUserById" parameterType="java.lang.Integer" resultType="User">
        select * from user where id=#{id}
    </select>

    <select id="getPageByQuery" statementType="STATEMENT" parameterType="java.lang.String" resultType="User">
        ${value}
    </select>

    <select id="getTotalRecordSum" statementType="STATEMENT" parameterType="java.lang.String" resultType="int">
        ${value}
    </select>
</mapper>

9.spring的配置文件:applicationContent.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    ">

    <context:property-placeholder location="classpath:db.properties" />

    <!--創建jdbc數據源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />

        <property name="maxActive" value="${maxActive}" />
        <property name="maxIdle" value="${maxIdle}" />
        <property name="maxWait" value="${maxWait}" />
    </bean>

    <!-- 創建SqlSessionFactory,同時指定數據源 -->
    <!-- SqlSessionFactoryBean相當於SqlSessionFactoryBuilder -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 指定mybtis總配置文件,訂製的environment在spring容器中不在生效 -->
        <property name="configLocation" value="classpath:conf.xml" />

BasicDataSource提供了close()方法關閉數據源,所以必須設定destroy-method=”close”屬性, 以便Spring容器關閉時,數據源能夠正常關閉。除以上必須的數據源屬性外,還有一些常用的屬性:
defaultAutoCommit:設置從數據源中返回的連接是否採用自動提交機制,默認值爲 true;
defaultReadOnly:設置數據源是否僅能執行只讀操作, 默認值爲 false;
maxActive:最大連接數據庫連接數,設置爲0時,表示沒有限制;
maxIdle:最大等待連接中的數量,設置爲0時,表示沒有限制;
maxWait:最大等待秒數,單位爲毫秒, 超過時間會報出錯誤信息;
validationQuery:用於驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數據, 如你可以簡單地設置爲:“select count(*) from user”;
removeAbandoned:是否自我中斷,默認是 false ;
removeAbandonedTimeout:幾秒後數據連接會自動斷開,在removeAbandoned爲true,提供該值;
logAbandoned:是否記錄中斷事件, 默認爲 false;

SqlSessionTemplate的構造方法

public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
}

10.測試代碼:Test.java

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.dao.inter.UserDao;
import com.po.User;

public class Test {
    public static void main(String[] args) {

        ApplicationContext context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");

        UserDao userDao = (UserDao) context.getBean("userDaoImpl");

        User user = new User();
        user.setName("趙英龍");
        user.setAge(22);

        userDao.addUser(user);
    }
}

11.在web應用程序中使用spring

在web.xml中加入

<listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

(二)spring集成mybatis第二種方式

使用動態代理的方式生成Dao實現類,並且mybatis的中心配置文件conf.xml交給spring管理

1.添加jar包

【mybatis】 4個
mybatis-3.1.1.jar
log4j-1.2.16.jar
asm-3.3.1.jar
cglib-2.2.2.jar
【mybatis-spring】 1個
mybatis-spring-1.2.1.jar
【spring】 10個
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
commons-logging-1.1.1.jar

    spring-web-3.2.4.RELEASE.jar

    spring-aop-3.2.4.RELEASE.jar
    spring-jdbc-3.2.4.RELEASE.jar
    spring-tx-3.2.4.RELEASE.jar
    spring-test-3.2.4.RELEASE.jar

【MYSQL驅動包】 1個
mysql-connector-java-5.0.4-bin.jar
【數據庫連接池】 2個
commons-dbcp-1.4.jar
commons-pool-1.6.jar

2.數據庫表

CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT);
)

3.實體類:User

public class User implements Serializable{
private int id;
private String name;
private int age;
//set,get方法
}

4.DAO接口:UserMapper

package com.dao.inter;

import java.util.List;
import com.po.User;

public interface UserMapper {
//一.增加
public int addUser(User user);
//二.刪除
public int deleteUser(User user);
//三.修改
public int updateUser(User user);
//四.查1
public User getUserById(Integer userid);
//五.按SQL語句查
public List getPageByQuery(String sql);
//六.查詢總共有多少條記錄
public int getTotalRecordSum(String sql);
}

5.DAO接口:UserMapper.xml(不需要編寫)

Spring會使用動態代理自動生成UserDaoImpl

6.SQL映射文件:UserMapper.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">
<!--namespace的值要和Mapper接口的類全名保持一致-->
<mapper namespace="com.dao.inter.UserMapper">
<!--id要和Mapper接口中的方法保持一致-->
    <insert id="addUser" parameterType="User">
        insert into user values(null,#{name}, #{age});
    </insert>

    <delete id="deleteUser" parameterType="User">
        delete from user where id=#{id}
    </delete>

    <update id="updateUser" parameterType="User">
        update user set name=#{name},age=#{age} where id=#{id}
    </update>

    <select id="getUserById" parameterType="java.lang.Integer" resultType="User">
        select * from user where id=#{id}
    </select>

    <select id="getPageByQuery" statementType="STATEMENT" parameterType="java.lang.String" resultType="User">
        ${value}
    </select>

    <select id="getTotalRecordSum" statementType="STATEMENT" parameterType="java.lang.String" resultType="int">
        ${value}
    </select>
</mapper>

7.spring的配置文件:applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    ">


    <context:property-placeholder location="classpath:db.properties" />

    <!--創建jdbc數據源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />

        <property name="maxActive" value="${maxActive}" />
        <property name="maxIdle" value="${maxIdle}" />
        <property name="maxWait" value="${maxWait}" />
    </bean>


    <!-- 創建SqlSessionFactory,同時指定數據源 -->
    <!-- SqlSessionFactoryBean相當於SqlSessionFactoryBuilder -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 把mybatis中心配置文件conf.xml的配置信息交給spring管理  -->
        <property name="typeAliasesPackage" value="com.po" />
    </bean>

    <!-- 掃描mapper映射文件位置 用來加載xxxMapper.xml文件 相當於 conf.xml中<mappers>
        掃描到xxxMapper.xml文件後 根據配置文件的namespace找到接口 通過id找到對應方法 給對應方法
        生成實現  最終使用動態代理生成Dao實現類  即XXXMapperImpl 並把它放到spring容器中
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定xxxMapper.xml配置文件位置 -->
        <property name="basePackage" value="com.dao.inter" />

    </bean>

    <bean id="userServiceImpl" class="com.service.impl.UserServiceImpl">
    </bean>
</beans>

8.數據庫屬性文件:db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
maxActive=20
maxIdle=10
maxWait=-1

9.mybatis的配置文件:conf.xml(可以省略)

如果想配置延遲加載也是在applicationContext.xml SqlSessionFactoryBean 節點中配置

10.業務層接口UserService

package com.service.inter;

import java.util.List;
import com.po.User;

public interface UserService {
// 添加
public int addUser(User user);
// 刪除
public int deleteUserById(String id);
// 修改
public int updateUser(User user);
// 查1
public User getUserById(String id);
// 查所有
public List getAllUsers();

}

11.業務層實現類UserServiceimpl

package com.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.dao.inter.UserMapper;
import com.po.User;
import com.service.inter.UserService;

public class UserServiceImpl implements UserService {
    //默認spring按類型自動注入
    @Autowired
    private UserMapper userMapperImp;

    public void setUserMapperImp(UserMapper userMapperImp) {
        this.userMapperImp = userMapperImp;
    }

    @Override
    public int addUser(User user){

        int count = userMapperImp.addUser(user);
        return count;
    }

    public int deleteUserById(String id){

        User user = new User();
        user.setId(Integer.parseInt(id));
        int count = userMapperImp.deleteUser(user);
        return count;
    }

    // 修改
    public int updateUser(User user){
        int count = userMapperImp.updateUser(user);
        return count;
    }

    // 查1
    public User getUserById(String id){

        User User = null;

        User = userMapperImp.getUserById(Integer.parseInt(id));
        return User;
    }

    @Override
    public List<User> getAllUsers(){
        List<User> list = null;

        String sql = "select * from User";
        list = userMapperImp.getPageByQuery(sql);
        return list;
    }



}

12.日誌處理

在src下加入log4g.properties屬性文件,使用debug控制檯打印的信息過多,可以把日誌級別調成ERROR即可
log4j.properties\uFF0C
log4j.rootLogger=ERROR, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

13.測試類

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.po.User;
import com.service.inter.UserService;

public class Test {
public static void main(String[] args) {

    ApplicationContext context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");

    UserService userService = (UserService) context.getBean("userServiceImpl");

    User user = new User();
    user.setName("zhangsan");
    user.setAge(22);
    userService.addUser(user);
}

}

14.在web應用程序中使用spring

在web.xml中加入
<listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

附常見錯誤
Failed to read candidate component class: file [D:\jidi16WorkSpace2\Mybatis_Spring_2\WebRoot\WEB-INF\classes\com\dao\inter\UserMapper.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn’t supported yet: file [D:\jidi16WorkSpace2\Mybatis_Spring_2\WebRoot\WEB-INF\classes\com\dao\inter\UserMapper.class]; nested exception is java.lang.IllegalArgumentException
解決方案:
把編譯環境改成jdk1.6即可或者使用spring4.x版本

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章