mybatis(1):入坑篇
依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 测试数据库 -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.4</version>
</dependency>
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配置文件 -->
<properties resource="jdbc.properties"/>
<environments default="test">
<environment id="test">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${hsqldb.driver}" />
<property name="url" value="${hsqldb.url}" />
<property name="username" value="${hsqldb.username}" />
<property name="password" value="${hsqldb.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- mapping 配置: 加载 Mapper.xml 和 Mapper.class -->
<mapper class="com.github.xsj.model.Mapper"/>
</mappers>
</configuration>
映射配置
使用 Mapper wrapper
package com.github.xsj.model;
public class User {
private Long id; // id 使用 Long 类型而非 long
private String name;
...
}
Wrapper:
package com.github.xsj.model;
public interface Mapper {
User getUser(long id);
void insertUser(User user);
@Update("update users set name = #{name}")
void updateUser(User user);
@Delete("delete from users where id = #{id}")
void deleteUser(long id);
}
映射文件: src\main\resources\com\github\xsj\model\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="com.github.xsj.model.Mapper">
<select id="getUser" resultType="com.github.xsj.model.User">
select * from users where id = #{id}
</select>
<!-- get generated key! Note: keyColumn 之所以使用 ID 而非 id 是 hsqldb 将列名强行转换为大写所导致 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="ID">
insert into users values(#{id}, #{name})
</insert>
</mapper>
单元测试
sql 脚本
drop table users if exists;
create table users (
id INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) primary key,
name varchar(126) not null
);
insert into users(name) values('User1');
样例
public class BaseTest {
private final static Logger log = LoggerFactory.getLogger(BaseTest.class);
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void setUp() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis-test-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
// 数据初始化
SqlSession session = sqlSessionFactory.openSession();
Connection conn = session.getConnection();
reader = Resources.getResourceAsReader("com/github/xsj/model/CreateDB.sql");
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(new PrintWriter(System.out));
runner.runScript(reader);
reader.close();
conn.close();
session.close();
}
@Test
public void selectTest() {
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(Mapper.class);
assertThat(mapper.getUser(1), is(notNullValue()));
} finally {
session.close();
}
}
...
}
源码: https://github.com/xsj24/mybaits-getStarted/tree/v1.0.0
mybatis(1):入坑篇的更多相关文章
- RoboGuice 3.0 (一)入坑篇
RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...
- Dagger2 (一) 入坑篇
为什么是Dagger2 为了更好的了解Dagger2,请先阅读RoboGuice篇了解依赖注入. 官方文档称,依赖注入这种技术已经在存在多年了,为什么Dagger2要造轮子? Dagger2是第一个全 ...
- Mybatis Plus 入坑(含最新3.X配置)
简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 使用它可以简化单表的操作, 节省开发时间, 国人 ...
- vuex 入坑篇
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 这个状态自管理应用包含 ...
- 入“坑”mybatis后如何挣脱?
既然已经入"坑"mybatis了,你竟然还想着挣脱,我是不会让你挣脱的~ 当然我有一个算是挣脱的办法.那就是把它学会.理解透.这样我们也就不用在坑里一直徘徊,也算得上是一种挣脱吧! ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- Vue入坑第一篇
写在前面的话:文章是个人学习过程中的总结,为方便以后回头在学习.文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. 一.前言 本篇作为vue入门的一 ...
- RxJava+RxAndroid+MVP入坑实践(基础篇)
转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...
随机推荐
- hdu 3938 Portal
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- 学习ajax 总结
一.服务器客户端基础知识 通信是指不同计算机程序的通信,单单通过ip地址就能知道你找的是哪一台计算机,但是不知道是计算机上的哪个应用程序,要想知道是哪个程序就必须通过端口.这时候就可以问端口到底是什么 ...
- C#中显/隐式实现接口及其访问方法
原贴地址: http://www.cnblogs.com/dudu837/archive/2009/12/07/1618663.html 在实现接口的时候,VS提供了两个菜单,一个是"实现接 ...
- unity3d鼠标经过物体时变颜色,离开时恢复
using UnityEngine; using System.Collections; public class MouseEvent_Color : MonoBehaviour { //物体初始颜 ...
- JavaScript之图片轮换
<!doctype html> <title>javascript图片轮换</title> <meta charset="utf-8"/& ...
- plsqldev与sqldeveloper
plsqldev连接 1.连接不同服务器,要修改tnsnames.ora文件,具体如下修改如下位置 # tnsnames.ora Network Configuration File: \app\us ...
- Cocos2d-x中播放背景音乐
背景音乐的播放与停止实例代码如下: SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3" ...
- 普通树(有根树)C++
对于普通树实现的细节包括 1 树结点的结构体 2 初始化及删除树结点(关注内存泄露) 3 递归先序遍历 4 通过关键值的查询操作,返回关键值的结点 5 凹入表实现 6 广义表实现 7 非递归先序遍历, ...
- Poj 3117 World Cup
1.Link: http://poj.org/problem?id=3117 2.Content: World Cup Time Limit: 1000MS Memory Limit: 65536 ...
- linux 运维知识体系
这里将会介绍一下,LINUX运维工程师的知识体系. 只能说是个人理解吧.并不是必要或者充分的,仅供网友参考. 大部分本博客都有涉及,并不完整. 1.LINUX运维基础 1.1.LINUX系统的简介,分 ...