zoukankan      html  css  js  c++  java
  • MyBatis(三)——核心对象与配置属性

    一、Java代码中的核心对象

    1.SqlSessionFactory

    • 它是单个数据库映射关系经过编译后的内存镜像。
    • 顾名思义,这个对象的作用是创建SqlSession对象。
    • 线程安全,被创建后整个应用的执行期间都存在,不用重复创建,单例。

    一般只需要写两句固定代码

        InputStream is=Resources.getResourceAsStream("mybatis-config.xml");//读取配置文件
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);//构建工厂

    2.SqlSession

    • 应用程序与持久层交互的单线程对象,作用是执行持久化操作,即操作数据库
    • 底层封装了JDBC连接,可以直接使用实例来执行已映射的SQL语句。
    • 单线程不可共享,不安全,使用后及时关闭,close。
    SqlSession sqlSession=sessionFactory.openSession(true);//创建sqlSession

    没有参数默认false,事务需要手动提交,传入true执行SQL语句自动提交

    SqlSession对象有很多方法,指定XML配置文件中的SQL语句的id,并传参来执行SQL语句。例如

    int insert/update/delete(String statement,Object parameter);

    int insert/update/delete(String statement);

    <T> T selectOne(String statement);

    <E> list<E> selectList(String statement,Object parameter);

    ...等等类似写法

    statement是配置文件中<insert>元素的id,parameter是插入所传的参数,返回查询结果或者增删改影响的行数。

    个人不用上面这些方法对操作SQL语句,更多的是用SqlSession对象用代理的方法<T> T getMapper<Class<T>type>获取Mapper对象,直接调用mapper的方法。

    还有其他方法

    void commit();//提交

    void rollback();//回滚

    void close();//关闭

    Connection getConnection();//获取JDBC数据库连接对象的方法


    二、mybatis.xml中的配置元素

    <configuration>:配置文件的根元素,有下面这些子元素,如果配置需要按顺序

    1.<properties>:引入资源文件,一般都是引用db.properties,<properties resource="db.properties"/>

    2.<settings>:用于改变MyBatis运行时的行为,例如二级缓存、开启延迟加载等操作。一般不用写。有一个用于显示MyBatis运行时的SQL语句。

        <settings>
            <!-- 开启执行时SQL语句的打印过程 -->
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>

    3.<typeAliases>:配置别名的3种方式,单个别名、扫描包下配置默认别名、注解配置

        <typeAliases>
            <!-- 精确单个别名配置,alias里写啥都行 -->
            <typeAlias alias="customer123" type="com.atguigu.mybatis.bean.Customer"/>
            
            <!-- 默认包下所有类首字母小写,即customer -->
            <package name="com.atguigu.mybatis.bean"/>
        </typeAliases>
    @Alias(value="customer")//注解配置别名
    public class Customer {
    }

    4.<typeHandlers>:将预处理语句中传入的参数从Java类型转为JDBC类型,从数据库取出结果时将JDBC类型转为Java类型。一般默认,不用管。写法和<typeAliases>差不多。

    5.<objectFactory>:少用,不用管。

    6.<plugins>:对某一点进行拦截。暂时不用管。

    7.<environments>:有3个常用子元素,环境<environments>、事务管理<transactionManager>、数据源<dataSource>。

        <!--1.配置环境 ,默认的环境id为mysql -->
        <environments default="mysql">
            <!--1.2.配置id为mysql的数据库环境 -->
            <environment id="mysql">
                <!-- 使用JDBC的事务管理 -->
                <transactionManager type="JDBC" />
                <!--数据库连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="shoulinniao" />
                </dataSource>
            </environment>
        </environments>

    8.<mappers>:子元素<mapper>配置映射文件mapper.xml的位置,4种方法

    • 类路径引入:<mapper resource="com/atguigu/mybatis/mapper/CustomerMapper.xml"/>
    • 接口类引入:<mapper class="com.atguigu.mybatis.mapper.CustomerMapper"/>
    • 包名引入:<package name="com.atguigu.mybatis.mapper"/>
    • 本地文件名引入:少用,不用管

    三、XxxMapper.xml中的配置元素

    记录一下常用属性 

    1.<select>:id、parameterType、resultType

    2.<insert>:id、parameterType

    3.<update>和<delete>:id、parameterType

    4.<sql>:用于定义可以重用的SQL代码片段,免得SQL语句写太多,用<include refid="">引用,如下

        <sql id="customerCol">id,username</sql>
        <!-- List<Customer> selectByJobs(String jobs); -->
        <select id="selectByJobs" resultType="com.atguigu.mybatis.bean.Customer">
            select 
            <include refid="customerCol"/>
            from customer where jobs=#{jobs}
        </select>

    5.<resultMap>:<result>

    解决POJO类与数据库中表的 命名不同的问题。建立映射关系。

    POJO和建表过程:

    package com.atguigu.mybatis.bean;
    
    import org.apache.ibatis.type.Alias;
    
    @Alias(value="customer")
    public class Customer {
    
        private Integer id;
        private String username;
        private String jobs;
        private String phone;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getJobs() {
            return jobs;
        }
        public void setJobs(String jobs) {
            this.jobs = jobs;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        @Override
        public String toString() {
            return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
        }
    }
    
    
    /*
    create table t_customer(
    t_id int primary key auto_increment,
    t_username varchar(50),
    t_jobs varchar(50),
    t_phone varchar(16)
    );
    */
    Customer.java

    建立名字不同的映射关系

        <resultMap type="com.atguigu.mybatis.bean.Customer" id="resultMap">
            <id property="id" column="t_id"/><!-- 标识主键 -->
            <result property="username" column="t_username"/>
            <result property="jobs" column="t_jobs"/>
            <result property="phone" column="t_phone"/>
        </resultMap>

    测试查询

        <!-- void insertCustomer(Customer customer); -->
        <update id="insertCustomer" parameterType="com.atguigu.mybatis.bean.Customer">
            insert into t_customer values(#{id},#{username},#{jobs},#{phone}) 
            <!-- 错误,#{}对应的是Java的插空,外面的SQL语句要和列名一样
            insert into t_customer values(#{t_id},#{t_username},#{t_jobs},#{t_phone}) --> 
        </update>
    
        <!-- List<Customer> selectByJobs(String jobs); -->
        <select id="selectByJobs" resultType="com.atguigu.mybatis.bean.Customer">
            select t_id from t_customer where t_jobs=#{jobs}
        </select>

     


     参考&引用

    《JavaEE企业级应用开发教程》——黑马程序员

  • 相关阅读:
    虚拟机VMware配置centos7集群(亲测有效)
    linux虚拟机克隆后,虚拟机ping不通的解决方法
    VC++使用 GDI+等比例缩放图片,并且居中显示
    VS2015 编译OSG Plugins Giflib静态库
    Qt 读写文件操作
    OSG 常用快捷键(全屏、查看帧数、截屏)
    Navicat Premium v15 中文最新破解版(附:激活工具)
    redis 持久化机制及配置
    Redis 五种数据类型
    linux 安装redis
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12977756.html
Copyright © 2011-2022 走看看