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企业级应用开发教程》——黑马程序员

 

posted @ 2020-05-31 23:27  守林鸟  阅读(722)  评论(0编辑  收藏  举报