什么是Mybatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
优点:
- 与JDBC相比,减少了50%的代码量
- 最简单的持久化框架,简单易学
- SQL代码从程序代码中彻底分离出来,可以重用
- 提供XML标签,支持编写动态SQL
- 提供映射标签,支持对象与数据库的ORM字段关系映射
缺点:
- SQL语句编写工作量大,熟练度要高
- 数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异
1、创建普通的maven项目
2、导入相关的依赖
<dependencies>
<!--1、mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--2、连接mysql需要数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!--3、测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--4、log4j打印日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<!--可能出现问题说明:Maven静态资源过滤问题-->
<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>
3、创建数据库
CREATE TABLE `emp` (
`empno` int(10) NOT NULL,
`ename` varchar(20) DEFAULT NULL,
`job` varchar(20) DEFAULT NULL,
`mgr` int(10) DEFAULT NULL,
`hiredate` varchar(20) DEFAULT NULL,
`sal` int(10) DEFAULT NULL,
`comm` int(10) DEFAULT NULL,
`deptno` int(10) DEFAULT NULL,
PRIMARY KEY (`empno`),
KEY `FK_DEPTNO` (`deptno`),
CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4、创建实体类
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
private Integer deptno;
//无参、有参,set、get、toString
5、创建数据源db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://8.131.84.120:3306/demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username=root
password=root
6、配置文件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>
<!--
引入外部配置文件,类似于Spring中的property-placeholder
resource:从类路径引入
url:从磁盘路径或者网络路径引入
-->
<properties resource="db.properties"/>
<!--用来控制mybatis运行时的行为,是mybatis中的重要配置-->
<settings>
<!--设置字段和属性映射的时候是否是驼峰标识,例如 字段userName和user_name-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--类型别名-->
<typeAliases>
<typeAlias type="com.lian.pojo.Emp" alias="emp"/>
</typeAliases>
<!--
在实际的开发过程中,我们可能分为开发环境,生产环境,测试环境等等,每个环境的配置可以是不一样的
environment就用来表示不同环境的细节配置,每一个环境中都需要一个事务管理器以及数据源的配置
我们在后续的项目开发中几乎都是使用spring中配置的数据源和事务管理器来配置,此处不需要研究
-->
<!--default:用来选择需要的环境-->
<environments default="development">
<!--id:表示不同环境的名称-->
<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>
<!--将sql的映射文件适用mappers进行映射-->
<!--每一个dao都需要配置映射,有3种方式,class、resource、url-->
<!--
指定具体的不同的配置文件
class:直接引入接口的全类名,可以将xml文件放在dao的同级目录下,并且设置相同的文件名称,同时可以使用注解的方式来进行相关的配置
url:可以从磁盘或者网络路径查找sql映射文件
resource:在类路径下寻找sql映射文件
-->
<!--
当包含多个配置文件或者配置类的时候,可以使用批量注册的功能,也就是引入对应的包,而不是具体的配置文件或者类
但是需要注意的是,
1、如果使用的配置文件的形式,必须要将配置文件跟dao类放在一起,这样才能找到对应的配置文件.
如果是maven的项目的话,还需要添加以下配置,原因是maven在编译的文件的时候只会编译java文件
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2、将配置文件在resources资源路径下创建跟dao相同的包名
-->
<mappers>
<mapper class="empDao"/>
<!--<mapper resource="empDao.xml"/>-->
</mappers>
</configuration>
7、dao层
package com.lian.dao;
import com.lian.pojo.Emp;
import org.apache.ibatis.annotations.Param;
public interface EmpDao {
Integer addEmp(Emp emp);
Integer delEmp(@Param("empno") Integer empno);
Integer updateEmp(Emp emp);
Emp queryByEmpno(@Param("empno") Integer empno);
}
8、empDao.xml dao实现层
<?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="com.lian.dao.EmpDao">
<select id="queryByEmpno" resultType="com.lian.pojo.Emp">
select * from emp where empno = #{empno}
</select>
<insert id="addEmp" parameterType="com.lian.pojo.Emp">
insert into emp(empno,ename) values(#{empno},#{ename})
</insert>
<update id="updateEmp" parameterType="com.lian.pojo.Emp">
update emp set ename = #{ename} where empno = #{empno}
</update>
<delete id="delEmp" parameterType="int">
delete from emp where empno = #{empno}
</delete>
</mapper>
9、配置log4j日志
# 全局日志配置
log4j.rootLogger=INFO, stdout
# MyBatis 日志配置
log4j.logger.com.lian=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
10、测试类
import com.lian.dao.EmpDao;
import com.lian.pojo.Emp;
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 myTest {
/**
* 根据全局配置文件创建出SqlSessionFactory
* SqlSessionFactory:负责创建SqlSession对象的工厂
* SqlSession:表示跟数据库建议的一次会话
*/
@Test
public void test1(){
String resource = "mybatis-config.xml";
SqlSessionFactory sqlSessionFactory =null;
SqlSession sqlSession = null;
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取数据库的会话
sqlSession = sqlSessionFactory.openSession();
// 获取要调用的接口类
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
// 调用方法开始执行
Emp emp = mapper.queryByEmpno(7369);
System.out.println(emp);
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭会话
sqlSession.close();
}
}
//添加,增删改操作一定要提交事务
@Test
public void test2() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Integer integer = mapper.addEmp(new Emp(1,"dan"));
System.out.println(integer);
sqlSession.commit();
sqlSession.close();
}
//修改
@Test
public void test3() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Integer integer = mapper.updateEmp(new Emp(1,"蛋"));
System.out.println(integer);
sqlSession.commit();
sqlSession.close();
}
//删除
@Test
public void test4() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Integer integer = mapper.delEmp(1);
System.out.println(integer);
sqlSession.commit();
sqlSession.close();
}
}