mybatis
1.介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache
so?ware foundation 迁移到了google code,并且改名为MyBatis 。2013
年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久
层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access
Objects(DAO)
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层
框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结
果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始
映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对
象)映射成数据库中的记录。
2.特点
属于持久层ORM框架
- 持久层: 讲内存中对象数据,转移到数据库中的过程持久层
Mybatis Hibernate Spring-jpa - ORM Object Relational Mapping 对象关系映射框架
类 表
属性 字段
对象 记录 - 半自化 自动化
Mybatis 半自动化
表需要手动进行设计
提供sql
依赖与数据库平台
优点:学习使用简单(基与原声jdbc封装),优化灵活,适合做互联
网项目
Hibernate 自动化ORM框架
表可以通过框架自动创建
省略一些基本的sql
不依赖与数据库平台
缺点: 学生成本高,优化难度大,适合与传统框(OA|图书管理系
统…),不适合做大型互联网项目
3.Mybatis环境搭建
官网: https://mybatis.org/mybatis-3/zh/index.html
3.1jar包
mybatis核心jar包
mybatis依赖jar包
数据库驱动jar包
Mybatis配置文件
mybatis提供两种配置文件, 核心配置文件 mybatis-
config.xml|mybatis.xml 与 SQL映射文件mapper.xml
mybatis.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">
<!-- mybatis的全局配置文件 -->
<configuration>
<!--
用于指明使用哪一个开发环境
default : 用于指定使用的环境的id属性值
-->
<environments default="ev">
<!-- 用户配置开发环境 id: 环境的唯一标识 -->
<environment id="ev">
<!--
事务管理器
JBDC : 表示采用JDBC一样的事务管理方式
-->
<transactionManager type="JDBC"/>
<!--
用于配置数据库连接吃和数据库连接参数
POOLED : 表示mybatis采用连接池技术
-->
<dataSource type="POOLED">
<property name="driver"
value="oracle.jdbc.driver.OracleDriver"/>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="SCOTT"/>
<property name="password" value="TIGER"/>
</dataSource>
</environment>
</environments>
<!-- SQL映射文件配置 -->
<mappers>
<!-- 指明SQL映射文件路径 resource : 包路径
com/shsxt.../xxxMapper.xml-->
<mapper
resource="com/shsxt/mappers/UserMapper.xml"/>
</mappers>
</configuration>
Mybatis SQL映射文件
在Mybatis中,推荐使用mappers作为包名,我们只需要写一个映射配置文
件就可以,UserMapper.xml,用于定义要执行的sql语句,同时可以设置参
数|返回值结果类型
<?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: 命名空间
-->
<mapper namespace="com.shsxt.mappers.UserMapper">
<!--
查询标签: select 用于编写查询语句
id : 当前文件中保证唯一
resultType : 结果的类型
parameterType : 入参类型
-->
<select id="queryAll"
resultType="com.shsxt.pojo.User">
select * from t_user
</select>
</mapper>
注意:不要忘记mybatis核心xml文件中的mapper配置
4.测试
public class TestUser {
public static void main(String[] args) throws
IOException {
//1.加载mybatis全局核心配置文件
InputStream is =
Resources.getResourceAsStream("mybatis.xml");
//2.构建SqlSessionFactory对象
SqlSessionFactory factory = new
SqlSessionFactoryBuilder().build(is);
//3.通过工厂获取会话SqlSession
SqlSession session = factory.openSession();
//4.通过session调用方法执行查询
//selectList() 查到的数据返回一个list集合,没查到返回空的
list
//selectList 的第一个参数为statement: 命名空间+id
List<User> list =
session.selectList("com.shsxt.mappers.UserMapper.queryAll"
);
System.out.println(list);
//5.关闭会话资源
session.close();
}
}
5.Mybatis配置文件详解
5.1. 核心配置文件
1.configuration
配置文件的根元素,所有其他的元素都要在这个标签下使用(dtd文件规
定)
2.environments default=“environment”
用于管理所有环境, 并可以指定默认使用那个环境,通过defualt属性来
指定
3.environment
用来配置环境,id属性用于唯一标识当前环境
4.transactionManager type=“JDBC”
用户配置事务管理器
type属性
用来指定Mybatis采用何种方式管理事务
JDBC : 表示采用与原生JDBC一致方式管理事务
MANAGED: 表示讲事务管理交给其他容器进行, Spring
5.dataSource type=“POOLED”
用于配置数据源, 设置Myabtis是否使用连接池技术,并且配置数据库的
四个连接参数
type属性:
POOLED : 表示采用连接池技术
UNPOOLED: 表示每次都会开启和关闭连接, 不采用连接池技术
JNDI : 使用其他容器提供数据源
6.property
用于配置数据库连接参数 (driver,url,username,password)
7.Mappers
用于配置扫描sql映射文件
5.2. SQL映射文件(mapper)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的
异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同
功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。
MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺
序):
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果
集中来加载对象。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
查询语句是 MyBatis 中最常用的元素之一(映射文件配置见代码)
1.mapper
SQL映射文件的根元素
namespace 属性
用于指定命名空间, mydatis通过namespace+id的方式用来定位sql
语句,所以必须要指定namespace,通过被配置为权限定路径 包名+xml文
件名(不带后缀名)
2.select
用来定义查询语句 update insert delete
id 属性
用来唯一表示当前sql语句,在当前的命名空间中唯一,不能重复 , 类
型方法名
resultType 属性
用于设定查询返回的结果的数据类型,要写类型的权限定名(包名+类
名),如果返回值的是集合类型,要定义集合的泛型类型
6. 三个查询方法
selectList(“命名空间.id”) 用户查询多条数据情况,返回一个List集合,
没有查到数据返回空集合,不是null
selectOne(“命名空间.id”) 用于查询单条数据,返回一个数据, 如果没
有查到返回null
selectMap(“命名空间.id”,key的字段名) 用于查询多条记录情况, 返回
Map集合, 需要指定那个属性作为key, sql查询结果作为value,指定的
字段值作为key, 如果查不到, 返回一个空map集合,不是null
package com.shsxt.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.shsxt.pojo.User;
public class UserTest {
public static void main(String[] args) throws
IOException {
//1.加载核心配置文件
InputStream is =
Resources.getResourceAsStream("mybatis.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory = new
SqlSessionFactoryBuilder().build(is);
//3.获取会话
SqlSession session = factory.openSession();
//4.操作
//1)selectList("namespace.id") 用于查询多条数据,返回一
个list集合,如果没有查询到任数据,返回空集合,不是null
List<User> list =
session.selectList("com.shsxt.mappers.UserMapper.queryAll"
);
System.out.println(list);
//2)selectOne("namespace.id")
User user =
session.selectOne("com.shsxt.mappers.UserMapper.queryById"
);
System.out.println(user);
//3)selectMap("namespace.id","执行作为key的属性")
Map<Integer,User> map =
session.selectMap("com.shsxt.mappers.UserMapper.queryAll",
"id");
System.out.println(map);
//5.关闭session
session.close();
}
}
7. Log4J日志
7.1. Log4J简介
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功
能强大的日志组件,提供方便的日志记录。在apache网站:
jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。
7.2. 日志级别
分为五个级别:
DEBUG(人为调试信息)、INFO(普通信息)、WARN(警告)、ERROR(错
误)和FATAL(系统错误)
这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分
别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一
个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设
定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输
出,而级别比INFO低的DEBUG则不会输出。
7.3. Log4J使用
7.3.1. 导包
7.3.2. 配置文件
可以使用properties或者xml进行配置,使用一个叫 log4j.properties 的配
置文件, 会设定 log4j
的设置信息, 例如日志级别, 日志输出方式, 日志格式等等.
# Set root category priority to INFO and its only appender
to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
# log4j.rootCategory=INFO, CONSOLE, LOGFILE
# CONSOLE is set to be a ConsoleAppender using a
PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayo
ut
log4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l
%d{yyyy-MMdd HH:mm:ss}%n
# LOGFILE is set to be a File appender using a
PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayo
ut
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n
7.3.3. 常见的日志输出格式
7.4. Mybatis对Log4J的支持
7.4.1. 通过settings标签开启 log4j 的支持
settings用于设置 MyBatis 在运行时的行为方式, 例如:缓存, 延迟加载,
日志等.
<!-- settings标签 -->
<settings>
<!-- 设置MyBatis使用log4j日志支持 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
7.4.2. 局部调整日志级别, 定制日志的输出
# 提高整体日志级别
log4j.rootCategory=ERROR, CONSOLE
# 单独设置SQL语句的输出级别为DEBUG级别
# 方法级别
# log4j.logger.com.bjsxt.mapper.UserMapper.selAll=DEBUG
# 类级别
# log4j.logger.com.bjsxt.mapper.UserMapper=DEBUG
# 包级别
log4j.logger.com.bjsxt.mapper=DEBUG
8. 通过properties标签实现软编码
8.1. src下定义配置文件db.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=SCOTT
password=TIGER
8.2. properties标签
mybatis核心配置文件中添加properties标签,指定加载外部的properties
文件,注意定义位置
<!-- 加载外部的properties文件 -->
<properties resource="db.properties" />
8.3. 使用方式
获取properties文件中数据时候,要通过${}的方式获取
<environments default="even">
<environment id="even">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username"
value="${username}"/>
<property name="password"
value="${password}"/>
</dataSource>
</environment>
</environments>
9. typeAliases标签
用于给java类型定义别名,方便在配置文件中使用
9.1. 使用方式
9.1.1. 给User类定义别名为u
<typeAliases>
<typeAlias type="com.shsxt.pojo.User" alias="u"/>
</typeAliases>
9.1.2. 省略alias属性, 表示类别名为类名, 大小写不敏感
<typeAliases>
<typeAlias type="com.shsxt.pojo.User"/> alias属性不写,
默认类名,不区分大小写
</typeAliases>
9.1.3. 可以通过package标签给整个包下的所有类定义别名,
别名为类名
<typeAliases>
<package name="com.shsxt.pojo"/> <!-- 包下所有的类默
认类名 -->
</typeAliases>
<select id="queryAll" resultType="u">
select id,uname,upwd,birthday from t_user
</select>
<select id="queryById" resultType="User">
select id,uname,upwd,birthday from t_user where
id=125
</select>
9.2. Mybatis的内建别名
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小
写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风
格。
10. parameterType入参类型
如果执行的是条件查询,DML,需要在调用方法的时候传递参数,此时, 可
以在sql标签中通过parameterType属性指定参数的类型(别名|权限定名).
而在sql语句,通过#{}的方式获取参数
10.1. 一个参数的查询
例如: 根据id查询用户信息,当参数只有一个,#{}可以任意填写匹配参数
<!-- 根据用户id查询用户信息 -->
<select id="queryById" resultType="string"
parameterType="int">
select uname from t_user where id=#{id} <!-- 可以任
意填写 -->
</select>
SqlSession session = null;
try {
//获取会话工厂
SqlSessionFactory factory = new
SqlSessionFactoryBuilder().build(Resources.getResourceAsSt
ream("mybatis-config.xml"));
//通过工厂生产会话session对象
session = factory.openSession();
//根据id查询用户名 第二个参数为sql传递的参数
String
name=session.selectOne("com.shsxt.mapper.UserMapper.queryB
yId", 126);
System.out.println(name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
session.close();
}
10.2. 多个参数查询
多个参数传递时, 由于sqlSession中提供的查询方法,只允许传递一个
sql参数, 因此可以对多个参数进行封装,可以对象,集合,数组…
<!-- 入参类型: Javabean -->
<select id="queryUserByNamePwd" parameterType="user"
resultType="User">
<!-- 如果参数为对象,可以通过#{对象的属性名}匹配不同的属性值
-->
select <include refid="user_all_field"/> from
t_user where uname =#{uname} and upwd = #{upwd}
</select>
/*
* 参数为Javabean User对象
* 根据用户名和密码查询用户信息
*/
User user = new User("zhaoliu","4567");
List
list=session.selectList("com.shsxt.mapper.UserMapper.query
UserByNamePwd", user);
System.out.println(list);
10.3. 入参类型
parameterType: 基本数据类型(四类八种) 包装类 String Date Javabean
Map List 数组 …
10.3.1. 基本数据类型|包装类
<!-- 入参类型: 基本数据类型int|Integer -->
<!-- 根据用户id查询用户信息 -->
<select id="queryById" resultType="string"
parameterType="int">
</select>
/* 参数基本数据类型 int->Integer
* 根据id查询用户名 第二个参数为sql传递的参数
*/
String
name=session.selectOne("com.shsxt.mapper.UserMapper.queryB
yId", 126);
System.out.println(name);
10.3.2. String
<!-- 入参类型 : String 根据用户名查询用户信息-->
<select id="queryUserByName" parameterType="String"
resultType="User">
select <include refid="user_all_field"/> from t_user
where uname = #{0}
</select>
//测试参数类型: String
List<User>
list=session.selectList("com.shsxt.mapper.UserMapper.query
UserByName", "zhangsan");
list.forEach(System.out::println);
10.3.3. JavaBean
<!-- 入参类型: Javabean -->
<select id="queryUserByNamePwd" parameterType="user"
resultType="User">
<!-- 如果参数为对象,可以通过#{对象的属性名}匹配不同的属性值 -->
select <include refid="user_all_field"/> from t_user
where uname =#{uname} and upwd = #{upwd}
</select>
/*
* 参数为Javabean User对象
* 根据用户名和密码查询用户信息
*/
User user = new User("zhaoliu","4567");
List
list=session.selectList("com.shsxt.mapper.UserMapper.query
UserByNamePwd", user);
System.out.println(list);
10.3.4. Map
<!-- 入参类型: Map 根据多个id,查询用户信息-->
<select id="queryUserByIdMap" parameterType="map"
resultType="user">
select <include refid="user_all_field"/> from t_user
where id = #{id1} or id=#{id2}
</select>
//入参类型: Map
Map<String,Object> paras = new HashMap();
paras.put("id1", 131);
paras.put("id2", 132);
List<User>
list=session.selectList("com.shsxt.mapper.UserMapper.query
UserByIdMap", paras);
list.forEach(System.out::println);
10.3.5. 数组|List
<!-- 参数为数组 根据多个用户名查询用户信息-->
<select id="queryByArray" resultType="User">
select <include refid="user_all_field"/> from t_user
where uname in(
<!--
foreach 遍历参数
collection="array" array遍历数组参数 list集合
item : 每次遍历获取的数据值
separator : 分隔符(每次遍历的数据使用分隔符进行连接)
-->
<foreach collection="array" item ="item"
separator=",">
#{item}
</foreach>
)
</select>
//Array
String[] arr={"hahaha","zhangsan","lisi"};
List<User>
list=session.selectList("com.shsxt.mapper.UserMapper.query
ByArray", arr);
list.forEach(System.out::println);
11. 工具类的封装
package com.shsxt.utils;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils {
private static SqlSessionFactory factory = null;
static {
try {
factory = new
SqlSessionFactoryBuilder().build(Resources.getResourceAsSt
ream("mybatis.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 返回一个会话
*/
public static SqlSession getSession() {
SqlSession session =null;
if(factory!=null) {
//session = factory.openSession(); //默认手动提
交事务
session = factory.openSession(true); //自动提交
}
return session;
}
}
12. 事务(Transaction)
事务是数据库操作的最小单位,有着ACID的特性,应该保证一个事务
下的多条SQL语句要么都成功,要么都失败.
Mybatis中配置了事务管理器,type属性设置JDBC,表示Mybatis采用和
原生JDBC相同的事务管理机制
在Myabatis执行操作的开始,将自动提交功能关闭了,需要我们在执行
DML操作时候,手动提交设置|设置自动提交
手动提交:
session.commit(); //事务提交
设置自动提交事务:
public static SqlSession getSession() {
SqlSession session =null;
if(factory!=null) {
//session = factory.openSession(); //默认手动提交事务
session = factory.openSession(true); //自动提交
}
return session;
}
13. 增删改操作
SQL映射文件:
<mapper namespace="com.shsxt.mappers.UserMapper2">
<!-- 测试增删改 : 结果返回的都是影响函数int -->
<!-- 新增 -->
<insert id="insertUser" parameterType="user">
insert into tb_user values(seq_user_id.nextval,#
{username},#{userpwd})
</insert>
<!-- 修改 -->
<update id="updateUser" parameterType="user">
update tb_user set userpwd = #{userpwd} where id
=#{id}
</update>
<!-- 删除 -->
<delete id="deleteUser" parameterType="_int">
delete from tb_user where id = #{haha}
</delete>
</mapper>
Java测试类:
/*
* 测试增删改功能
*/
public class UserTest02 {
//删除方法
@Test
public void testDelete() {
SqlSession session = MybatisUtils.getSession();
int rows =
session.update("com.shsxt.mappers.UserMapper2.deleteUser",
100);
if(rows>0) {
System.out.println("SECCESS!!!");
}else {
System.out.println("FAILED!!!");
}
//会话关闭
session.close();
}
//修改方法
@Test
public void testUpdate() {
SqlSession session = MybatisUtils.getSession();
User user = new User();
user.setId(100);
user.setUserpwd(9876);
int rows =
session.update("com.shsxt.mappers.UserMapper2.updateUser",
user);
if(rows>0) {
System.out.println("SECCESS!!!");
}else {
System.out.println("FAILED!!!");
}
//会话关闭
session.close();
}
//插入方法
@Test
public void testInsert() {
SqlSession session = MybatisUtils.getSession();
User user = new User();
user.setUsername("zhangsan");
user.setUserpwd(789);
//插入方法
int rows =
session.insert("com.shsxt.mappers.UserMapper2.insertUser",
user);
//影响行数判断
if(rows>0) {
System.out.println("SECCESS!!!");
//session.commit(); //事务提交
}else {
System.out.println("FAILED!!!");
//session.rollback();
}
//会话关闭
session.close();
}
}
14. resultType结果类型
基本数据类型(包装类) String Date JavaBean List Map List-Map
14.1. Date类型
<!-- Date : 根据id获取生日 -->
<select id="queryDateById" resultType="date"
parameterType="int">
select birthday from t_user where id = #{param1}
</select>
/*
* Date : 根据id返回生日
*/
@Test
public void testDate(){
SqlSession session = MybatisUtils.getSession();
Date date =
session.selectOne("com.shsxt.mapper.UserMapper.queryDateBy
Id",129);
System.out.println(new
SimpleDateFormat().format(date));
session.close();
}
14.2. List类型
<!--List类型 :查询指定名字类型的用户信息 -->
<select id="queryUserByUsernameLike" resultType="user"
parameterType="string">
select * from t_user where uname like '%'||#{0}||'%'
</select>
/*
* List : 查询指定名字类型的用户信息
*/
@Test
public void testList(){
SqlSession session = MybatisUtils.getSession();
List<User> list =
session.selectList("com.shsxt.mapper.UserMapper.queryUserB
yUsernameLike","i");
list.forEach(System.out::println);
session.close();
}
14.3. Map类型
<!-- Map: 根据用户名和密码查询用户信息 (只能匹配一个用户信息)-->
<select id="queryUserByNamePwdToMap" parameterType="User"
resultType="map">
select * from t_user where uname = #{uname} and upwd =
#{upwd}
</select>
/*
* Map : 根据用户名和密码查询用户信息
* 返回值: key 属性名
* value 属性值
*/
@Test
public void testMap(){
SqlSession session = MybatisUtils.getSession();
Map<String,Object> map=
session.selectOne("com.shsxt.mapper.UserMapper.queryUserBy
NamePwdToMap",new User("yinwei","1314"));
System.out.println(map);
session.close();
}
14.4. List-Map类型
<!-- Map: 根据用户名和密码查询用户信息 (只能匹配一个用户信息)-->
<select id="queryUserByNamePwdToMap" parameterType="User"
resultType="map">
select * from t_user where uname = #{uname} and upwd =
#{upwd}
</select>
/*
* List<Map> : 根据用户名和密码查询用户信息,返回多个值
* 返回值: key 属性名
* value 属性值
*/
@Test
public void testListMap(){
SqlSession session = MybatisUtils.getSession();
List<Map<String,Object>> map=
session.selectList("com.shsxt.mapper.UserMapper.queryUserB
yNamePwdToMap",new User("zhangsan","1234"));
System.out.println(map);
session.close();
}
*****15. 接口绑定方案 ********
Myabtis中,提供了一套接口绑定方案,程序员可以提供一个接口,然后提
供一个与接口所对应的mapper.xml文件
Myabaits会自动讲接口与xml文件进行绑定,实际上就是Mybatis互根据
接口和对应的xml文件创建一个接口的实现类,换言之,就是可以得到接
口类型的一个对象,方便方法的调用
15.1. 实现方式
15.1.1. 定义接口
/*
* 接口定义了对用户的操作
*/
public interface UserMapper {
//查询所有用户
public List<User> queryAll();
}
15.1.2. 映射文件
注意:
- xml文件名要与接口名保持一致
- namespace属性值 必须与接口的权限定名
- id属性必须与抽象方法名保持一致
- 返回值类型和参数类型与方法的返回值和参数保持一致
<?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 namespace ="com.shsxt.mapper.UserMapper">
<!-- id 与 方法名一致 -->
<select id="queryAll" resultType="User">
select * from t_user
</select>
</mapper>
15.1.3. 在核心配置文件中扫描接口
- 扫描单个接口,可以使用mapper标签的class属性
<!-- mapper 配置扫描接口 -->
<mappers>
<mapper class="com.shsxt.mapper.UserMapper"/> <!--配置
某个接口 -->
</mappers>
- 扫描多个接口,可以简化配置,使用package标签,表示扫描对应包下的
所有接口
<!-- mapper 配置扫描接口 -->
<mappers>
<package name="com.shsxt.mapper"/>
</mappers>
15.1.4. 使用
在使用时,通过SqlSession的getMapper() 方法,返回接口代理对象,从而调
用以实现的抽象方法
/*
* 测试接口绑定
*/
@Test
public void test(){
SqlSession session = MybatisUtils.getSession();
//getMapper()获取接口实现类对象,参数为接口的class对象,通
过参数指定接口
UserMapper mapper
=session.getMapper(UserMapper.class);
//通过对象调用方法
List<User> list = mapper.queryAll();
System.out.println(list);
session.close();
}
15.2. 通过接口绑定解决多参数传递问题
15.2.1. 方式一
a)接口中定义方法
User selByUP(String username, String password);
b) 映射文件中提供对应的标签. 此时, SQL 语句中获取方式有两种, 通过
#{arg+数字}或#{param+数字}的方式.
<select id="selByUP" resultType="user">
select * from t_user where username=#{param1} and
password=#{param2}
</select>
15.2.2. 方式二
a) 接口中定义方法, 参数中使用@Param 注解设定参数名用于在 SQL 语
句中使用.
User selByUP(@Param("username") String username,
@Param("password")
String password);
b) 映射文件中提供对应的标签. 此时, SQL 语句中获取方式有两种, 通过
#{参数名称}或#{param+数字}的方式.
<select id="selByUP" resultType="user">
select * from t_user where username=#{username} and
password=#{password}
</select>
16. 接口代理开发(CRUD)
16.1. 基本CRUD操作
//测试接口绑定方案crud
public interface UserMapper {
//查询所有用于信息
public List<User> queryUserByNamePwd(@Param("name")
String name,@Param("pwd") int pwd);
//新增用户
public int addUser(String name,int pwd);
//修改用户信息
public int updateUser(User user);
//删除用户
public int deleteUser(int id);
}
<mapper namespace="com.shsxt.mappers.UserMapper">
<select id="queryUserByNamePwd" resultType="User">
select * from t_user where username=#{name} or
userpwd = #{pwd}
</select>
<!-- 新增用户 -->
<insert id="addUser">
INSERT INTO T_USER VALUES(seq_user_id.nextval,#
{param1},#{param2})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="User">
update t_user set username=#{username},userpwd=#
{userpwd} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from t_user where id=#{id}
</delete>
</mapper>
/*
* 接口实现crud
*/
public class UserTest {
@Test
public void testDelete() {
SqlSession session = MybatisUtils.getSession();
UserMapper userMapper =
session.getMapper(UserMapper.class);
int rows = userMapper.deleteUser(202);
if(rows>0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.close();
}
@Test
public void testUpdate() {
SqlSession session = MybatisUtils.getSession();
UserMapper userMapper =
session.getMapper(UserMapper.class);
int rows = userMapper.updateUser(new User(201,"张三
丰",1111));
if(rows>0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.close();
}
@Test
public void testInsert() {
SqlSession session = MybatisUtils.getSession();
UserMapper userMapper =
session.getMapper(UserMapper.class);
int rows = userMapper.addUser("林更新", 45678);
if(rows>0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.close();
}
@Test
public void testSelect() {
SqlSession session = MybatisUtils.getSession();
UserMapper userMapper =
session.getMapper(UserMapper.class);
List<User> list = userMapper.queryUserByNamePwd("胡
歌", 789);
System.out.println(list);
session.close();
}
}
16.2. 批量操作
//测试批量操作
public interface UserMapper2 {
//批量新增用户
public int addUserSome(List<User> user);
//批量删除
public int deleteSomeUser(List<Integer> id);
//批量更新
public int updateSomeUser(List<User> list);
}
<mapper namespace="com.shsxt.mappers.UserMapper2">
<!-- 批量插入 -->
<insert id="addUserSome" parameterType="list">
insert into tb_user(id, username, userpwd)
select seq_user_id.nextval, uname, upwd
from (
<foreach collection="list" item="item"
separator="union" >
select #{item.username} uname, #
{item.userpwd} upwd from dual
</foreach>
)
</insert>
<!-- 批量删除 -->
<delete id="deleteSomeUser" parameterType="list">
delete from tb_user where id in(
<foreach collection="list" item="item"
separator=",">
#{item}
</foreach>
)
</delete>
<!-- 批量更新 -->
<update id="updateSomeUser" parameterType="list">
<foreach collection="list" item="item"
open="begin" close=";end;" separator=";">
update tb_user set userpwd = #{item.userpwd}
where id = #{item.id}
</foreach>
</update>
</mapper>
public class UserTest2 {
@Test
public void testUpdateSome() {
SqlSession session = MybatisUtils.getSession();
UserMapper2 userMapper =
session.getMapper(UserMapper2.class);
List<User> list = new ArrayList();
list.add(new User(218,"蓝精灵",88));
list.add(new User(219,"粉精灵",99));
list.add(new User(220,"紫精灵",00));
int rows = userMapper.updateSomeUser(list);
System.out.println(rows);
session.close();
}
@Test
public void testDeleteSome() {
SqlSession session = MybatisUtils.getSession();
UserMapper2 userMapper =
session.getMapper(UserMapper2.class);
List<Integer> list = new ArrayList();
list.add(208);
list.add(209);
int rows = userMapper.deleteSomeUser(list);
if(rows>0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.close();
}
@Test
public void testInsertSome() {
SqlSession session = MybatisUtils.getSession();
UserMapper2 userMapper =
session.getMapper(UserMapper2.class);
List<User> list = new ArrayList();
list.add(new User(1,"蓝精灵",5));
list.add(new User(2,"粉精灵",6));
list.add(new User(1,"紫精灵",7));
int rows = userMapper.addUserSome(list);
if(rows>0) {
System.out.println("成功");
}else {
System.out.println("失败");
}
session.close();
}
}
mybatis的功能还是十分方便的,虽然现在很多不是这种模式开发了,不过还是值得学习的,慢慢学习其演变。