博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring框架 - 数据访问 整合MyBatis
阅读量:6319 次
发布时间:2019-06-22

本文共 4239 字,大约阅读时间需要 14 分钟。

  hot3.png

#整合MyBatis ##SqlSessionFactory 在一般的数据库项目当中,我们需要构建SqlSessionFactoryBuilder,获取session,在使用MyBatis的session API去操作数据库。

在Spring中,MyBatis提供了SqlSessionFactoryBean来整合MyBatis所提供的功能

##添加mybatis-spring依赖

org.mybatis
mybatis-spring
1.3.0

除了Mybatis-Spring还要添加MyBatis本身的依赖

org.mybatis
mybatis
3.4.1

##在Spring配置中定义SqlSessionFactoryBean

如下方式执行配置文件,分别制定configLocation和mapperLocations

##Annotation定义Mapper - 注解 通过Annotation方式声明接口,接口与查询分开

public interface UserMapper {    @Select("SELECT * FROM users WHERE id = #{userId}")        User getUser(@Param("userId") String userId);}

##XML方式定义Mapper

public interface UserMapper{    User getUser(String userId);}

对应的mapper定义

一般情况下,自己的项目更倾向于Annotation方式来定义Mapper,不用多XML文件,项目看起来更干净。

定义完毕Mapper,要告诉Spring注册成为Bean

##定义Mapper Bean Mapper Bean可以理解成DAO,完成的工作就是CRUD,都可以定义在Mapper里面。 ###通过XML配置文件方式 需要制定MapperFactoryBean的Class,需要这个类把接口转换成Bean。属性有声明接口

实际项目当中,会有很多Mapper

###自动发现机制Mapper 需要添加额外配置, 需要定义mybatis的tag,xmlns:mybatis="http://mybatis.org/schema/mybatis-spring",然后填写对应xsd,添加自动扫描的包名称

一般情况下,我们不需要执行sqlSessionFactory,默认会自动注入,但是如果多个数据源定义了不同的SqlSessionFactory,则按照如下进行配置

###另外一种自动发现机制

##使用与注入Mapper 可以通过Autowired Annotation进行注入使用。这样我们可以直接使用预定义好的方法,可以把SQL封装好。但是并没有把session相关的接口暴露出来,执行逻辑都封装掉了。但我们有时候需要更细致的控制。

public class SomeService{    @Autowired    private UserMapper userMapper;}

##SqlSessionTemplate

  • 定义
  • 使用 以下方式是通过XML方式定义SQL,则可以直接调用
public class UserDao {            @Autowired        Private SqlSession sqlSession;                public User getUSer(String userId) {            return (User) sqlSession.selectOne("com.netease.course.UserMapper.getUser",userId);            }}

##MyBatis与Spring事务管理整合

  • 向用户透明
    在配置与代码里面,不需要显示指定任何东西,MyBatis-Spring把TransactionManager与MyBatis的SQL操作会无缝的整合起来,这种方式不需要做额外声明。可以直接使用Spring事务管理的内容功能
  • 支持声明式事务及编程式事务
    直接在Mapper和Dao上支持事务,进行配置事务的属性

##实际整合MyBatis 接口

package com.hava.spring_data.repository;import com.hava.spring_data.entity.User;import org.apache.ibatis.annotations.Select;import java.util.List;/** * Created by yanfa on 2016/10/26. */public interface MyBatisDao {    @Select("SELECT * FROM user WHERE first_name= #{firstName}")    public User findOne(String firstName);    @Select("SELECT * FROM user")    public List
findAll();}

配置

运行类

package com.hava.spring_data;import com.hava.spring_data.entity.User;import com.hava.spring_data.repository.MyBatisDao;import org.springframework.context.ApplicationContext;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by yanfa on 2016/10/26. */public class MyBatisSpringMain {    public static void main(String [] args){        ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-context.xml");        MyBatisDao myBatisDao = context.getBean("myBatisDao",MyBatisDao.class);        for(User user : myBatisDao.findAll())            System.out.println(user.getFirst_name() + " " + user.getLast_name());        User user = myBatisDao.findOne("Zhan");        System.out.println(user.getId() + ":" + user.getFirst_name() + " " + user.getLast_name());        ((ConfigurableApplicationContext) context).close();    }}

运行结果

Meimie HanLei LiMeimie HanLei LiZhan Peng7:Zhan Peng

##需要添加映射Annotation 如果在查询之后,一些值为空,说明实际的数据库列与对象属性无法进行对应,这个时候需要添加@Results的注解来进行映射

@Results({        @Result(property = "id",column = "id"),        @Result(property = "firstName",column = "first_name"),        @Result(property = "lastName",column = "last_name"),    })    @Select("SELECT * FROM user")    public List
getUserList();

注意:@Results是进行的对象映射,并不针对是否是List,也就是说findOne也是这样映射的。

转载于:https://my.oschina.net/hava/blog/776206

你可能感兴趣的文章
20131205
查看>>
数组相减
查看>>
【poj 1962】Corporative Network(图论--带权并查集 模版题)
查看>>
使用AngularJS学习MVC的基础知识分享
查看>>
UDP template 代码
查看>>
爬虫 高性能
查看>>
使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(二)
查看>>
干吧跌!~brothers!~~
查看>>
linux 0.11 源码学习(七)
查看>>
函数模板的简单用法
查看>>
利用 LINQ的skip和Take 方法对List实现分页效果
查看>>
python 中的列表解析和生成表达式 - 转
查看>>
jQuery数组的遍历 function的加载
查看>>
杂记~~~MFC SOCKET
查看>>
AWK文本处理工具(Linux)
查看>>
完成评论功能
查看>>
VC 输入法注入源码
查看>>
BinaryTree I
查看>>
IE6-IE9兼容性问题列表及解决办法_补充之四:HTC (Html Components) 功能逐渐被IE抛弃...
查看>>
Verilog与C/C++的一些区别
查看>>