文章目录
JDBC的缺点
JDBC步骤
在介绍Mybatis框架之前,我们先来回顾一下JDBC编程的步骤。首先我们通过maven引入jar包:mysql-connecto-java。
随后的步骤:
- 1、加载MySQl驱动:com.mysql.jdbc.Driver
- 2、连接数据库(url、name、passwd) 用DriverManager.getConnection获取Connectio对象实例
- 3、获取Statement对象:Connection.createStatement
- 4、可以进行CRUD操作
- 5、查询操作:返回ResultSet结果集进行处理
- 6、关闭资源
JDBC存在的问题
从上图我们可以看出,传统的JDBC编程存在以下问题
- 1、在JDBC编程操作数据库前进行连接,操作后需关闭子连接,频繁的连接释放在高并发时会影响系统性能(使用连接池:连接复用)。
- 2、SQL语句硬编码在Java代码中,需求改变进而会改变Java代码本身(将SQL和Java代码分离,将SQL语句放在xml配置文件,需求改变只需要修改配置文件即可)。
- 3、返回结果集存在硬编码(将数据库中的数据映射成Java对象)。
需要同时解决以上问题,便引出了Mybatis框架,下面我们一起来学习一下。
Mybatis
mybatis简介
MyBatis 是一款优秀的持久层框架
特征:
1、支持自定义 SQL(非自定义SQL:hebineate)、存储过程以及高级映射。
2、MyBatis解决JDBC 代码以及设置参数和获取结果集的工作。
3、MyBatis通过XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis原理
单看上面这张图,大家可能有些不理解,下面我们以数据库中的一张表为例来做一个实例。
mybatis应用demo
引入依赖
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
以存放在classtest库中的student表为例
mysql> SELECT * FROM student;
+-----+--------+------+------+
| SID | Sname | Sage | Ssex |
+-----+--------+------+------+
| 1 | 赵雷 | 20 | 男 |
| 2 | 钱电 | 20 | 男 |
| 3 | 孙凤 | 21 | 男 |
| 4 | 吴兰 | 18 | 女 |
+-----+--------+------+------+
4 rows in set (0.24 sec)
全局配置文件(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">
<!--id:环境的唯一标识-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源类型-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/classtest?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="z2001l0425"/>
</dataSource>
</environment>
</environments>
</configuration>
pojo类(student.java)
/**
* 和数据库中的Student表对应
*/
public class Student {
private Integer SID;
private String Sname;
private String Ssex;
private Integer Sage;
//这里省略了getter和setter方法,需要自己加上去
}
Mapper接口文件(studentMapper.java)
public interface StudentMapper {
public Student selectStudentById(Integer id);
public int deleteStudentById(Integer id);
}
配置mapper.xml文件(studentMapper.xml)
mapper.xml配置文件是用来配置SQL语句的,mapper接口文件中每一个方法在mapper.xml文件中对应唯一的Statement(sql)
<?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,命令空间:保证命名空间唯一,一般是对应的mapper.java的包全路径-->
<mapper namespace="com.tulun.test.mapper.StudentMapper">
<!--
selectStudentById
select * from Student where SID = XXX
-->
<!--
select标签:查询操作
id属性:statement的id,用于表示定义的SQL,在同一个命名空间中id是不允许重复的
#{XXX}:输入参数的占位符,避免SQL注入
parameterType:输入参数类型
resultType:指定结果集类型
-->
<select id="selectStudentById" parameterType="int" resultType="com.tulun.test.pojo.Student" >
select * from Student where SID = #{id}
</select>
<delete id="deleteStudentById" parameterType="int">
delete from Student where SID = #{id}
</delete>
</mapper>
修改全局配置文件
在创建好mapper.xm文件后,需要在全局配置文件中引入一下mapper配置文件。在environment标签之后添加。
<!--引入mapper配置文件-->
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
<mapper resource="mapper/TeacherMapper.xml"/>
</mappers>
执行查询操作
public static void select(){
String resource = "mybatis-config.xml";
try {
//mybatis提供resource类来获取配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过反射机制来获取mapeer实例
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectStudentById(1);
System.out.println(student);
} catch (IOException e) {
e.printStackTrace();
}
}
mybatis的使用步骤:
1、配置mybatis-config.xml全局配置文件(数据源、外部mapper)
2、创建SQLSessionFactory
3、通过SQLSessionFactory来创建SQLSession
4、通过SQLSession进行CRUD操作
5、关闭会话 SQLSession.close()操作
显示日志
可以引入log4j日志框架
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
在资源路径下创建log4j.properties文件
## debug 级别
log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t] [%c] [%p] - %m%n
log4j.logger.com.tulun=DEBUG /
##输出sql 语句
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG</strong>
创建完成后会在程序执行过程中打印出日志,方便排查错误。
mybatis配置详解
全局配置文件:mybatis-config.xml
properties:读取配置属性
如果不止在一个地方进行了配置,那么mybatis会按照这样的顺序加载:
- 1、首先读取在properties元素体内指定的属性
- 2、根据properties元素中的resource属性读取类路径下属性文件,或根据url属性指定的路径读取属性文件,并会覆盖之前读取的同名的属性
- 3、最后会读取作为方法参数传递的属性,并覆盖之前的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
setting设置
这个暂时这里没有用到
<!--settings:全局的设置信息-->
<settings>
<!--二级缓存/懒加载-->
<!--二级缓存的配置信息-->
<setting name="cacheEnabled " value="true"/>
</settings>
设置配置信息,在mybatis运行时替换相关的配置或者是打开或关闭等相应操作
typeAliases:类型别名
<typeAliases>
<!--对于单个类取别名-->
<typeAlias type="com.tulun.pojo.Student" alias="student"/>
<!--批量取别名:student-->
<package name="com.tulun.pojo"/>
</typeAliases>
Mapper:映射
<!--引入mapper配置文件:和spring整合时,可以省略-->
<mappers>
<!--resource:配置单个映射文件,mapper.java和mapper.xml配置文件可以不再同一路径下,且名称可以不同-->
<mapper resource="mapper/StudentMapper.xml"/>
<!--class:映射单个文件 ,指定的接口文件要遵循指定规则:mapper.xml和mapper.java必须是同一路径下,且名称保持相同-->
<mapper class="com.tulun.mapper.StudentMapper"/>
<!--package:批量的映射文件处理,遵循指定规则:mapper.xml和mapper.java必须是同一路径下,且名称保持相同-->
<package name="com.tulun.mapper"/>
</mappers>
这里是:mybatis的官方文档大家可以以参考。