MyBatis介绍及入门

MyBatis

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,半自动ORM(框架)。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
官网:http://www.mybatis.org/mybatis-3/
Github:https://github.com/mybatis/mybatis-3
MyBatis介绍及入门_第1张图片
MyBatis介绍及入门_第2张图片
mybatis的执行过程:
①首先加载核心xml文件
②通过xml文件,能得到sqlSessionFactory
③通过工厂产生sqlSeesion(这个对象不能操作数据库)
④sqlSeesion对象会产生一个解析器(excutor),进而得到一个 mappedSatement对象(Satement的子类)执行sql语句

MyBatis核心概念

名称 意义
Configuration 管理xml全局配置关系类
SqlSessionFactory Session管理工厂接口
Session SqlSession是一个面向用户(程序员)的接口,提供了很多操作数据库的方法
Executor 执行器是一个接口(基本执行器、缓存执行器),SqlSession内部通过执行器操作数据库
MappedStatement 底层封装对象, 对操作数据库存储封装,包括 sql语句、输入输出参数
StatementHandler 具体操作数据库相关的handler接口
ResultSetHandler 具体操作数据库返回结果的handler接口

Configuration(也就是配置xml文件)

配置顺序不可以发生改变
MyBatis介绍及入门_第3张图片

属性名 作用
属性(properties) 系统属性占用配置
设置(settings) 修改MyBatis在运行时的行为方式
类别名(typeAliases) 为Java类型建立别名(简称)
类型处理器(typeHandlers) 将预编译语句(PreparedStatement)或结果集(ResultSet)中的JDBC类型转化成Java类型
对象工厂(objectFactory) 提供默认构造器或者执行构造参数初始化目标类型的对象
插件(plugins) MyBatis提供插件的方式来拦截映射
环境(environments) MyBatis允许配置多个环境变量,可以包括mysql oracle等等
环境变量(environment) 配置环境
事务管理器(transactionManager) 事务管理
数据源(dataSource) 数据源有两种:①jndi,由tomcat容器分配的数据源 ②pooled,mybatis自带数据源
数据库标识提供商(databaseIdProvider) 数据库标识提供商
SQL映射器(mappers) SQL映射文件

代码:

首先导入需要的jar包
MyBatis介绍及入门_第4张图片
配置 Configuration

<?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">

<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
    <!--引入配置文件-->
    <properties resource="database.properties"></properties>
    <typeAliases>
        <!--给当前包下所有类配置别名,别名就是相应类的类名-->
        <package name="com.offcn.entity"></package>
        <!--给指定类配置别名
        <typeAlias type="com.offcn.entity.User" alias="User"></typeAlias>
        -->
    </typeAliases>
    <!--开始配置环境,可以配置多个环境,可以包括mysql oracle等等-->
    <environments default="development">
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源-->
            <!--数据源有两种:①jndi,由tomcat容器分配的数据源
                              ②pooled,mybatis自带数据源-->
            <dataSource type="POOLED">
                <property name="url" value="${url}"/>
                <property name="driver" value="${driver}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

封装一个得到Session的工具类

/**
 * 得到Session的工具类
 */
public class SqlSessionUtil {
    private static SqlSessionUtil sqlSessionUtil;
    private SqlSession sqlSession;

    private SqlSessionUtil(){
        //读取核心配置文件
        try {
            String path = "mybatis-config.xml";
            //得到一个输入流对象
            InputStream in = Resources.getResourceAsStream(path);
            //得到sqlSessionFactory
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            //得到sqlSession,true代表默认提交事务
            sqlSession = ssf.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //提供一个对外的方法得到这个对象
    public static synchronized SqlSessionUtil getSqlSessionUtil(){
        if (sqlSessionUtil==null){
            //锁类的原因:保证永远只有一个这样的类(在java jvm 实例化对象有四个步骤),
            synchronized (SqlSessionUtil.class){
                if (sqlSessionUtil==null){
                    sqlSessionUtil = new SqlSessionUtil();
                }
            }
        }
        return sqlSessionUtil;
    }
    public SqlSession getSqlSession() {
        return sqlSession;
    }
}

第一种:配置与数据库语句相关的xml文件实现数据的增删改查

首先配置与数据库语句相关的xml文件(我这里取名为UserMapper.xml)

<?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>
    <!--查询总记录数-->
    <select id="selectCount" resultType="int">
        select count(1) from smbms_user
    </select>
    <!--全查-->
    <select id="selectAllUser" resultType="User">
        select * from smbms_user
    </select>
    <!--模糊查询-->
    <select id="selectLikeUser" resultType="User" parameterType="String">
        select * from smbms_user where userName like concat('%',#{userName},'%')
    </select>
    <select id="selectUserById" resultType="User" parameterType="int">
        select * from smbms_user where id=#{id}
    </select>
    <!--修改 根据id修改名字-->
    <update id="updateUserById" parameterType="User">
        update smbms_user set userName=#{userName},userPassword=#{userPassword} where id=#{id}
    </update>
    <!--删除 根据id删除记录-->
    <update id="deleteUserById" parameterType="int">
        delete from smbms_user where id=#{id}
    </update>
    <!--增加-->
    <update id="addUser" parameterType="User">
        insert into smbms_user (userName,userPassword) values (#{userName},#{userPassword})
    </update>
</mapper>

然后配置 Configuration

    </environments>
    <!--与数据库语句相关的xml文件相关联(可配置多个),resource代表路径    -->
   <mappers>
        <mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
    </mappers>

最后测试

            SqlSession sqlSession = SqlSessionUtil.getSqlSessionUtil().getSqlSession();
            //返回一列
            int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectCount");
            System.out.println(num);
            //返回多列
            List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectAllUser");
            for (User u:list) {
                System.out.println(u.getUserName()+"\t"+u.getUserPassword());
            //传参数
            List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectLikeUser", "张");
            for (User u : list) {
                System.out.println(u.getUserName() + "\t" + u.getUserPassword());
            } 
            int upd = sqlSession.update("com.offcn.dao.UserMapper.updateUserById", user);
            if(upd>0){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }

第二种:用注解的方式实现数据的增删改查(这里不需要与数据库语句相关的xml文件)

创建一个java文件(我这里取名为UserMapper),与数据库语句相关的xml文件中的SQL语句按如下的格式写入UserMapper

@Mapper
public interface UserMapper {
    //全查
    @Select("select * from smbms_user")
    public List<User> selectAllUser();
}

配置 Configuration

    </environments>
    <!--    @注解的方式 -->
        <mappers>
        <mapper class="com.offcn.dao.UserMapper" />
    </mappers>

测试

            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = userMapper.selectAllUser();
            for (User u:users) {
                System.out.println(u.getUserName()+"\t"+u.getUserPassword());
            }

第三种:Java文件与数据库语句相关的xml文件相结合实现数据的增删改查

Configuration配置与第一种相同,测试方法与第二种相同,区别在于只需要在创建的java文件里(我这里是UserMapper接口),写与数据库语句相关的xml文件里所写的方法(方法名必须一致),如下:

    public List<User> selectAllUser();
    public List<User> selectLikeUser(String userName);
    public User selectUserById(int id);
    public int selectCount();
    public User updateUserById(int id);
    public int deleteUserById(int id);
    public int addUser(User user);

你可能感兴趣的:(JAVA框架,MyBatis)