发表于: 2018-03-17 22:49:24
1 803
今日完成:
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是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件,然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, 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">
<!--di为selectById,它接受一个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>-->
<!--<!–-->
<!--parameterType="mybatis.pojo.User"-->
<!--Cause: java.lang.ClassNotFoundException: Cannot find class: mybatis.pojo.User-->
<!--–>-->
<!--<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);
)第五步 取出数据。
未完待续,先提交再修改,需要看的还有很多。
评论