mybatis第一天
1、什么是mybatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
优缺点:
优点:
简单易学:本身就很小且简单。
灵活:sql写在xml里,便于统一管理和优化。
解除sql与程序代码的耦合:sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的ORM字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供XML标签,支持编写动态sql。
缺点:对开发人员所写的SQL依赖很强。
2、为什么使用mybatis?
因为mybatis使用的人多…
3、mybatis入门
3.1、概述
要想使用mybatis,首先要在项目中引入mybatis的jar包,本文以maven项目为例。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
要想使用Mybatis与数据库互动,当然也要引入mysql-connector,同时引入junit进行单元测试。junit单元测试并没有系统的研究过,抽个时间研究下 写个博客TODO!
入门之前首先了解几个单词:
-
mybatis.xml:是Mybatis的全局配置文件,配置了Mybatis的运行环境,映射文件,别名等。
-
SqlSessionFactory:即会话工厂,线程安全,主要用于创建SqlSession对象。
-
SqlSession:即会话,mybatis提供的一个接口,所有的数据库操作都需要通过sqlsession进行。
-
Executor:执行器接口,是mybatis操作数据库底层的接口,Executor接口有两个执行器,一个是基本执行器接口,另一个是缓存执行器。
-
Mapped Statenment:mybatis的一个底层封装对象,包含了mybatis配置信息及SQL映射信息等。映射文件中的每一个SQL都对应一个Mapped Statement对象。
重点来搞懂Mapped Statenment,首先它是一个底层封装对象,每一条sql语句都会对应一个该对象。
Mapped Statenment对sql执行输入参数进行定义,包括集合、基本类型、pojo对象,Executor通过Mapped Statenment在执行SQL前,将输入的Java对象映射到SQL中,映射的原理还是通过JDBC底层的PreperedStatenment完成。
Mapped Statenment对SQL执行输出的结果集进行定义,包括集合、基本类型、pojo对象,
Executor还是通过Mapped Statenment在执行SQL后 将结果映射到Java对象中,映射的原理还是通过JDBC底层的PreperedStatenment完成。
准备工作完成,开搞!
首先创建数据库及用户表
drop database if exists mybatis;
CREATE database mybatis;
use mybatis;
create table t_user(
id bigint(20) PRIMARY KEY AUTO_INCREMENT comment '编号',
user_name varchar(20) not null,
cname varchar(200) not null
)
需求:实现对用户表的增删改查;
首先创建一个普通的maven项目 引入所需jar包;
3.2、编写代码
mybatis配置文件
<?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>
<settings>
<!-- 开启驼峰命名匹配方式 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--环境s 复数形式 说明可以配置多个环境
default 默认选中的环境 对应环境的唯一标识ID
-->
<environments default="mysql1">
<environment id="mysql1">
<!--transactionManager事务管理器
两种 JDBC和 MANAGED
JDBC:直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
MANAGED:这个配置从来都不提交和回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务的上下文)。
默认情况下他会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。
-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源
三种内建的数据源类型:type=[ UNPOOLED | POOLED | JNDI ]
如果将类型设置成UNPOOLED,mybaties会为每一个数据库操作创建一个新的连接,并关闭它。
该方式适用于只有小规模数量并发用户的简单应用程序上。
如果将属性设置成POOLED,mybaties会创建一个数据库连接池,连接池的一个连接将会被用作数据库操作。
一旦数据库操作完成,mybaties会将此连接返回给连接池。在开发或测试环境中经常用到此方式。
如果将类型设置成JNDI。mybaties会从在应用服务器向配置好的JNDI数据源DataSource获取数据库连接。
在生产环境中优先考虑这种方式。
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="mysql2">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="rt"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappings/User.xml" />
</mappers>
</configuration>
标签详解见↑配置文件注解。
user实体类
package cn.zsk.pojo;
/**
* @ClassName User
* @Description
* @Author RiTian
* @Date 2020/6/4 17:54
* @Version V1.0
**/
public class User {
private int id;
private String user_name;
private String cname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
user映射文件
<?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="test">
<!--查询-->
<select id="queryById" parameterType="int"
resultType="cn.zsk.pojo.User">
SELECT * FROM t_user WHERE id = #{value}
</select>
</mapper>
测试类
package cn.zsk.pojo;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @ClassName UserTest
* @Description
* @Author ZhaoShuai
* @Date 2020/6/4 17:41
* @Version V1.0
**/
public class UserTest {
private SqlSession sqlSession;
@Before
public void before() throws IOException {
//加载配置文件
InputStream stream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//获取sqlSessionFactory对象
SqlSessionFactory factory = builder.build(stream);
stream.close();
stream=null;
sqlSession = factory.openSession();
}
@After
public void after() {
if(sqlSession!=null){
sqlSession.close();
}
}
@Test
public void queryById() {
User user = sqlSession.selectOne("test.queryById",1);
System.out.println("user = " + user.getEmail());
}
}
文件目录