MyBatis学习之环境搭建

来源:互联网 发布:阿里云服务器代理商 编辑:程序博客网 时间:2024/06/05 09:28

MyBatis的简单介绍

  1. Hibernate:
    面向对象的对象关系映射的Java持久层框架
    缺点:效率较低,不是直接用SQL进行操作数据库,没有进行SQL优化,因此对于一些大型的项目来说效率较低
    2.MyBatis:
    一个面向SQL的Java持久层框架,也称之为SQL映射
    体系结构主要分为三层:接口层,数据处理层,基础支撑层
    我们主要使用接口层和数据库进行交互,由于它是需要我们自己定义SQL语句,因此我们可以根据我们自己的需要来书写适合我们的业务的SQL语句,可以进行适当的优化,所以效率方面可能比Hibernate高一些

MyBatis环境

要使用一个框架就免不了搭建环境,配置一些必要的文件,因此要想使用一个框架就首先就得学会搭建环境。
1. 引入MyBatis相关的jar包,如果是基于Maven的项目,那么就可以直接在pom.xml文件添加依赖即可。下面是Maven项目关于MyBatis的一些依赖:

<mybatis.version>3.2.8</mybatis.version><dependency>    <groupId>org.mybatis</groupId>      <artifactId>mybatis</artifactId>    <version>${mybatis.version}</version></dependency>

还有一个就是因为要连接数据库就还得引入相关数据库的驱动包,以下是MySql的Maven依赖:

<dependency>       <groupId>mysql</groupId>       <artifactId>mysql-connector-java</artifactId>       <version>5.1.18</version></dependency>
  1. 配置一些必要的xml文件,由于MyBatis框架是作用于持久层的,主要是用来操作数据库,因此配置文件主要配置数据源,也就是数据库的连接配置,然后就是配置开发中需要的Mapping映射文件,以下就是相关配置内容,里面有各个标签的详细注释。
<?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文件 -->    <properties resource="db-config.properties"></properties>    <!-- 为实体类起一个别名 -->    <typeAliases>         <typeAlias alias="User" type="com.ecjtu.mybatis.entity.User"/>         <typeAlias alias="Article" type="com.ecjtu.mybatis.entity.Article"/>    </typeAliases>     <environments default="development">        <!-- 环境配置 -->        <environment id="development">        <!-- 事物管理器,事物处理采用jdbc的处理方式 -->        <transactionManager type="JDBC"/>            <!-- 数据源 UNPOOLED表示不使用连接池-->            <dataSource type="POOLED">                <property name="driver" value="${jdbc.driverClass}"/>                <property name="url" value="${jdbc.url}" />                <property name="username" value="${jdbc.username}"/>                <property name="password" value="${jdbc.password}"/>            </dataSource>        </environment>    </environments>    <!-- 实体类Mapping映射文件 -->    <mappers>        <mapper resource="com/ecjtu/mybatis/entity/mybatis-user-sql.xml"/>    </mappers></configuration>

3.配置好了之后就可以对数据库进行操作了,也就是增删改查操作,首先通过Resource拿到MyBatis的配置文件作为一个字符流,再通过字符流创建一个sqlSessionFactory,拿到sqlSessionFactory之后就好办了,这时就可以调用openSession方法得到session,之后就可以通过session来对数据库进行增删改查操作,常见的查询方法有:
查询返回单一数据:selectOne(sqlId,args)
查询返回一个list集合:selectList(sqlId,args);
查询返回一个map集合:selectMap(sqlId,mapKey)
注意:返回Map集合时,是将实体类中指定的字段作为key,查询结果作为val,形成键值对,组合成map集合返回。
以下是操作数据库的简单应用:

String resource = "mybatis-config.xml";        //引入mybatis的配置文件        InputStream inputStream = Resources.getResourceAsStream(resource);        //創建mybatis的sqlsessionfactory        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        //用sqlsessionfactory創建一個session        SqlSession session = sqlSessionFactory.openSession();        List<User> users = session.selectList("queryUsers", "zhangsan");        System.out.println(users.size() + "===============");        Map<String, User> userMap = session.selectMap("queryUsers", "userName");        System.out.println(userMap);

4.关于实体类的Xml文件,其中的namespace是为了区分不同实体类xml文件中下面的相同sqlId的情况,访问方式就是命名空间.sqlId,但如果能够保证命名空间中的sqlId都不同,那么命名空间可以不用写,但struts2中必须要写,而且注意:struts2中的对于一个URI,是首先找到所有和uri相同的命名空间前缀,然后找最长匹配的那个命名空间。

<?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="com.ecjtu.mybatis.inter.IUserOperation">    <!-- ID的內容和接口裡面的方法名要一致,    resultType的值要和configuration裡面的typeAlias alias="User"一樣 -->    <select id="selectUserByID" parameterType="int" resultType="User">        select * from user where id = #{id}    </select>    <!-- 为了返回list 类型而定义的resultMap -->    <resultMap type="User" id="resultListUser">        <id column="id" property="id" />        <result column="userName" property="userName" />        <result column="userAge" property="userAge" />        <result column="userAddress" property="userAddress" />    </resultMap>    <!-- User 联合文章进行查询 方法之一的配置 (多对一的方式)  -->        <resultMap id="resultUserArticleList" type="com.ecjtu.mybatis.entity.Article">        <!-- 这里column对应于查询出来的列名一致 -->        <id property="id" column="aid" />        <result property="title" column="title" />        <result property="content" column="content" />        <association property="user" javaType="User">            <id property="id" column="id" />            <result property="userName" column="userName" />            <result property="userAddress" column="userAddress" />                    </association>            </resultMap>    <!-- User 联合文章进行查询 方法之二的配置 (多对一的方式) -->        <resultMap id="resultUserArticleList-2" type="com.ecjtu.mybatis.entity.Article">        <id property="id" column="aid" />        <result property="title" column="title" />        <result property="content" column="content" />                <association property="user" javaType="User" resultMap="resultListUser" />                 </resultMap>    <!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 -->    <select id="selectUsers" parameterType="string" resultMap="resultListUser">        select * from user where userName like #{userName}    </select>    <!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 -->    <select id="queryUsers" parameterType="string" resultMap="resultListUser">        select * from user    </select>    <!-- 主键使用自增长 -->    <insert id="addUser" parameterType="com.ecjtu.mybatis.entity.User" useGeneratedKeys="true" keyProperty="id">        insert into user values(#{id},#{userName},#{userAge},#{userAddress})    </insert>    <update id="updateUser" parameterType="User">        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}    </update>    <delete id="deleteUser" parameterType="int">        delete from user where id=#{id}    </delete>    <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList-2">       select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article               where user.id=article.userid and user.id=#{id}    </select></mapper>

5.对于MyBatis中的namespace可以用于将命名空间和接口进行绑定,然后将方法和映射文件中的SQLId进行绑定,当调用接口中的方法时,等同于调用命名空间中的sqlId对应的SQL文,格式:
daoInter = session.getMapper(接口名.class);
获取到实例后就可以调用方法了。

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">      <!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->      <property name="sqlSessionFactory" ref="sqlSessionFactory" />      <!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->      <property name="mapperInterface" value="com.ecjtu.mybatis.inter.IUserOperation" />   </bean> 
public interface IUserOperation {       public User selectUserByID(int id);    public List<User> selectUsers(String userName);     public void addUser(User user);    public void updateUser(User user);    public void deleteUser(int id);    public List<Article> getUserArticles(int id);}

6.还可以通过命名空间来打印sql执行的详细log,当然需要先引入相关jar包以及配置log4j配置文件,格式如下:
log4j.logger.命名空间的名称=TRACE

0 0
原创粉丝点击