Mybatis基础学习(一)—初识MyBatis
一、MyBatis是什么?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
二、基础操作
1.查询操作
(1)数据库准备

(2)实体类创建
public class User implements Serializable{
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//get、set....
}
(3)配置文件创建
User.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"> <!-- 命名空间,分类管理SQL语句 -->
<!-- 注意:在mapper代理时,namespace具有特殊及重要的作用 -->
<mapper namespace="test"> <!--
===============根据ID查询用户信息===============
select: 表明一个MapppedStatement。
id: statement的id,要求在命名空间内唯一。
parameterType: 入参的java类型。
resultType: 查询出的单条结果集对应的java类型。
#{ }: 表示一个占位符。
#{id}: 表明该占位符接受的参数名称为id。注意:如果参数为简单类型#{}里面的参数名称可以是任意定义的。
-->
<select id="findUserById" parameterType="int" resultType="com.kiwi.domain.User">
SELECT * FROM USER WHERE id = #{id}
</select> </mapper>
SqlMapConfig.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> <!-- 配置mybatis的环境信息,与spring整合之后,该部分将由spring管理 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments> <!-- 加载Mapper -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers> </configuration>
(4)测试类
@Test
public void testQuery() throws IOException{ //1.读取配置文件
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource); //2.根据配置文件创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is); //3.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(); /*
* 4.SqlSession操作数据,执行增删改查
* 第一个参数: statement ID , namespace.statementID
* 第二个参数: param
*/
User user = sqlSession.selectOne("test.findUserById",1); System.out.println(user); //5.关闭SqlSession
sqlSession.close(); }
结果:
User [id=1, username=王五, sex=2, birthday=Fri Jul 01 00:00:00 GMT+08:00 2016, address=北京市]
(5)根据名字模糊查询
User.xml
<!--
根据用户名称模糊查询
${}:表示一个拼接符
${value}: ${}中的value表示输入参数的参数名称,注意:如果参数为简单类型${}里面的参数名称只能是value
${}存在SQL注入的风险,但是特殊情况必须使用${},比如order by 后面必须是${columnName}
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.kiwi.domain.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
Test.java
@Test
public void testQueryName() throws IOException{ //1.读取配置文件
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource); //2.根据配置文件创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(is); //3.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(); //4.SqlSession操作数据,执行增删改查
List<User> list = sqlSession.selectList("test.findUserByName","小明"); for(User user : list){
System.out.println(user);
} //5.关闭SqlSession
sqlSession.close(); }
结果:
User [id=16, username=张小明, sex=1, birthday=Wed Jul 06 00:00:00 GMT+08:00 2016, address=吉林市]
User [id=22, username=陈小明, sex=1, birthday=Wed Jul 13 00:00:00 GMT+08:00 2016, address=吉林市]
User [id=25, username=陈小明, sex=1, birthday=Fri Jul 01 00:00:00 GMT+08:00 2016, address=长春市]
2.插入操作
(1)保存对象
User.xml

Test.java

结果:

(2)保存对象并返回其主键(自增主键)
User.xml

或者

Test.java

结果:
User [id=29, username=CCC, sex=1, birthday=Fri Jul 01 19:01:19 GMT+08:00 2016, address=北京市海淀区]
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。
3.删除操作
User.xml

Test.java

4.修改操作
User.xml

Test.java

结果:

Mybatis基础学习(一)—初识MyBatis的更多相关文章
- 零基础学习java------36---------xml,MyBatis,入门程序,CURD练习(#{}和${}区别,模糊查询,添加本地约束文件) 全局配置文件中常用属性 动态Sql(掌握)
一. xml 1. 文档的声明 2. 文档的约束,规定了当前文件中有的标签(属性),并且规定了标签层级关系 其叫html文档而言,语法要求更严格,标签成对出现(不是的话会报错) 3. 作用:数据格式 ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- mybatis基础学习4-插件生成器
1:安装 2:在所建项目单击右键输入mybatis如下图 *建项目文件时不用建包和类,在配置文件里写即可生成 3:之后在项目生成 自己建的表(这个必须) 单击右键 即可 --------------- ...
- mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法
1:resultType和resultMap两者只能有一个成立 2:resultMap可以解决复杂查询时的映射问题 3:使用 resultType使用 ------------------------ ...
- mybatis基础学习1---(配置文件和sql语句)
1:配置文件(主要配置文件) 2:配置文件(引入) 3:sql语句解析: <mapper namespace="/"> <!-- 1 -->根据id查对象 ...
- Mybatis基础学习(五)—缓存
一.概述 mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能. 一级缓存是SqlSession级别的缓存.在操作数据库时需要 ...
- Mybatis基础学习(三)—映射文件
一.输入映射 1.parameterType 指定输入参数的Java类,可以使用别名或者类的全限定名.它也可以接受基本数据类型.POJO对象.HashMap. (1)基本数据类型 (2 ...
- Mybatis基础学习(二)—开发Dao方式
一.原始Dao开发方式 UserDao.java public interface UserDao{ public User findUserByID(Serializable id); public ...
- MyBatis基础学习笔记--摘录
1.MyBatis是什么? MyBatis源自于IBatis,是一个持久层框架,封装了jdbc操作数据库的过程,使得开发者只用关心sql语句,无需关心驱动加载.连接,创建statement,手动设置参 ...
随机推荐
- MSSQL数据批量插入优化详细
序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ...
- noi 1.8 11图像旋转
水题不解释 其实我偷懒了 直接输出,,,,,,, 个人QQ:757394026团队QQ:466373640个人博客:www.doubleq.winc++/noi/信息学奥数博客:http://www. ...
- java Log日志规范
Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...
- html5 离线存储 地理信息与本地存储
搭建离线应用程序 ①服务器设置头信息 : AddType text/cache-manifest .manifest ② html标签加 : manifest=“xxxxx.manifest” ③写m ...
- UE4从零搭建CF游戏关卡(蓝图篇)
一 往关卡中放置物体 二 Static Mesh 和 BSP 从今天开始我们要建立一个类似CF游戏的场景,不写一句代码,纯蓝图实现. 三 英语学习 今天早上开会,经理说了一件让我震惊的事情,她说最近大 ...
- ViewPager基础入门
效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动 第二个VIEW向第三个VIEW滑动 ...
- C#基础——结构体
集合:数组:同一类型,固定长度集合:不同类型,不固定长度 要使用集合,必须先引用命名空间:using System.Collections; 定义:ArrayList arr = new ArrayL ...
- Python学习--23 第三方库
本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...
- BUG,带给我的思考
今天打开EverNote时,翻到了四年前在anjuke时做的一些bug分析总结.现在回过头看看也是有些价值所在,挑选出部分bug分享,希望能有所启发. 一. iOS新房APP4.4由于在91市场进行试 ...
- Struts2学习笔记⑥
在微信读书上在看一本李刚写的Struts 2.X权威指南 (好像叫这个)的书,可以看得出来作者的开发经验还是很充足的,但是觉得他的尺度和顺序没有把握好,他自己说拦截器是数据校验.国际化的基础-完了还把 ...