1、mybatis的优点:
1.不屏蔽SQL,自己写SQL语句,可以优化性能
2.动态SQL,自己根据不同条件组装SQL,可读性和可维护性高
3.Mapper接口编程,一个接口和一个XML创建映射器。
2、四个核心组件:
①、SqlSessionFactoryBuilder 根据配置器生成SqlsessionFactory
②、SqlSessionFactory 是一个工厂接口,其有两个实现子类,第一个是SqlSessionManager通常使用在多线程中,第二个是DefaultSqlSession,一般会使用第二个。因为这个接口的唯一作用就是生产SqlSession,所以是以单例模式来实现这个接口。
注意:SqlSessionFactory 可以通过XML和JAVA代码的形式创建,推荐XML,有利于后期的维护和修改。创建代码在配置加密过的数据库用户需要解密成明文的时候用到
③、Sqlsession:发送SQL语句执行,并返回结果。
④、SQL Mapper 映射器:作用同③,以一个接口和一个XML文件(或者注解)组成,推荐XML文件配置的方式。
配置如下内容:描述映射规则,提供SQL语句,配置缓存,提供动态SQL。
主要作用,把SQL返回的结果映射成一个POJO(数据表对应的JAVA类),或者把POJO的数据插入数据库。
3、mybatis的xml文件分为两类,一类是配置文件,配置基础的运行环境;另外一类是映射文件,配置映射关系
①、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>
<typeAliases><!-- 别名 -->
<typeAlias alias="role" type="com.POJO.Role"/>
</typeAliases>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/chapter3"/>
<property name="username" value="root"/>
<property name="password" value="1234567"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/MapperInf/RoleMapper.xml"/>
<!-- <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> -->
</mappers>
</configuration>
a.其中元素为一个类定义一个别名,然后可以一直使用这个别名
b.配置环境,这里配置了数据库,配置的事务管理器,采用JDBC的管理器方式。
c.配置数据库,连接池类型
d.配置映射器。这里mapper引入一个xml文件,这个com/MapperInf/RoleMapper.xml文件,用这个XML文件配置映射器。
②、XML映射文件
<mapper namespace="com.mapper.MessageMapper">
<select id="getMessge" parameterType="int" resultType="Message">
select ID,
COMMAND, DESCRIPTION, CONTENT from message where id = #{id}
</select>
</mapper>
a.通过namespace找到接口
b.id映射接口的某个方法,parameterType是这个方法的参数,resultType映射返回结果的类型,SQL语句中 #{id}是方法的参数。
比如这里通过namespace找到下面的接口,然后映射它的方法MessageMapper。
public interface MessageMapper {
public Message getMessage(int id);
}
4、生命周期:每一个对象应该存活的时间,对象用完应该被JVM销毁。
①、SqlSessionFactoryBuilder 存活在创建SqlSessionFactory 的方法中,之外应该被销毁
②、SqlSessionFactory可以当做是一个数据库的连接池,用来创建Sqlsession,所以SqlSessionFactory的生命周期应该等同于整个MyBatis的生命周期。创建多个SqlSessionFactory,明显会浪费资源,所以应该让SqlSessionFactory以单例模式的形式存在。
③、Sqlsession可以当做一个数据库连接请求(connection对象),所以在业务请求完成后应该关闭这个对象。try…catch…finally
④、Mapper对象是连接中的一个SQL业务请求,完成了请求中的业务请求,就应该关闭这个对象
5、基于xml方式的mybatis入门实例:
JAVA项目结构:
①RoleMapper.java是一个映射接口
package com.MapperInf;
import java.util.List;
import com.POJO.Role;
public interface RoleMapper {
public int insertRole(Role role);
public int deleteRole(Long id);
public int updateRole(Role role);
public Role getRole(Long id);
public List<Role> findRoles(String roleName);
}
这段代码对应的是对Role的数据操作方法
②RoleMapper.xml是对应映射接口的具体数据操作方法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="com.MapperInf.RoleMapper">
<insert id="insertRole" parameterType="role">
insert into t_role(role_name, note) values(#{roleName}, #{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from t_role where id= #{id}
</delete>
<update id="updateRole" parameterType="role">
update t_role set role_name = #{roleName}, note = #{note} where id= #{id}
</update>
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select>
<select id="findRoles" parameterType="string" resultType="role">
select id, role_name as roleName, note from t_role
where role_name like concat('%', #{roleName}, '%')
</select>
</mapper>
a.通过namespace找到接口
b.id映射接口的某个方法,parameterType是这个方法的参数,resultType映射返回结果的类型,SQL语句中 #{id}是方法的参数。
这里通过找到public interface RoleMapper这个接口,
<insert id="insertRole" parameterType="role">
insert into t_role(role_name, note) values(#{roleName}, #{note})
</insert>
就映射了public int insertRole(Role role);这个方法。
③、SqlSessionFactoryUtils.java是一个单例模式的工厂类,输出sqlSessionFactory。
package com.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory= null;
//私有化构造方法
private SqlSessionFactoryUtils(){}
/*单例模式*/
public static SqlSessionFactory getSqlSessionFactory() {
if (sqlSessionFactory==null) {
synchronized (SqlSessionFactoryUtils.class) {
if (sqlSessionFactory==null) {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().
build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
}
System.out.println("返回sqlSessionFactory");
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if (sqlSessionFactory==null) {
getSqlSessionFactory();
}
System.out.println("返回SqlSession");
return sqlSessionFactory.openSession();
}
}
④、Role.java一个对应数据表内容的实体类
package com.POJO;
public class Role {
private Long id;
private String roleName;
private String note;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
⑤、mybatis-config.xml,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>
<typeAliases><!-- 别名 -->
<typeAlias alias="role" type="com.POJO.Role"/>
</typeAliases>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/chapter3"/>
<property name="username" value="root"/>
<property name="password" value="1234567"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/MapperInf/RoleMapper.xml"/>
<!-- <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> -->
</mappers>
</configuration>
a.其中元素为一个类定义一个别名,然后可以一直使用这个别名
b.配置环境,这里配置了数据库,配置的事务管理器,采用JDBC的管理器方式。
c.配置数据库,连接池类型
d.配置映射器。这里mapper引入一个xml文件,这个com/MapperInf/RoleMapper.xml文件,用这个XML文件配置映射器。