2021-04-05

MYBATIS

MyBatis 是一款优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录
MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改 名为MyBatis 。
2013年11月迁移到Github


持久化

数据持久化

持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的

内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的 是,人们还无法保证内存永不掉电。
内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也 高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一 直呆在内存中,需要持久化来缓存到外存。

-- 创建一个测试数据库
创建maven项目
1. 新建一个普通的maven项目
2. 删除src目录
3. 导入maven依赖
2.2、创建一个模块
CREATE DATABASE `mybatis_test`;
-- 使用测试数据库
USE mybatis_test;
-- 创建测试表
-- ENGINE INNODB设置数据库引擎
-- DEFAULT CHARSET=utf8 设置字符编码
CREATE TABLE `user`(
`id` INT(20) NOT NULL,
`username` VARCHAR(30) DEFAULT NULL,
`password` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE INNODB DEFAULT CHARSET=utf8;
-- 插入测试数据
INSERT INTO `user`(`id`,`username`,`password`) VALUES
(1,'admin','123456'),
(2,'super','123456'),
(3,'yang','123456')

<!-- 导入依赖 -->
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

<?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核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis_test?
useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=UT
C"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 每一个mapper,都需要在mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/caians/dao/UserMapper.xml"/>
</mappers>
</configuration>

public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
private static InputStream inputStream = null;
static {
//第一步:获取sqlSessionFactory对象
String resource = "classpath:mybatis-config.xml";
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直
接执行已映射的 SQL 语句。例如:
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}

@Data
public class User {
private int id;
private String username;
private String password;
}

public interface UserMapper {
List<User> getUserList();
}

<?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=绑定一个对应的dao/mapper接口 -->
<mapper namespace="com.caians.dao.UserMapper">
<!-- selete 查询语句 -->
<!-- id:对应的dao接口的方法名 -->
<!-- resultType:返回的类型 -->
<select id="getUserList" resultType="com.caians.entity.User">
select *
from mybatis_test.user
</select>
</mapper>

@Test
public void test() {
//第一步:获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//第二步:执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList
) {
System.out.println(user);
}
//关闭sqlSession
sqlSession.close();
}

在这里插入图片描述

<build>
<!-- 可能出现问题说明:Maven静态资源过滤问题 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>

在这里插入图片描述

public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
}

<select id="getUserById" parameterType="int"
resultType="com.caians.entity.User">
select *
from mybatis_test.user
where id = #{id}
</select>

//测试 根据id查询用户
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
}

public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
//根据密码和名字查询用户
User getUserByNamePass(@Param("username") String username,
@Param("password") String password);
}

<select id="getUserByNamePass" resultType="com.caians.entity.User">
select *
from mybatis_test.user
where username = #{username}
and password = #{password}
</select>

@Test
public void getUserByNamePass() {
User user = MybatisUtils.getSqlSession()
.getMapper(UserMapper.class)
.getUserByNamePass("admin", "123456");
System.out.println(user);
}

在这里插入图片描述

//根据密码和名字查询用户
User getUserByNamePass(Map<String, Object> map);

<select id="getUserByNamePass" parameterType="map"
resultType="com.caians.entity.User">
select *
from mybatis_test.user
where username = #{username}
and password = #{password}
</select>
`

```java
@Test
public void getUserByNamePass() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>() {
{
put("username", "admin");
put("password", "123456");
}
};
User user = mapper.getUserByNamePass(map);
System.out.println(user);
}

//insert一个用户
int addUser(User user);

<!-- 添加一个用户-->
<insert id="addUser" parameterType="com.caians.entity.User">
insert into mybatis_test.user(id, username, password)
values (#{id}, #{username}, #{password});
</insert>

//测试插入
@Test
public void addUser() {
User user = new User();
user.setId(4);
user.setUsername("hello");
user.setPassword("123456");
SqlSession sqlSession = MybatisUtils.getSqlSession();
int i = sqlSession.getMapper(UserMapper.class).addUser(user);
System.out.println((i == 1) ? "插入成功" : "插入失败");
//提交事务
sqlSession.commit(); //提交事务,重点!不写的话不会提交到数据库
sqlSession.close();
}

//update 用户
int updateUser(User user);

<!-- 修改一个用户-->
<update id="updateUser" parameterType="com.caians.entity.User">
update mybatis_test.user
set username=#{username},
password=#{password}
where id = #{id}
</update>

@Test
public void updateUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("hehe");
user.setPassword("1234");
user.setId(4);
int i = mapper.updateUser(user);
System.out.println((i == 1) ? "修改成功" : "修改失败");
sqlSession.commit();
sqlSession.close();
}

//delete 用户
int deleteUser(int id);

<delete id="deleteUser" parameterType="int">
delete
from mybatis_test.user
where id = #{id}
</delete>

@Test
public void deleteUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(4);
System.out.println((i == 1) ? "删除成功" : "删除失败");
sqlSession.commit();
sqlSession.close();
}

string wildcardname =%smi%;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{value}

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</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>

<!-- 每一个mapper,都需要在mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/caians/dao/UserMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
<mapper class="com.caians.dao.UserMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下-->
<mappers>
<package name="com.caians.dao"/>
</mappers>

<?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=绑定一个对应的dao/mapper接口 -->
<mapper namespace="com.caians.dao.UserMapper">
<mapper>

<configuration>
<!-- 导入外部db.properties文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<!-- 每一个mapper,都需要在mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/caians/dao/UserMapper.xml"/>
</mappers>
</configuration>

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods"
value="equals,clone,hashCode,toString"/>
</settings>


ResultMap结果集映射

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数 据提取代码中解放出来。
实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等 功能的长达数千行的代码。
ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语 句只需要描述它们的关系就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值