mybatis初步学习

来源:互联网 发布:牧场系统源码 编辑:程序博客网 时间:2024/06/08 01:21

1.Mybatis是干什么的?解决了什么问题?有什么好处?

答:它是一款轻量级的持久层框架,支持了定制化Sql,存储过程和高级映射。Mybatis避免了所有jdbc代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XMl或注解来配置和映射原生信息,将接口和Java的pojos映射成数据库中的记录。

2. 如何安装mybatis

使用 MyBatis,只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中。

 <dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis</artifactId>

       <version>3.3.0</version>

</dependency>

3.mybatis使用的流程,实现的流程?

         1核心配置文件:xml文件,全局的配置文件,放到maven项目下的resources中,或者web项目下的src, 在这里我们要配置数据源,事务的处理,加载其他的mapper配置文件。

简单实例:

//头文件

<?xml version="1.0"encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

         <!--加载属性文件 -->

         <propertiesresource="db.properties">

                   <!--properties中还可以配置一些属性名和属性值  -->

                   <!--<property name="jdbc.driver" value=""/> -->

         </properties>

         <!--全局配置参数,需要时再设置 -->

         <!--<settings>

         </settings>-->

         <!--和spring整合后 environments配置将废除-->

         <environmentsdefault="development">

                   <environmentid="development">

                   <!--使用jdbc事务管理,事务控制由mybatis-->

                            <transactionManagertype="JDBC" />

                   <!--数据库连接池,由mybatis管理-->

                            <dataSourcetype="POOLED">

                                     <propertyname="driver" value="${jdbc.driver}" />

                                     <propertyname="url" value="${jdbc.url}" />

                                     <propertyname="username" value="${jdbc.username}" />

                                     <propertyname="password" value="${jdbc.password}" />

                            </dataSource>

                   </environment>

         </environments>

 

         <!--加载 映射文件 -->

         <mappers>

        <mapper resource="mapper/User.xml"></mapper>

         </mappers>

</configuration>

         2创建一个sqlsessionfactory,用于解析配置文件,例如我们在测试类中,可以对配置文件进行解析 

String resource = "SqlMapConfig.xml";

       //如何对配置文件resouce读取解析

       InputStream inputStream = Resources.getResourceAsStream(resource);

       //创建会话工厂,传入mybati的配置信息

       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

       3我们要通过上面得到的session.factory获取sqlsession

然后创建一个sqlsession(会话,是一个写好的接口,是一个执行器)

  SqlSession sqlSession =sqlSessionFactory.openSession();

  4执行器调用数据库的操作是增删改查 (可以将重复的操作放到缓存中)

 sqlSession.update,insert,delete,select等操作

        5mapper statement(底层对象的封装)对底层数据库进行操作,用到一些输入参数,输出参数,在映射文件中,namespace叫命名空间,是对sql进行分类化管理,管理sql

<mapper namespace="com.neusoft.dao.UserMapper">

      <select id="findUserById"  parameterType="int"resultType="com.neusoft.bean.User">

           SELECT  *  fromuser  where id=#{value};

</select>

</mapper>

 

 

3继续整合,还是不够好,非常复杂?

基于接口的实现

写一个UserMapper的接口,与UserMapper.Xml文件映射,映射的方式即为namespace等改为接口的地址

<mappernamespace="com.neusoft.dao.UserMapper">

<selectid="findUserById"中id必须与接口中方法名一样,

在测试类中,  UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);

用sqlsession.getMapper();加载接口,基于反射机制。还没有很懂。

4优化

为为实体类定义别名,简化sql映射xml文件中的引用

在mapper.xml中按如下的写:

  <select id="findUserById"  parameterType="int"resultType="user">

在核心配置文件中:

<typeAliases>

         <typeAliastype="com.neusoft.bean.User"alias="user"></typeAlias>

</typeAliases>

注意:namespace 不能那么写

<typeAliases>

        <package name=" com.neusoft.bean"/>

    </typeAliases>

com.neusoft.bean.User这个实体类的别名就会被设置成User

5解决字段名和实体类属性名不相同的冲突,数据表里第一个字段为order_id,

实体类id

<!--

        根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,

        这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录

     -->

    <select id="getOrderById"parameterType="int"

       resultType="me.gacl.domain.Order">

           select * from orders whereorder_id=#{id}

     </select>

<!--

根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,

这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上

-->

<selectid="selectOrder" parameterType="int"

resultType="me.gacl.domain.Order">

select order_idid, order_no orderNo,order_price price from orders where order_id=#{id}

</select>

<!--

根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,

这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->

<selectid="selectOrderResultMap" parameterType="int"resultMap="orderResultMap">

select * fromorders where order_id=#{id}

</select>

<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->

<resultMaptype="me.gacl.domain.Order" id="orderResultMap">

<!-- 用id属性来映射主键字段-->

<idpropertyid" column="order_id"/>

<!-- 用result属性来映射非主键字段-->

<resultproperty="orderNo" column="order_no"/>

<resultproperty="price" column="order_price"/>

</resultMap>

    

 

 

 

 

 

  

 

 

原创粉丝点击