发表于: 2018-03-17 22:49:24

1 802


今日完成:


1.今天使用mybits搭建连接


  什么是mybatis:

      

图片:http://blog.csdn.net/qq_36074113/article/details/73997548



      “MyBatis(http://www.mybatis.org/mybatis-3/zh/index.html本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。它是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。”


      MyBatis的特点:

      简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 

      灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。 

      解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 

      提供映射标签,支持对象与数据库的orm字段关系映射 。

      提供对象关系映射标签,支持对象关系组建维护 。

      提供xml标签,支持编写动态sql。



2)配置mybatis需要的jar的包,搭建mybatis环境:

pom.xml

  <!-- =====================定义本项目的依赖关系===================== -->
 <dependencies>
   <!-- 每个dependency都对应这一个jar-->
   <dependency>

     <!--一般情况下,maven是通过groupIdartifactIdversion这三个元素值(俗称坐标)来检索该构件,然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-就需要在他的pom文件中新建一个dependency节点,将本项目的groupIdartifactIdversion写入, maven就会把你上传的jar包下载到他的本地 -->
     <!--junit测试包-->
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用(scope)的限制。scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime
     运行时范围)、test(测试范围)、system(系统范围) -->
     <scope>test</scope>
     <!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:true,则子项目必需显示的引入,dependencyManagement里定义的依赖类似  -->
     <optional>false</optional>

     <!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用
     2.0版,就应该屏蔽掉对1.0版的依赖 -->
     <!--<exclusions>-->
       <!--<exclusion>-->
         <!--<groupId>org.slf4j</groupId>-->
         <!--<artifactId>slf4j-api</artifactId>-->
       <!--</exclusion>-->
     <!--</exclusions>-->

   </dependency>

   <!--mysql驱动包-->
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.40</version>
   </dependency>

   <!--核心包-->
   <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.4.5</version>
   </dependency>

   <!--日志文件管理包-->
   <dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.17</version>
   </dependency>

   <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.12</version>
   </dependency>

   <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version>1.7.16</version>
   </dependency>



3. 映射配置文件 mybatis-config.xml


关于如何配置映射文件,首先去了解了一些其相关属性:


properties属性:这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。

<properties resource="org/mybatis/example/config.properties">
   <property name="username" value="root"/>
   <property name="password" value="root"/>
</properties>

然后它其中的属性就可以在整个配置文件中被动态使用,比如下面的${username}和${password}就是上面定义的,driver 和 url 属性将会由 config.properties 文件中对应的值来替换。

<dataSource type="POOLED">
   <property name="driver" value="${driver}"/>
   <property name="url" value="${url}"/>
   <property name="username" value="${username}"/>
   <property name="password" value="${password}"/>
</dataSource>

它是按照以下顺序读取:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

settings:这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

                  查看:http://blog.csdn.net/mqf163/article/details/52514015


typeAliases:类型别名。是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<!--当这样配置时,User可以用在任何使用mybatis.pojo.User的地方。-->
<typeAliases>
   <typeAlias alias="User" type="mybatis.pojo.User"></typeAlias>
</typeAliases>


配置环境:MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。尽管可以配置多个环境,但是每个 SqlSessionFactory 实例只能选择其一。

为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可(如果忽略环境参数它将会加载默认环境):

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);


<environments default="development">    <!--·默认的环境 ID(比如:default="development"-->
   <environment id="development">    <!--·每个 environment 元素定义的环境 ID(比如:id="development"-->
       <transactionManager type="JDBC"/>    <!--·事务管理器的配置(比如:type="JDBC"-->
       <!--数据源-->
       <dataSource type="POOLED">    <!--·数据源的配置(比如:type="POOLED"-->
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql://localhost:3306/jnshu"/>
           <property name="username" value="root"/>
           <property name="password" value="root"/>
       </dataSource>
   </environment>
</environments>
  • ·默认的环境 ID(比如:default="development")。
  • ·每个 environment 元素定义的环境 ID(比如:id="development")。
  • ·事务管理器的配置(比如:type="JDBC")。
  • ·数据源的配置(比如:type="POOLED")。


事务管理器(transactionManager)(也就是 type=”[JDBC|MANAGED]”如上面的<transactionManager type="JDBC"/>):

JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。


数据源(dataSource(也就是 type=”[UNPOOLED|POOLED|JNDI]”)

这里用POOLED。这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

<!--数据源-->
<dataSource type="POOLED">
   <property name="driver" value="com.mysql.jdbc.Driver"/>
   <property name="url" value="jdbc:mysql://localhost:3306/jnshu"/>
   <property name="username" value="root"/>
   <property name="password" value="root"/>
</dataSource>


映射器 mappers:定义 SQL 映射语句,Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射器文件。

<mappers>
   <mapper resource="mapper/user.xml"></mapper>
</mappers>

还可以用其它的方式引用:

<mappers>
   <!-- 使用相对于类路径的资源引用 -->
   <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

   <!-- 使用映射器接口实现类的完全限定类名 -->
   <mapper class="org.mybatis.builder.AuthorMapper"/>

   <!-- 使用完全限定资源定位符(URL-->
   <mapper url="file:///var/mappers/AuthorMapper.xml"/>

   <!-- 将包内的映射器接口实现全部注册为映射器 -->
   <package name="org.mybatis.builder"/>
</mappers>

映射文件 Mapper XML      MyBatis 的真正强大在于它的映射语句

  • cache – 给定命名空间的缓存配置。
  • cache-ref – 其他命名空间缓存配置的引用。
  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
  • parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
  • sql – 可被其他语句引用的可重用语句块。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

如select:

<select id="selectById" parameterType="int" resultType="User">
   SELECT * FROM User WHERE id = #{id}
</select>

以上select映射语句可以理解为:di为selectById,它接收一个int类型的参数,并返回一个user对象。#{}符号参数。如同下面:

Connection conn;

String selectById = "SELECT * FROM User WHERE id = ?";

PreparedStatement pstmt = conn.prepareStatement(selectById);

pstmt.setInt(1,id);

这其中的很多jdbc代码就由MyBatis代为处理了。除了parameterType、resuluType等select还有其它相关属性可以配置:

<select
  id="selectById"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="personResultMap"
  flushCache="false"
  useCache="true"
  timeout="10000"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

mybatis.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>

   <!--配置user-->
   <!--类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。-->
   <!--当这样配置时,User可以用在任何使用mybatis.pojo.Userg的地方。-->
   <typeAliases>
       <!--<typeAlias alias="User" type="mybatis.pojo.User"></typeAlias>-->
       <typeAlias alias="User" type="pojo.User"></typeAlias>
   </typeAliases>
   <!--也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:-->
   <!--<typeAliases>-->
       <!--<package name="mybatis.pojo"/>-->
   <!--</typeAliases>-->

   <environments default="development">    <!--·默认的环境 ID(比如:default="development"-->
       <environment id="development">    <!--·每个 environment 元素定义的环境 ID(比如:id="development"-->
           <transactionManager type="JDBC"/>    <!--·事务管理器的配置(比如:type="JDBC"-->
           <!--数据源-->
           <dataSource type="POOLED">    <!--·数据源的配置(比如:type="POOLED"-->
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/jnshu"/>
               <property name="username" value="root"/>
               <property name="password" value="root"/>
           </dataSource>
       </environment>
   </environments>


   <mappers>
       <mapper resource="mapper/user.xml"></mapper>
   </mappers>

   <!--<environments default="development">-->
       <!--<environment id="development">-->
           <!--<transactionManager type="JDBC"/>-->
           <!--<dataSource type="POOLED">-->
               <!--<property name="driver" value="${driver}"/>-->
               <!--<property name="url" value="${url}"/>-->
               <!--<property name="username" value="${username}"/>-->
               <!--<property name="password" value="${password}"/>-->
           <!--</dataSource>-->
       <!--</environment>-->
   <!--</environments>-->
   <!--<mappers>-->
       <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
   <!--</mappers>-->
</configuration>

user.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">

<!--user映射文件-->
       <!--MyBatis中,Mapper中的namespace用于绑定Dao接口的,即面向接口编程。
       它的好处在于当使用了namespace之后就可以不用写接口实现类,业务逻辑会直接通过这个绑定寻找到相对应的SQL语句进行对应的数据处理-->

       <!--namespace="mybatis.userDao.PojoDao" 映射不包含id数值
       Mapped Statements collection does not contain value for resources.mapper.user.selectById
       -->
<mapper namespace="mybatis.userDao.PojoDao">
   <!--diselectById,它接受一个int类型的参数,并返回一个user对象-->
   <select id="selectById" parameterType="int" resultType="User">
       SELECT * FROM User WHERE id = #{id}
</select>

   <!--<insert id="insertUser" useGeneratedKeys="true" >-->
       <!--INSERT INTO user (id,name,password) values (#{id},#{name},#{password})-->
   <!--</insert>-->
   <!--&lt;!&ndash;-->
   <!--parameterType="mybatis.pojo.User"-->
   <!--Cause: java.lang.ClassNotFoundException: Cannot find class: mybatis.pojo.User-->
   <!--&ndash;&gt;-->
   <!--<update id="updateUser" parameterType="pojo.User">-->
       <!--UPDATE USER SET name=#{name},password=#{password} WHERE id=#{id}-->
   <!--</update>-->
</mapper>



明日计划:

1.Mybatis配置还未完成,测试报错,完成后继续测试连接

2.与jdbcTemplate的区别:侧重方向不同,待布置好能运行后查看。


问题与收获:


1.Mybatis里xml的核心配置和SQL映射配置。  关于根目录的问题:xml里的各种路径有点迷糊,还有mybatis查询的数据存放位置,主要是没通过测试,不知道是哪里配置出问题了。


2.知道了Mybatis的核心类,知道它的整个就是围绕着Sqlsession去实现的,但是只知道它给出来的方法就是这样使用:

1)SqlSessionFactoryBuilder:用来创建SqlSessionFactoryBuilder的实例,其生命周期只在初始化的时候有用。

2)SqlSessionFactory,Mybatis的基础类,用来创建会话(即SqlSession的实例),生命周期很长,可以一直持续到数据关闭。

3)SqlSession,用来和数据库对话。

4)Mapper 用来编写SQL语句,核心,由SqlSession创建。

“Mybatis也是封装的JDBC,所以查询出来的对象也是ResultSet,Mybatis就会创建出来一个对象,并且根据字段名一一对应”

缺点:SQL语句比较多,特别是查询的内容和类型多、字段多、关联的表也多的时候。


3.重写了几遍jdbc的基础方法,加深印象。


)首先Class.forName("com.mysql.jdbc.Driver");加载驱动类,它包含一系列的Driver。但是为什么把这一步注掉,程序照样能运行查找到数据。不需要加载驱动类还是驱动类在运行之前已经被加载了?然后查找看到这个:


原来它已经被jdbc自动加载了……静态语句块在类加载的时候会被执行,且只执行一次


)第二步,加载Connection连接,当调用DriverManager.getConnection发出连接请求时DriverManager会遍历每个驱动尝试创建连接,然后使用第一个可以连接到给定URL的驱动程序。驱动程序是由数据库方提供。DriverManager是使用自己加载的Driver类的对象去创建连接。通过DriverManger获得Connection, 一个Connection对应一个实际的物理连接。

)第三步 PreparedStatement stmt  = conn.createStatement();

)第四步 ResultSet rs = stmt.executeQuery(sql);

)第五步 取出数据。

未完待续,先提交再修改,需要看的还有很多。



返回列表 返回列表
评论

    分享到