文档章节

spring整合mybatisXML版

o
 osc_gu9d45li
发布于 2019/04/07 16:31
字数 1389
阅读 14
收藏 0

引用的所有jar包,本demo是一个普通的java项目测试的:

aopalliance.jar
asm-3.3.1.jar
aspectjweaver.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mybatis-spring-1.2.3.jar
mysql-connector-java-5.1.20-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-context-support-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar

spring整合mybatis可以将mybatis单独配置读取实体类的位置文件部分,其他的配置由spring自己单独管理如,需先创建好数据库中User表:

<?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">
<!-- 配置mybatis -->
<configuration>

    <!-- 配置别名 -->
    <typeAliases>
        <package name="mr.li.entity"/>
    </typeAliases>
    
    <!-- 引入mr.li.entity包下的user.mapper.xml文件,意思为:将此xml文件配置到mybatis下,
    由mybatis框架最终执行,在mr.li.entity包下还可引入其他类的xml映射文件,最终都统一由mybatis执行 -->
    <mappers>
        <!-- 第一种:xml方式连接数据库 -->
        <mapper resource="mr/li/entity/user.mapper.xml"/>
    </mappers> 
</configuration>

在spring中的引用位置则是

<!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
     <!-- 在处引用 --> <property name="configLocation" value="classpath:mybatis.cfg.xml"/> </bean>

好了,上面的都是套在下面的beans.xml中引用的,本文主要讲利用一个spring的beans.xml配置来完成spring继承mybatis,其中实体类(User)可以是user.mapper.xml的方式配置,也可以是@select...

注解的方式配置。总之都是要写sql语句的。下面展示的代码中UserMapper是注解版的,而UserDao则是xml版的(只对于实体类的配置而言)。写的不标准,但是功能做到了,本应该用userService,但是为了方便看,所以尽可能的简单一点。

1.userDao

package mr.li.dao;

import java.util.List;

import mr.li.entity.User;

public interface UserDao {

    /**
     * 获得一个User集合
     * @return
     */
    List<User> selectList();
}

2.userDaoImpl

package mr.li.dao.impl;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import mr.li.dao.UserDao;
import mr.li.entity.User;
/**
 * 在mybatis-spring-1.2.3jar中,不在需要注入sqlSessionTemplate类,而是直接继承SqlSessionDaoSupport
 * 类来实现利用mybatis操作数据库的功能,此类中还是通过封装了sqlSessionTemplate类来实现的,这样做的好处
 * 是能更好的支持数据库事务。
 * @author Administrator
 *
 */
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    @Override
    public List<User> selectList() {
        //此处引用user.mapper.xml文件中id为selectAll的标签
        return getSqlSession().selectList("mr.li.entity.user.mapper.selectAll");
    }
}

3.spring配置beans.xml

<?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: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.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
     <!-- 配置数据源:连接数据库 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>   
    
    <!-- 声明式事务配置 开始 -->
    <!-- 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <!-- 配置哪些方法使用什么样的事务,配置事务的传播特性:例如:REQUIRED是:在执行此配置的所有方法是先看看有没有事务开启(就是有没有其他此配置方法在执行),如果有那么在此方法执行完后等待此次整个事务
            中的其他方法执行完毕一起提交,如果中间有哪个方法抛出异常则全部数据回滚 -->
            <tx:method name="add" propagation="REQUIRED"/>
            <tx:method name="insert" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="get" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 以上配置的方法事事务在dao.impl中执行时会开启此次事务,一般正常配置应在service中配置,而不是dao中,此处仅用于测试 -->
        <aop:pointcut expression="execution(* mr.li.dao.impl.*.*(..))" id="pointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>
    <!-- 声明式事务配置 结束 -->    
    
    
    
    <!-- 创建连接数据库第一种方式:创建userDao实例开始 -->
    <!-- 配置sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 设置spring读取实体对象的配置类信息,在entity包下的所有.mapper.xml文件 -->
        <property name="mapperLocations" value="classpath:mr/li/entity/*.mapper.xml"/>
    </bean>
    <!-- 通过set方法创建一个userDao的实例 -->
    <bean id="userDao" class="mr.li.dao.impl.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean> 
    <!-- 创建userDao实例结束 -->
    
    <!-- 创建连接数据库第二种方式:采用注解的方式 -->
    <bean id="userMapper" class = "org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="mr.li.mapper.UserMapper"/>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    
</beans>

4.实体类的xml版,user.mapper.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="mr.li.entity.user.mapper">

    <!-- mybatis查询user集合,这只id为selectAll,其他地方如果引用就需要调用这个id
    resulType:这参数作用:返回类型:如果前面有指定包名则会加上前面的包名,如果没有设置则需要全名
    这里不能指定所以用的是全名 -->
    <select id="selectAll" resultType="mr.li.entity.User">
        select * from user
    </select>
</mapper>

5.实体类的注解版Mapper

package mr.li.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import mr.li.entity.User;

public interface UserMapper {

    @Select("select * from user")
    List<User> selectList();
}

7.User实体类

package mr.li.entity;

public class User {

    private int id;
    
    private String name;
    
    private int age;

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    public User() {
    }
}

8.测试类

package mr.li.test;

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

import mr.li.dao.UserDao;
import mr.li.entity.User;
import mr.li.mapper.UserMapper;

public class Test {

    public static void main(String[] args) {
        //第一种方式
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserDao userDao = (UserDao)context.getBean("userDao");
        System.out.println(userDao.selectList().size());
        
        //第二种方式
        UserMapper userMapper = (UserMapper)context.getBean("userMapper");
        for(User user : userMapper.selectList()) {
            System.out.println(user.getName());
        }
    }
}

测试结果,此结果是mysql数据库中的user表信息:

2
王二小
许三多

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

在云函数 SCF 里为 Next.js 跑 SSR

很多时候我们都希望首屏速度快,SEO 友好,那么相比于客户端渲染,SSR 渲染将是这方面的优势。Next.js、Nuxt.js 都是 SSR 框架。本篇文章将介绍 Next.js。 通常我们在部署 SSR 的时候,会担心...

腾讯云Serverless
今天
19
0
一文带你初窥软件测试行业

三大原始问题一——软件测试是什么? 在一定条件下对软件系统进行审核、运行、评估,检验软件系统是否满足规定需求或者找出预期结果与实际结果之间的差别。为软件产品的质量和评价提供依据。...

a伟正是在下
今天
17
0
如何避免APK文件的反向工程? - How to avoid reverse engineering of an APK file?

问题: I am developing a payment processing app for Android, and I want to prevent a hacker from accessing any resources, assets or source code from the APK file. 我正在开发适用......

富含淀粉
今天
13
0
python 抓取 微信公众号文章

1、下载 Fiddler 安装 具体操作传送门 2、第一步已完成,入门开始吧 首先确保有微信客户端(推荐PC,移动端会多一些操作) 启动微信、Fiddler ,然后找到需要抓取的公众号(还是关注一下吧,...

acclea
今天
9
0
JS深拷贝

let arr1 = [1, 2, 3, 4, { name: 'hh'}]/浅克隆****/// 1,展开运算符let arr2 = [...arr1]// 2.splicelet arr3 = arr1.splice(0)/深克隆****/// 1.基...

何祯粮
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部