01-Mybatis原理介绍&主配置文件详解
一,什么是Mybatis
这里借用官网的一句话介绍什么是mybatis:mybatis是一款优秀的持久层框架,它支持定制化sql,存储过程以及高级映射,mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集。mybatis可以使用简单的xml或注解来配置和映射原生信息,将接口和java的POJOs(Plain Old Java Objects,普通的java对象)映射成数据库中的记录。
二,mybatis相对于jdbc有哪些优势
首先我们来看一看jdbc连接数据库的连接方法:
public class JdbcConnUtils {
private static final String Driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/test";
private static final String username = "root";
private static final String password = "root";
static Connection connection = null;
static{
//加载数据库驱动
try {
Class.forName(Driver);
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection conn(){
return connection;
}
public void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
if(null != resultSet){
try{
resultSet.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
if(null != preparedStatement){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null != connection){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public class JdbcTest {
public static void main(String[] args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "select * from user where name = ?";
JdbcConnUtils jdbcConnUtils = new JdbcConnUtils();
connection = jdbcConnUtils.conn();
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "qingzi");
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
User user;
System.out.println(resultSet.getString("id")+" "+resultSet.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
jdbcConnUtils.close(resultSet, preparedStatement, connection);
}
}
}
通过上面的一段jdbc连接数据代码,我们看有哪些不好的地方:
1.在创建connection的时候,存在硬编码的问题(也就是直接把连接信息写死,不方便后期维护)
2.preparedStatment对象在执行sql语句的时候存在硬编码问题
3.每一次在进行数据库连接之后都会关闭数据库连接,频繁的开启/关闭数据连接影响性能。
那我们来简单的说一下mybatis相对jdbc的优势:
1.mybatis是把连接数据库的信息都写在配置文件中,因此不存在硬编码的问题,方便后期维护。
2.mybatis执行的sql语句都是通过配置文件进行配置,不需要卸载java代码中
3.mybatis的连接池管理,缓存管理等让line及数据库和查询数据库效率更高。
三,mybatis框架原理介绍
就通过一张图来对mybatis的框架原理进行介绍:
四,Mybatis全局配置文件
SqlMapConfig.xml是Mybatis的全局配置文件,它的名称可以是任意,但是一般命名都为(SqlMapConfig)
4.1全局配置文件的内容和顺序
Properties(属性)
Settings(全局参数设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境信息集合)
environment(单个环境信息)
transactionManager(事务)
dataSource(数据源)
mappers(映射器)
4.2 常见配置详解
properties标签:
Mybatis可以通过改标签来读取java配置信息:
例如在工程中对数据源信息卸载db.properties文件中,可以同归哦properties标签来加载该文件。
db.properties:
db.properties=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=root
SqlMapConfig.xml使用properties标签:
<?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>
<!--通过properties标签,读取java配置文件的内容-->
<properties resource="db.properties"/>
<!-- 配置mybatis环境配置信息 -->
<environments default="developments">
<environment id="developments">
<!-- 配置jdbc的事务控制,由mybatis进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用mybatis连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${db.properties}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
配置中需要注意的几点
1.先加载properties中的property标签声明的属性
因此在property中的name属性的值和value比properties中的resource属性先加载。后加载的db.properties会覆盖于property加载的属性和值。
<configuration>
<properties resource="db.properties">
<property name="db.username",value="1234"/>
</properties>
</configuration>
2.再加载properties标签引入的java配置文件中的属性
3。parameterType的值会和properties的属性值发生冲突,因此,在properties文件里的内容命名最好加上db.代表是跟数据源相关的属性,这样就不容易跟以后的属性发生冲突。
settings标签:
该标签是mybatis的全局设置,该设置会影响mybatis的运行
一般我们使用该标签来开启二级缓存和懒加载。
以下是几张settings的配置项的说明:
typeAliases标签
该标签是对po类进行别名设置,这样,在后面使用po类的时候就可以直接通过别名引用,而不需要通过po类的全限定名来引用。这样可以提高我们的开发效率。
下面是Mybatis的默认提供的别名:
别名 | 映射类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
float | Float |
自定义单个别名:这种方式只能定义单个类的别名。
下面代码就是把com.qingzi.User类定义为user别名
<typeAliases>
<!-- 设置单个别名 -->
<typeAlias type="com.qingzi.User" alias="user"/>
</typeAliases>
自定义批量设置别名
下面代码就是把com.qingzi下所有类都声明别名,默认的别名就是类名(类名大小写都可以)
<!-- 设置别名 -->
<typeAliases>
<!-- 批量设置别名 -->
<!-- package:指定包名称来为该包下的po类声明别名,默认的别名就是类名(类名首字母大小 写都可以) -->
<package name="com.qingzi"/>
</typeAliases>
mappers标签:
该标签的作用是加载映射文件
方式一:
该方式是加载相对于类路径下的映射文件:
<mappers>
<mapper resource="sqlmap/User.xml" />
</mappers>
方式二:
该方式使用全限定路径
<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />
方式三:
该方式使用mapper接口的全限定类名
此方式要求:Mapper接口Mapper映射文件名称相同且在同一个目录下。
<mapper class="com.qingzi.mapper.UserMapper"/>
方式四:
该方式是加载制定包下的所有映射文件
此方式要求:Mapper接口Mapper映射文件名称相同且在同一个目录下
<package name="com.qingzi.mapper" />