1.1MyBatis概述
MyBatis是数据访问层(Dao)层的框架,解决了JDBC的代码冗余,重复,不灵活等缺点,是一个SQL
Mapper For Java(SQL映射)框架,框架一般是jar包形式存在(包含各种配置文件)。
学习MyBatis之前,我们需要先了解ORM(对象关系映射)思想
O:java虚拟机中的对象
R:关系型数据库
M:将关系型数据库的内容关联到Java虚拟机中的对象的映射
2.1MyBatis开发环境配置及创建项目
新建项目之后,对idea进行相关设置,以下都需要注意一下
创建Maven项目
这里的maven项目建议不使用模板,直接点下一个
这样就把一个Maven项目创建好了
之后再在pom.xml配置文件中写入Mybatis相关的依赖
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
</dependencies>
再重新加载一下maven项目
2.2MyBatis核心配置文件
maven项目创建好之后,我们开始我们的MyBatis学习之旅,首先介绍MyBatis核心配置文件,Mybatis核心配置文件是一个Xml文
件,我们需要手动在主程序目录下的resources资源文件夹下新建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">
<!-- jdbc事务管理方式-->
<transactionManager type="JDBC"/>
<!-- 使用数据库链接池-->
<dataSource type="POOLED">
<!-- 驱动名称-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库链接地址-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<!-- 数据库用户名-->
<property name="username" value="root"/>
<!-- 密码-->
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
2.3MyBatis的Mapper接口和映射文件
Mybatis中的Mapper接口相当于dao(持久层),但是与之不同的是Mapper接口不需要提供实现类。
首先在数据库中创建一个t_user表
CREATE TABLE t_user(
id INT AUTO_INCREMENT,
userName VARCHAR(20) NOT NULL,
psd VARCHAR(20) NOT NULL,
age INT,
sex CHAR,
email VARCHAR(25),
PRIMARY KEY(id)
)
再创建一个对应实体类,包括构造方法,set,get方法及toString方法
package com.yhg.pojo;
public class User {
private int id;
private char userName;
private char psd;
private int age;
private char sex;
private char email;
public User(int id, char userName, char psd, int age, char sex, char email) {
this.id = id;
this.userName = userName;
this.psd = psd;
this.age = age;
this.sex = sex;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getUserName() {
return userName;
}
public void setUserName(char userName) {
this.userName = userName;
}
public char getPsd() {
return psd;
}
public void setPsd(char psd) {
this.psd = psd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public char getEmail() {
return email;
}
public void setEmail(char email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName=" + userName +
", psd=" + psd +
", age=" + age +
", sex=" + sex +
", email=" + email +
'}';
}
}
实体类创建完成后,我们再来创建Mapper接口,mapper接口相当与dao(持久层),所以需要建一个专门存放mapper接口的
包,同时一张表对应一个mapper接口。mybatis之所以需要建mapper接口,是因为mybati会根据mapper
接口匹配相应的映射文件,
映射文件会将mapper的方法名作为id唯一标识来对数据库的增删改查,这样就实现了mapper-映射文件-
数据库,如何java对
象调用mapper接口中的方法,就实现了java对象-映射文件-数据库的一致关系,这就是ORM(对象关系映射)思想。
mybatis映射文件需要在rescources目录下,注意下,映射文件的命名最好是XXX+Mapper.xml,我这里以UserMapper.xml为例,由
于后面会有许多Mapper接口,所以为了后面开发的方便,最好在resources文件夹下,创建一个专门存放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中的参数为包名+mapper接口的名字-->
<mapper namespace="com.yhg.mapper.UserMapper">
<!--对应于Mapper接口中的int insertUser();-->
<insert id="insertUser">
m insert into t_user values (null,'张三','123456',18,'男','zhangsan@qq.com')
</insert>
</mapper>
mapper映射文件配置好之后,还需要修改mybatis配置文件中的映射。
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
2.4第一个Mybatis程序的增删查改
Mybatis核心配置文件配置好之后,我们需要在test目录下新建一个测试类来测试第一个mybatis程序的增删查改
①增加数据
首先在UserMapper接口中定义insertUser()方法,
int insertUser();
再在mapper映射文件中定义插入表数据的语句,id的参数为mapper接口中的插入方法名
<!-- 增加数据-->
<insert id="insertUser">
insert into t_user values (null,'张三','123456',18,'男','zhangsan@qq.com');
</insert>
增加数据的测试类代码
package com.yhg;
import com.yhg.mapper.UserMapper;
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.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest {
@Test
public void mybatisTest() throws IOException {
//加载核心配置文
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder= new SqlSessionFactoryBuilder();
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
//获取sqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取mapper接口对象
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
//测试功能
int result=mapper.insertUser();
//提交事务
sqlSession.commit();
System.out.println("result"+result);
}
}
②删除数据
首先在UserMapper接口中定义deleteUser()方法,
int deleteUser();
再在mapper映射文件中定义删除表数据的语句,id的参数为mapper接口中的删除方法名
<!-- 删除数据-->
<delete id="deleteUser">
delete from t_user where userName='张三'
</delete>
测试类中调用mapper接口中的deleteUser()方法,然后mapper映射文件就会按照方法名作为id匹配相应的
③修改数据
首先在UserMapper接口中定义updateUser()方法,
int updateUser();
再在mapper映射文件中定义修改表数据的语句,id的参数为mapper接口中的修改方法名
<!-- 修改数据-->
<update id="updateUser">
update t_user set psd="111111" where userName='张三'
</update>
④查询数据
首先在UserMapper接口中定义selectAllUser()方法,
User selectAllUser();
再在mapper映射文件中定义修改表数据的语句,id的参数为mapper接口中的查询方法名
<!--查询所有数据-->
<select id="selectAllUser" resultType="com.yhg.pojo.User">
select * from t_user
</select>
2.5测试项目的优化
①事务的自动提交功能
由于我们在测试项目中,每次执行sql语句,都需要手动提交事务,有些麻烦,这时我们就需要设置自动提交事务的方式
SqlSession sqlSession=sqlSessionFactory.openSession(true);
②加入日志功能
我们每次执行项目的时候想观察执行的sql语句,我们需要加入日志功能调试,在pom.xml配置文件中导入日志功能的依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
然后创建日志依赖的配置文件,log4j.xml,注意日志依赖的配置文件必须存放在src/main/resources目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
里面的内容不需要更改,但是需要注意的是日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
2.5MyBatis核心配置文件详解及相关概念(了解)
①enviroment标签
enviroment:设置多个链接数据库的环境
属性:default:设置默认使用的环境的id
enviroments标签:配置某个具体的环境
属性:id:设置某个具体环境的唯一标识
transactionManager标签:设置事务管理方式
属性:type=JDBC/MANAGED
JDBC:原生事务管理方式,事务的提交或回滚需要手动处理
MANAGED:被管理的事务方式,如Spring
②引入properties文件
在配置核心配置文件时,我们需要设置链接数据的一些信息,而且信息都比较长,不利于后期修改
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 数据库链接地址-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<!-- 数据库用户名-->
<property name="username" value="root"/>
<!-- 密码-->
<property name="password" value="1999"/>
为了简短后期开发方便我们可以导入properties文件。首先我们先新建一个存放链接数据库信息的properties文件,注意位置存放在resources文件夹下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=1999
之后我们在mybatis核心配置文件中引入properties文件
<!-- 导入properties文件-->
<properties resource="jdbc.properties"></properties>
再将链接数据库的信息的中的value值修改为properties文件中设置的键值对
<property name="driver" value="${jdbc.driver}"/>
<!-- 数据库链接地址-->
<property name="url" value="${jdbc.url}"/>
<!-- 数据库用户名-->
<property name="username" value="${jdbc.username}"/>
<!-- 密码-->
<property name="password" value="${jdbc.password}"/>
③设置类型别名
我们在写mapper映射文件时,查询结果集时都需要设置resultType,而且值是包名加类名,有些时候会很长,为了后期开发简
便,我们可以在mybatis核心配置文件中设置类型别名
第一种方式:typeAliases标签
<!-- 设置类型别名-->
<typeAliases >
<!--typeAlias:设置某个类型别名,type:需要设置别名的类型,alias:设置类型别名,注意alias的值不区分大小写,可默认不写,默认值为类名 -->
<typeAlias type="com.yhg.pojo.User" alias="User"></typeAlias>
</typeAliases>
第二中方式:package标签
<typeAliases >
<!-- <typeAlias type="com.yhg.pojo.User" alias="User"></typeAlias>-->
<!-- package标签设置该包下的所有类的别名都为默认别名,即类名,且不区分大小写-->
<package name="com.yhg.pojo"></package>
</typeAliases>
之后我们把mapper映射文件中的resultType修改为设置的别名
<select id="selectById" resultType="user">
select * from t_user where id=2
</select>
④mapper映射标签
在mybatis中,一张表对应一个mapper接口对应一个mapper映射文件,这个对应关系需要我们使用核心配置文件中的mppaer标签来设置,但是后面开发我们可能会有很多表,也就是会有很多mapper标签,为了简化后期开发,我们也可以使用package标签来链接这种对应关系,需要注意的是,在使用package标签时,我们要注意俩个原则1.mapper所在的包要和映射文件所在的包一致。2.mapper接口和映射文件接口一致
注意:在resourses文件夹下创建包是以斜线来创建的,然后把之前建的mapper映射文件全部放在这个包下,同时之前的Mappers文件夹也可以删除了。
<mappers>
<package name="com.yhg.mapper"/>
</mappers>