Mybatis
获得Mybatis的方法:
在maven仓库(https://mvnrepository.com),搜索Mybatis,复制粘贴到pom.xml,maven会自动下载相关配置依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
中文文档:https://mybatis.org/mybatis-3/zh/index.html
什么是Mybatis?
Mybatis_logoMyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Question:持久层
持久化:有一些信息不能失效,而内存是断电即失效的,所以需要将数据从瞬时状态转换到持久状态,这个过程就是持久化
持久层:完成持久化工作的代码操作,就是持久层做的事,层界限十分清晰
区分持久化、持久层,持久化是一个动作,而持久层是一个名词,是一个概念
第一个Mybatis程序
思路:搭建环境 --> 导入Mybatis --> 编写代码 --> 测试
搭建环境:
1、创建数据库以及表,并添加数据
create database mybatis;
use mybatis;
create table user (
id int(8) not null primary key,
name varchar(10) default null,
pwd varchar(10) default null
)engine=InnoDB default charset=utf8;
insert into user values('95001','yzx','123123'), ('95002','jay','123123'),('95003','zs','123123'),
('95004','ls','123123');
SET SQL_SAFE_UPDATES= 0;
2、创建项目
1、使用idea创建一个空的maven项目
2、删除src,将该项目当做父工程使用,这样做的好处是,之后在此工程下新建的module无序重复导入依赖
<groupId>cn.yzx</groupId>
<artifactId>mybatis_learn</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules> <!--之后的module都会在该父工程下-->
<module>mybatis_01</module>
</modules>
3、导入依赖,至少需要导入三个依赖,才能满足需求
<!--导入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
3、创建一个模块
1、编写mybatis核心配置文件
官方建议的配置文件名称根据官方提示,在resources下创建配置文件,名称可以修改,但建议一致
2、编写核心配置xml文件
<!--核心配置文件-->
<configuration>
<!--配置,可多套配置,default表示默认使用配置-->
<environments default="development">
<environment id="development"><!--id为不重复单一标识符-->
<transactionManager type="JDBC"/>
<dataSource type="mybatis">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?
useUnicode=true&
characterEncoding=utf8&
serverTimezone=GMT&
useSSL=true"/>
<!--设置允许使用编码-->
<!--设置编码-->
<!--mysql8.0之后,需要设置时区-->
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
3、编写mybatis工具类
在项目下创建utils包,创建utils工具类
工具类最后根据官方提示,在工具类内编写以下固定代码
//创建SqlSessionFactory并获取SqlSession的工具类
public class mybatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
String resource = "mybatis-config.xml"; //从resource读取文件
InputStream inputStream = Resources.getResourceAsStream(resource); //使用流读取文件
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //创建sqlSessionFactory对象
}catch (Exception e){
e.printStackTrace();
}
}
//获取SqlSession的方法
public statis SqlSession getsqlSession() {
return sqlSessionFactory.openSession();
}
}
这样一个mybatis工具类就写好了,SqlSession就和JDBC中PreparedStatement对象一样,用于执行sql语句
4、编写代码
实体类
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
Mapper接口
public interface userMapper {
List<User> findAll();
}
接口实现类,在mybatis中,接口实现类被摒弃了,转而使用配置文件
配置文件
<?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="cn.yzx.dao.userMapper">
<!--方法名以及结果集类型-->
<select id="getUserList" resultType="cn.yzx.pojo.User">
select * from user;
</select>
</mapper>
5、测试
在test下建立目录结构一致的包,随后建立对应test类
public class userMapperTest {
@Test
public void test01() {
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
此时会报一个错误:这个错误要死死的记住,绑定异常
org.apache.ibatis.binding.BindingException: Type interface cn.yzx.dao.userMapper is not known to the MapperRegistry.
原因是没有在核心配置文件中注册
重点如图之后还会出现另一个错误:资源过滤问题,此时打包会发现target中是没有对应xml文件的
The error may exist in cn/yzx/dao/userMapper.xml
解决方法是在pom.xml文件中,加上以下代码
<!--防止资源导出失败-->
<build>
<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>
之后就能正常运行了
正常运行结果target中也有了对应xml文件
存在xmlCRUD
查:
1、查全部
类 xmlresultType是返回值类型,查全部本质上也是一个一个的查询,最后装到list中,所以返回值是User对象
2、查单个
类 xmlparameterType是参数类型
增:
类 xml要特别注意,在Mybatis中,所有增删改操作,都默认关闭自动提交事务,所以最后需要手动提交事务!!,若不想手动提交,需要在获取sqlSession时,带上参数
SqlSessionFactory原码可见,openSession方法是有重载形式的,而且自动提交事务默认是关闭的 不开启自动提交事务 开启自动提交事务
改:
类 xml删:
类 xml万能的Map集合
使用Map集合达到单条件修改的效果
类 xml设置sql参数时,只需要设置;需要修改的参数以及区别的条件即可,因为参数为map时,传入的是key的值,所以参数名称可以不需要和实体类一致,且参数个数可以自定义
@Test
public void test06(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("id",95001);
map.put("name","yangzixian");
mapper.updateBySingle(map);
sqlSession.commit();
sqlSession.close();
}
结果
修改成功
模糊查询
image-20200414181549343.png方式一,在定义sql语句时进行模糊设置
模糊设置@Test
public void test07(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List<User> byMoreInfo = mapper.findByMoreInfo("w");
for (User user : byMoreInfo) {
System.out.println(user.toString());
}
sqlSession.close();
}
此时传参,只需要正常设置条件即可
方式二,在定义sql语句时不进行模糊条件设置
不进行模糊设置@Test
public void test07(){
SqlSession sqlSession = mybatisUtil.getsqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
List<User> byMoreInfo = mapper.findByMoreInfo("%w%");
for (User user : byMoreInfo) {
System.out.println(user.toString());
}
sqlSession.close();
}
此时传参需要将通配符加上
网友评论