Mybatis搞一下
啥是Mybatis呢,简单来说,Mybatis就是一个持久层的框架,就是一个框架,他支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
初学一个东西可以从他的官网API快速入门,英语不好不用担心,官网支持中文API。
https://mybatis.org/mybatis-3/zh/index.html
映射
上面说到映射,首先搞懂什么是映射?为什么mybaits支持映射?
在mybatis里,只要sql返回的列名和Javabean中的属性一一致,mybatis就会帮我们把结果自动填到对应的Javabean中,而Javabean可以返回给调用者。我们经常通过取别名的方式让sql返回的列名和pojo的属性一致从而实现自动映射。比如
select id,stu_name as stuName from stu where id=#{id}
为什么要取别名?因为数据库中字段一般用_隔开,如stu_name,但是Javabean中是驼峰命名如stuName,如果两者不一致那就没办法映射,对应的属性也是null。
这里顺便普及几个名词的意思
- Data Access Object(DAOs):数据访问,对数据库执行增删改查
- POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans
- VO value object:值对象 通常用于业务层之间的数据传递,由new创建,由GC回收。
- SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)
- SSH是 struts+spring+hibernate的一个集成框架(较老)
- ORM(Object Relational Mapping)ORM就是对象关系匹配,是为了解决面向对象与关系数据库存在的互不匹配的问题。简单来说,就是把关系数据库中的数据转换成面向对象程序中的对象。
MVC中架构图
初学者总是搞不懂这些,这里把总结的图放在这里,希望能给大家加深印象
Mybatis的安装
这玩意安装啥呀,maven直接导入就行了昂
往pom.xml里插入这个就可以了
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
搭建Mybatis项目
创建一个普通的maven项目
在pom.xml中导入以下依赖
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/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.12</version>
</dependency>
贴一下我的sql
CREATE DATABASE `mybatis`;
USE `mybatis`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
`perms` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`pwd`,`perms`) values
(1,'马云','123456',NULL),
(2,'张三','123213',NULL),
(3,'李四','1z1z1z',NULL),
(4,'半仙','123355',NULL),
(5,'大仙','123255',NULL),
(6,'小仙','222255',NULL),
(7,'李武','546552',NULL),
(8,'刘霸','555599',NULL),
(9,'root','123456','user:add'),
(10,'feng','123456','user:update'),
(12,'root1','123422',NULL),
(13,'cici','213144',NULL);
后面的操作我都是基于这个数据库来的
核心配置文件 mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/feng/dao/UserMapper.xml"/>
</mappers>
</configuration>
mybatis工具类 MybatisUtils.java
package com.feng.utils;
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 java.io.IOException;
import java.io.InputStream;
//sqlSessionFactory --> sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们就可以从中获得 SqlSession 的实例了。
// SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
实体类 User.java
package com.feng.pojo;
//实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
这里如果觉得实体类过于繁琐,可以用lombok插件,虽然这个插件争议性很大,但我觉得仁者见仁智者见智吧,反正我挺喜欢的
Dao接口 UserDao.java
public interface UserDao {
List<User> getUserList();
}
接口实现类 UserMapper.xml
接口实现类由原来的UserDaoImpl转变为一个 Mapper配置文件.
<?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.feng.dao.UserDao">
<!--select查询语句-->
<select id="getUserList" resultType="com.feng.pojo.User">
select * from mybatis.user
</select>
</mapper>
测试类
前面导的junit包就在这里使用啦
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
查询成功
这里我们二话不说,直接使用了Mybatis,但是却不知道很多细节问题,下面补充一些理论细节。
Mapper文件详解
sql映射文件(UserMapper.xml)中各标签的含义及用法
sql映射文件,在这里面写sql语句,mybatis会帮我们执行这些sql语句
<!--
version="1.0" 声明用的xml版本是1.0
encoding="UTF-8" 声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--1、指定约束文件-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
约束文件作用
限制作用,检查当前文件中出现的标签属性是否符合mybatis的要求
-->
<!--
mapper:当前文件的根标签
namespace:命名空间(唯一),可以使自定义的字符串,要求必须是dao接口的全限定名称,全限定名就是绝对路径,比如com.feng.dao.UserMapper
用全限定名目的:通过mapper.xml和mapper.java进行关联。
-->
<!--
在当前文件中使用特定标签,表示数据库特定操作
<select>:表示查询
<update>:更新语句
<insert>:插入语句
<delete>:删除语句
-->
<select id="getUserList" resultType="com.feng.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.feng.pojo.User">
select * from mybatis.user where id = #{id}
</select>
<!--
select后面的id表示sql语句的唯一标识,mybatis根据这个id的值来定位要执行的sql语句,可以自定义,要求使用接口中的方法名称
resultType:sql语句执行后得到ResulSet,遍历这个ResulSet得到的java对象的类型值的类型的全限定名称,说白了就是Sql语句执行的返回值
parameterType:参数类型
-->
Mybatis配置文件详解
mybatis.xml或者mybatis-config.xml
可以看到configuration里有很多配置信息,包括这么多种
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
我们如果不知道当前标签该写什么或者可以写什么,我们可以先打一个左尖括号,idea会自动提示能打的标签。
<!--
和上面一样,1.0xml版本,utf8转码
-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--
mybatis-config的约束文件
-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--
<configuration>:根标签
-->
<environments default="development">
<!--
<environments>:环境配置,一般是数据库连接信息,
default:必须和某个environment的id值一样,告诉mybatis使用哪个数据库的配置信息
-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="******"/>
<property name="password" value="******"/>
</dataSource>
</environment>
</environments>
还是不放在代码块的注释里讲了,拎出来整理吧,讲几个常用的标签
环境配置(environments)
<environments> : 环境配置,一般是数据库连接信息,
default:必须和某个environment的id值一样,告诉mybatis使用哪个数据库的配置信息
<transactionManager type=“JDBC”/>:mybatis事务类型
type:JDBC(使用JDBC中Connection对象的commit,rollback事务处理)
<dataSource> :数据源,连接数据库
type:type="POOLED"表示使用连接池
<property>:表示连接数据库的具体信息
diver(驱动),user,username,password是固定的,不能自定义
属性(properties)
我们可以把数据库配置信息提取成一个db.properties,(老套路了,应该都懂吧),是不是猜到这个标签的作用了?
先整一个db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=*******
然后在mybatis.xml里这样用
<!--引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="pwd" value="******"/>
</properties>
这个主要是用来引入外部文件的,一般是配置文件。注意如果两个文件有相同字段,优先使用外部配置文件的。
类型别名(typeAliases)
别名,那就是取外号了,不管在哪个框架里,看到aliases其实大多是取别名的意思
比如我的Java类型太长了,可能是com.feng1.feng2.feng3.feng4.pojo.User怎么办,那代码不是丑的一批,又臭又长?这个时候就可以用这个标签了
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.feng.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,Mybatis会在包名下搜索需要的Javabean,比如扫描实体类的包,那他的默认别名就是这个类的类名(首字母小写)
<!--可以给实体类起别名-->
<typeAliases>
<package name="com.feng.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式。
如果实体类十分多,建议使用第二种。
第二种虽然是默认取名,但也可以自定义“外号”,只需要在实体类上加一个注解即可
@Alias("user")
public class User {
}
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 但这里的可以设置的东西可太多了,在这里不想赘述,贴一个官网API的网址
https://mybatis.org/mybatis-3/zh/configuration.html
其他配置
-
- mybatis-generator-core
- mybatis-plus
- 通用mapper
-
databaseIdProvider(数据库厂商标识)
映射器(mappers)重要
MapperRegistry:注册绑定我们的Mapper文件;
方式一: 【推荐使用】
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/feng/dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper class="com.feng.dao.UserMapper"/>
</mappers>
注意点:
- 接口和他的Mapper配置文件必须同名!
- 接口和他的Mapper配置文件必须在同一个包下!
方式三:使用扫描包进行注入绑定
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<package name="com.feng.dao"/>
</mappers>
注意点:
- 接口和他的Mapper配置文件必须同名!
- 接口和他的Mapper配置文件必须在同一个包下!
们的Mapper文件;
方式一: 【推荐使用】
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/feng/dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper class="com.feng.dao.UserMapper"/>
</mappers>
注意点:
- 接口和他的Mapper配置文件必须同名!
- 接口和他的Mapper配置文件必须在同一个包下!
方式三:使用扫描包进行注入绑定
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册!-->
<mappers>
<package name="com.feng.dao"/>
</mappers>
注意点:
- 接口和他的Mapper配置文件必须同名!
- 接口和他的Mapper配置文件必须在同一个包下!
本篇就到这里了,下一篇就从sqlsession继续讲一下mybatis的动态代理和生命周期,今天开始所有博客里的图已经放到了图床,觉得很好用,下次更新一篇关于博客图床的配置。