Mybatis

目录

  1. 配置文件

    DTD在页面中的作用

    ①DTD(Document Type Definition文档类型定义)是一组机器可读的规则,它们定义XML或HTML的特定版本中允许有什么,不允许有什么。在解析网页时,浏览器将使用这些规则检查页面的有效性并且采取相应的措施。(由DTD中定义的文档类型影响)

    ②DTD是对HTML文档声明,还会影响浏览器的渲染模式(工作模式)。(由页面中书写DTD的方式影响)

  2. 文件载入的方法

    1. 直接用IO流读取

    使用绝对路径:File f = new File("C:/test/com/aleixa/config/sys.properties");

    使用相对路径:File f = new File("com/alexia/config/sys.properties");

    InputStream is = new FileInputStream(f);

    2. 使用ClassLoader

    InputStream is = null; //相对路径

    方法1:is = this.getClass().getClassLoader().getResourceAsStream("com/alexia/config/sys.properties");

    方法2:is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/alexia/config/sys.properties");

    方法3:is = ClassLoader.getSystemResourceAsStream("com/alexia/config/sys.properties");

    3. 使用ResourceBundle

    ResourceBundle bundle = ResourceBundle.getBoundle("com.alexia.config.sys"); //资源捆绑

     

  3. 载入XML文件,获取SqlSession的方法

    1

    使用io读取

    // 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件)
    InputStream in = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml");
    // 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    // 3. 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
    SqlSession session = sqlSessionFactory.openSession();

     

    2

    使用reader读取

    Reader reader = Resources.getResourceAsReader("Configuration.xml");

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

    SqlSession sqlSession = sqlSessionFactory.openSession();

    其中第一行代码在类路径上加载配置文件,Resources 是 MyBatis 提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式

     

  4. XML文件

    XML中,

    首行是版本和encoding,

    随后dtd是书写xml的规范,

    接着是环境信息:开头<environments default="mysql_developer"> ;结尾:</environments>

    1、XXX.xml文件主要存放连接相关的信息,以及Mapper.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>
        <!-- 加载类路径下的属性文件 -->
        <!--<properties resource="db.properties"/>-->
    
        <!-- 设置一个默认的连接环境信息 -->
        <environments default="mysql_developer">
    
            <!-- 连接环境信息,取一个任意唯一的名字 -->
            <environment id="mysql_developer">
                <!-- mybatis使用jdbc事务管理方式 -->
                <transactionManager type="jdbc"/>
                <!-- mybatis使用连接池方式来获取连接 -->
                <dataSource type="pooled">
                    <!-- 配置与数据库交互的4个必要属性 -->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://10.20.127.83:5002/csc_pacific?characterEncoding=UTF-8"/>
                    <property name="username" value="csc_pacific"/>
                    <property name="password" value="csc_pacific"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!-- SQL代码和映射信息配置文件 -->
            <mapper resource="student/StudentMapper.xml"/>
        </mappers>
    </configuration>

    2、Mapper.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">
    <!-- namespace必须是唯一的,建议用该文件所在的包路径全类名 -->
    <mapper namespace="book.BookMapper">
    
        <!-- resultMap标签:映射实体与表
             type属性:表示实体全路径名
             id属性:为实体与表的映射取一个任意的唯一的名字
        -->
        <resultMap type="book.Book" id="bookMap">
            <!-- id标签:映射主键属性
                 result标签:映射非主键属性
                 property属性:实体的属性名
                 column属性:表的字段名
            -->
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="year" column="year"/>
            <result property="version" column="version"/>
            <result property="category" column="category"/>
        </resultMap>
    
        <insert id="add" parameterType="book.Book">
            INSERT INTO students (ID, NAME, SAL) VALUES (#{id},#{name},#{sal});
        </insert>
    
        <select id="getBook" parameterType="int" resultType="book.Book">
            <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
            select * from students where id = #{id}
        </select>
    
        <delete id="getBook" parameterType="int">
            delete from students where id = #{id}
        </delete>
    
        <select id="getAll" resultType="book.Book">
            <!-- #{id}:表示占位符,也就是调用时必须为其传一个id参数进来,注意是#不是$ -->
            select * from book
        </select>
    
    </mapper>
  5. 在全局配置文件中可以配置的信息主要包括如下几个方面:

    • properties --- 用于提供一系列的键值对组成的属性信息,该属性信息可以用于整个配置文件中。

    • settings --- 用于设置 MyBatis 的运行时方式,比如是否启用延迟加载等。

    • typeAliases --- 为 Java 类型指定别名,可以在 XML 文件中用别名取代 Java 类的全限定名。

    • typeHandlers --- 在 MyBatis 通过 PreparedStatement 为占位符设置值,或者从 ResultSet 取出值时,特定类型的类型处理器会被执行。

    • objectFactory --- MyBatis 通过 ObjectFactory 来创建结果对象。可以通过继承 DefaultObjectFactory 来实现自己的 ObjectFactory 类。

    • plugins --- 用于配置一系列拦截器,用于拦截映射 SQL 语句的执行。可以通过实现 Interceptor 接口来实现自己的拦截器。

    • environments --- 用于配置数据源信息,包括连接池、事务属性等。

    • mappers --- 程序中所有用到的 SQL 映射文件都在这里列出,这些映射 SQL 都被 MyBatis 管理。

  6. 获取连接对象的两种方法

    1、调用接口:SqlSession sqlSession = MybatisUtil.getSqlSession();

    package student;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.sql.Connection;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    
    /**
     * 工具类
     * @author AdminTC
     */
    public class MybatisUtil {
        private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        private static SqlSessionFactory sqlSessionFactory;
        /**
         * 加载位于src/mybatis.xml配置文件
         */
        static{
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        /**
         * 禁止外界通过new方法创建
         */
        private MybatisUtil(){}
        /**
         * 获取SqlSession
         */
        public static SqlSession getSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象为空
            if(sqlSession == null){
                //在SqlSessionFactory非空的情况下,获取SqlSession对象
                sqlSession = sqlSessionFactory.openSession();
                //将SqlSession对象与当前线程绑定在一起
                threadLocal.set(sqlSession);
            }
            //返回SqlSession对象
            return sqlSession;
        }
        /**
         * 关闭SqlSession与当前线程分开
         */
        public static void closeSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象非空
            if(sqlSession != null){
                //关闭SqlSession对象
                sqlSession.close();
                //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
                threadLocal.remove();
            }
        }
    //    /**
    //     * 测试
    //     */
    //    public static void main(String[] args) {
    //        Connection conn = MybatisUtil.getSqlSession().getConnection();
    //        System.out.println(conn!=null?"连接成功":"连接失败");
    //    }
    }
    

    2、通过io加载MyBatis的配置文件,构建 SqlSession 工厂

    // 1. 加载MyBatis的配置文件:mybatis.xml(它也加载关联的映射文件,也就是mappers结点下的映射文件)
            InputStream in = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml");
            // 2. SqlSessionFactoryBuidler实例将通过输入流调用build方法来构建 SqlSession 工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            // 3. 通过工厂获取 SqlSession 实例,SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
            SqlSession session = sqlSessionFactory.openSession();
            // 4. 准备基本信息
            // 4.1) statement: 用来定位映射文件(StudentMapper.xml)中的语句(通过namespace id + select id)
            String statement = "student.StudentMapper.getAll";
            // 4.2) paramter: 传进去的参数,也就是需要获取students表中主键值为1的记录
            String string = "id";
            // 5. SqlSession 实例来直接执行已映射的 SQL 语句,selectOne表示获取的是一条记录
            Map<Object, Object> map = session.selectMap(statement, string);

     

  7. SqlSession的方法:SqlSession session(自查)

  8.  

  9. ibatis和mybatis的区别

    1

    namespace在ibatis中不是必须的

    <?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="XXX.xxxxMapper">

    <select id="selectUser" parameterType="int"

    resultType="mybatis.demo.UserInfo">

    select * from UserInfo where userid =#{userid}

    </select>

    </mapper>

    2

    两个版本的 DTD 约束不同

    1、iBatis 配置文件的根元素是 <sqlMapConfig>,

    2、MyBatis 使用的是 <configuration>

    3

    <settings> 的用法发生了改变

    1、iBatis 中设置属性的方式:

    <settings props1="value1" props2="value2"… />

    2、MyBatis 中设置属性的方式:<settings>

    <setting name="props1" value="value1"/>

    <setting name="props2" value="value2"/>

    ……

    </settings>

    4

    配置事务管理器和数据源的方式

    1、iBatis 中配置事务管理器和数据源的方式

    <transactionManager type="JDBC" >

    <dataSource type="SIMPLE">

    <property name="JDBC.Driver" value="${driver}"/>

    <!-- 其他数据源信息省略 -->

    </dataSource>

    </transactionManager>

    2、MyBatis 中配置事务管理器和数据源的方式:<environments default="demo">

    <environment id="demo">

    <transactionManager type="JDBC"/>

    <dataSource type="POOLED">

    <property name="JDBC.Driver" value="${driver}"/>

    <!-- 其他数据源信息省略 -->

    </dataSource>

    </environment>

    </environments>

    5

    指定映射文件的方式

    1、iBatis 中指定映射文件的方式:

    <sqlMap resource=... />

    <sqlMap resource=... />

    <sqlMap resource=... />

    2、MyBatis 中指定映射文件的方式

    <mappers>

    <mapper resource=... />

    <mapper resource=... />

    </mappers>

    6

    MyBatis 中使用代码进行配置

    DataSource ds = …… // 获取一个 DataSource

    TransactionFactory txFactory = new JdbcTransactionFactory();

    Environment env = new Environment("demo", txFactory, ds);

    Configuration cfg = new Configuration(env);

    cfg.addMapper(UserInfoMapper.class);

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfg);

    7

    映射文件,首先是一系列的属性名称的改变,这些仅仅是名称的改变,用法和含义并没有发生变化:

    • 和全局配置文件一样,由于 DTD 约束发生变化,根元素也由原来的 <sqlMap> 调整为 <mapper>。

    • <select> 等元素的 parameterClass 属性改为了 parameterType 属性。

    • <select> 等元素的 resultClasss 属性改为了 resultType 属性。

    • <parameterMap> 等元素的 class 属性改为了 type 属性。

    • <result> 元素的 columnIndex 属性被移除了。

    • 嵌套参数由 #value# 改为了 #{value}。

    • <parameter> 等元素的 jdbcType 属性取值中,原来的 "ORACLECURSOR" 取值改为了现在的 "CURSOR","NUMBER" 取值改为了 "NUMERIC"。

    8

    存储过程的定义

    1、iBatis 中调用存储过程的方式:

    <procedure id="getValues" parameterMap="getValuesPM">

    { ? = call pkgExample.getValues(p_id => ?) }

    </procedure>

    2、MyBatis 中调用存储过程的方式:(在 MyBatis 中,<proccedure> 元素已经被移除,通过 <select>、<insert> 和 <update> 进行定义)

    <select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE">

    { ? = call pkgExample.getValues(p_id => ?)}

    </select>

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值