MyBatis 笔记
Posted 好奇害死猫+1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 笔记相关的知识,希望对你有一定的参考价值。
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 笔记的主要内容,如果未能解决你的问题,请参考以下文章
markdown [mybatis参考]关于mybatis #mybatis的一些片段