mybatis

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框架

  1. 持久层: 讲内存中对象数据,转移到数据库中的过程持久层
    Mybatis Hibernate Spring-jpa
  2. ORM Object Relational Mapping 对象关系映射框架
    类 表
    属性 字段
    对象 记录
  3. 半自化 自动化
    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. 映射文件
注意:

  1. xml文件名要与接口名保持一致
  2. namespace属性值 必须与接口的权限定名
  3. id属性必须与抽象方法名保持一致
  4. 返回值类型和参数类型与方法的返回值和参数保持一致
<?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. 在核心配置文件中扫描接口

  1. 扫描单个接口,可以使用mapper标签的class属性
<!-- mapper 配置扫描接口 -->
<mappers>
<mapper class="com.shsxt.mapper.UserMapper"/>  <!--配置
某个接口 -->
</mappers>
  1. 扫描多个接口,可以简化配置,使用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的功能还是十分方便的,虽然现在很多不是这种模式开发了,不过还是值得学习的,慢慢学习其演变。

Mybatis-plus是MyBatis增强工具包,用于简化CRUD操作。该工具包为MyBatis提供了一些高效,有用,即用的功能,使用它可以有效地节省您的开发时间。Mybatis-plus特征与MyBatis完全兼容 启动时自动配置 开箱即用的用于操作数据库的界面 强大而灵活的条件包装器 生成主键的多种策略 Lambda样式的API 全能和高度可定制的代码生成器 自动分页操作 SQL注入防御 支持活动记录 支持可插拔的自定义界面 内置许多有用的扩展Mybatis-plus功能1、单表CURD(简单 + 批量)操作,自动完成(支持 like 比较等查询)。 2、分页插件,Count查询自动或自定义SQL查询。 3、Spring根据不同环境加载不同配置支持(支持typeAliasesPackage通配符扫描)。 【自动生成Entity Mapper Service文件】Mybatis-plus(Mybatis增强工具包) v3.3.2更新日志分页参数提取,单元测试用例修复 达梦数据库代码生成器表过滤支持 微软数据库代码生成器表过滤支持 修复代码生成器属性字段规则错误 SelectById 支持自定义方法名 修复分页插件获取数据库类型问题 Json转换器空值处理 bugfix(mybatis-plus-generator):SQL类型返回错误问题 调整未知方言异常,自动识别url转换小写匹配. fix: 初始化TableInfo中遇到多个字段有@TableId注解时未能抛出异常的问题 SuperController有Class参数的set方法 增加方法StrategyConfig.setSuperServiceImplClass(java.lang.Class<?>). 代码生成器命名策略调整. 扩展分页缓存key值计算. 去除方法推测,直接访问属性字段. 修正枚举处理器类型不匹配比较. 修改表前缀匹配方式 修改在Mybatis全局配置文件中设置分页插件参数不生效问题 修改在Mybatis全局配置文件中设置分页插件参数不生效问 修复PR未指定解析器的时候引发空指针 增加分页插件limit参数配置 修复指定superEntityClass重复生成父类字段问题 无主键的情况无需导入IdType与TableId包 调整生成BaseResultMap格式 支持lombok模式下选择是否进行链式set生成 修复解析器for update错误 过滤PG约束列(只留下主键约束) 增加生成器禁用模板生成 fix(kotlin): 修复动态表名BUG,最大努力替换表名 修复PG约束生成重复属性字段问题 fix(kotlin): 将LambdaUtils中缓存的key改为String 代码生成器增加数据库关键字处理接口 fix github/issues/2454 支持注解可继承 新增 AES 加密数据库用户名密码 优化方法入参泛型,支持更多类型 修复代码生成器开启移除is前缀生成实体缺少包导入 fixed github issues/2470Mybatis-plus截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值