码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis 笔记

时间:2017-06-27 23:29:12      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:覆盖   reader   安全   表示   注入   tps   例子   res   select标签   

Mybatis连接数据库(ORM框架)

1.编写mybatis.xml配置文件,用来获取jdbc连接

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!-- mybatis命名空间 -->
 3 <!DOCTYPE configuration
 4 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 5 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 6 <configuration>
 7 <!-- 1,加载外部配置文件 -->
 8 <properties resource="db.properties" />
 9 <!-- 2.配置全局运行行为 -->
10 <settings>
11 <!-- 关闭延迟加载关闭 -->
12 <setting name="lazyLoadingEnabled" value="false"/>
13 </settings>
14 
15 <!-- 3.配置别名 -->
16 <typeAliases>
17 <!-- <typeAlias type="com.entity.Student" alias="s"/> -->
18 <!-- 通过配置包名的形式配置别名 -->
19 <package name="com.entity"/>
20 </typeAliases>
21 <!-- 4.配置myabtis运行环境(可以配置多个,以下默认为development开发环境) -->
22 <environments default="development">
23 <!-- 配置单一运行环境 -->
24 <environment id="development">
25 <!-- 配置处理数据库事物JDBC,MANAGED -->
26 <transactionManager type="JDBC"/>
27 <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI-->
28 <!-- POOLED 表示支持JDBC数据源连接池 -->
29 <!-- UNPOOLED 表示不支持数据源连接池 -->
30 <dataSource type="POOLED">
31 <property name="driver" value="${driver}"/>
32 <property name="url" value="${url}"/>
33 <property name="username" value="${username}"/>
34 <property name="password" value="${password}"/>
35 </dataSource>
36 </environment>
37 </environments>
38 <!-- 5.引入映射文件 -->
39 <mappers>
40 <mapper resource="com/dao/studentMapper.xml"/>
41 </mappers>
42 </configuration>

-----------------------------------------------------------------------------
配置文件顺序:
1).properties--引入外部的配置文件
2).settings--全局运行行为
3).typeAliases ---设置别名
4).environments ---(必须配置)用来连接数据库
5).mappers -----(必须配置)用来加载映射文件

2.将sql语句写在xml格式的配置文件中 **注意:大小写敏感
-----------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper是映射文件的全局配置,namespace指定这个映射文件绑定什么接口 -->
<mapper namespace="com.dao.StudentDao">
<!-- 配置javabean与数据库字段之间的映射,type是javaBean类型 ,id自己任意命名,和查询语句返回的resultMap一致-->
<resultMap type="com.entity.Student" id="studentMap">
<!-- property是JavaBean属性,column是数据库字段,javaType是javaBean的类型 -->
<!--用于将数据字段和Java字段关联起来-->
<id property="studentNo" column="StudentNo" javaType="java.lang.Integer"/>
<result property="loginPwd" column="LoginPwd" javaType="java.lang.String"/>
<result property="studentName" column="StudentName" javaType="java.lang.String"/>
<result property="sex" column="Sex" javaType="java.lang.Integer"/>
<result property="gradeId" column="GradeId" javaType="java.lang.Integer"/>
<result property="phone" column="Phone" javaType="java.lang.String"/>
</resultMap>
<!-- 使用insert标签编写插入语句,id代表接口里面定义的方法名,parameterType表示参数类型 -->
<!-- 此处SQL语句不能有分号结束 -->
<insert id="saveStudent" parameterType="com.entity.Student">
insert into student values(#{studentNo},#{loginPwd},#{studentName},#{sex},#{gradeId},#{phone})
</insert>

<!-- 查询语句使用select标签 -->
<select id="queryAll" resultMap="studentMap">
select * from student
</select> 
</mapper>

3.编写工具类加载配置文件,操作sql

public class Tool {
private static SqlSessionFactory sqlSessionFactory;//用于生产sqlsesion的工厂
private static SqlSession sqlSession;//用来执行和提交事物的
static {
try {
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//获取sqlsesionFactory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//获取sqlsession
sqlSession =sqlSessionFactory.openSession();    
} catch (IOException e) {
e.printStackTrace();
}
}
public SqlSession getSession(){
return sqlSession;
}
}

4.编写测试类测试

public static void main(String[] args) {
Tool tool = new Tool();
SqlSession sqlSession = tool.getSession();
//实例化接口对象
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//创建对象
Student student = new Student(1003,"word", "王五", 0, 2, "10000");
//调用保存数据方法
dao.saveStudent(student);
//注意SQL要提交事务
sqlSession.commit();
//关闭流
sqlSession.close();
}
及
public static void main(String[] args) {
Tool tool = new Tool();
SqlSession session = tool.getSession();
try {
//实例化接口地下
StudentDao dao = session.getMapper(StudentDao.class);
//查询方法
List<Student> list = dao.queryAll();
for (Student stu:list){
System.out.println(stu);
}
} finally {
session.close();
}
} ====>推荐使用 try-finally 方法,确保session每次都能被关闭

>>>>>>>>
driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=root
password=123

注解:
1,SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域
(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的
XML 解析资源开放给更重要的事情。
2,SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间
不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法
可以做到,最简单的就是使用单例模式或者静态单例模式。
3,SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能
将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中,比如 Servlet
架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,
就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。下面的示
例就是一个确保 SqlSession 关闭的标准模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
----------------------------------------------------------
4,映射器实例(Mapper Instances)
映射器是创建用来绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,映射器实例的最大作用域是和 SqlSession 相同的,
因为它们都是从 SqlSession 里被请求的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后
即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,
在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。下面的示例就展示了这个实践:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
----------------------------------------------------------
5,事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭
连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
==>如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
6,数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
许多 MyBatis 的应用程序将会按示例中的例子来配置数据源。然而它并不是必须的。要知道为了方便使用延迟加载,数据源才是必须的。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
7,Mapper XML 文件
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
===>> 使用 parameterType 代替,设置传入的参数类型
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
8,resultMap 子元素
constructor - 类在实例化时,用来注入结果到构造方法中
idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能
arg - 注入到构造方法的一个普通结果
id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂的类型关联;许多结果将包成这种类型
嵌入结果映射 – 结果映射自身的关联,或者参考一个
collection – 复杂类型的集
嵌入结果映射 – 结果映射自身的集,或者参考一个
discriminator – 使用结果值来决定使用哪个结果映射
case – 基于某些值的结果映射
嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相 同的元素,或者它可以参照一个外部的结果映射。
9,动态 SQL
if
choose (when, otherwise)
trim (where, set)
foreach
1)if 例如:
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
2)
*********
如果一个属性存在于这些位置,那么 MyBatis 将会按找下面的顺序来加载它们:

在 properties 元素体中指定的属性首先被读取,
从 properties 元素的类路径 resource 或 url 指定的属性第二个被读取, 可以覆盖已经 指定的重复属性,
作为方法参 数传递 的属性最 后被读 取,可以 覆盖已 经从 properties 元 素体和 resource/url 属性中加载的任意重复属性。
因此,最高优先级的属性是通过方法参数传递的,之后是 resource/url 属性指定的,最 后是在 properties 元素体中指定的属性。

MyBatis 笔记

标签:覆盖   reader   安全   表示   注入   tps   例子   res   select标签   

原文地址:http://www.cnblogs.com/sjmbug/p/7087292.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!