MyBatis学习笔记(一)-阿里云开发者社区

开发者社区> 笔记侠> 正文

MyBatis学习笔记(一)

简介: MyBatis中文官方文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html(这大概是最好的学习材料了) 什么是 MyBatis ? 官方解释:MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配
+关注继续查看
MyBatis中文官方文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html(这大概是最好的学习材料了)
什么是 MyBatis ?
官方解释:MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis结构图:


MyBatis通过配置和注解简化JDBC的操作,了解MyBatis,首先要了解他的配置信息,XML配置映射文件中,最重要的是设置(settings)和属性(properties)信息。

properties
设置属性信息,设置连接数据库:
<properties resource="org/mybatis/example/config.properties">
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/wendao?useUnicode=true&characterEncoding=utf8"/>
  <property name="username" value="root"/>
  <property name="password" value="root"/>
</properties>
配置数据库的连接有多种方法:
1,在config.properties的属性文件中配置
2,如上,在XML配置文件中配置
3,在Java类中配置,通过方法参数传递属性
同时,也可以灵活的结合这三种配置方法进行数据库的配置,重复配置信息时有些配置信息就会被覆盖掉,这三种方法有个优先级的问题,高优先级的会覆盖掉低优先级的。

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
1,在 properties 元素体内指定的属性首先被读取。
2,然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
3,最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
也就是说:方法参数传递的属性>resource/url中配置的属性> properties 中设置的属性

settings
设置属性参数,这些参数会改变 MyBatis 的运行时行为。
一个配置完整的 settings 元素的示例如下:
<!– 配置设置 –>  
          <settings>  
               <!– 配置全局性 cache 的 ( 开 / 关) default:true –>  
               <setting name=“cacheEnabled” value=“true”/>  
               <!– 是否使用 懒加载 关联对象  同 hibernate中的延迟加载 一样  default:true ,当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态–>  
               <setting name=“lazyLoadingEnabled” value=“true”/>  
               <!– [当对象使用延迟加载时 属性的加载取决于能被引用到的那些延迟属性,否则,按需加载(需要的是时候才去加载)] –>  
             <setting name=“aggressiveLazyLoading” value=“true”/>  
             <!– 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true –>  
             <setting name=“multipleResultSetsEnabled” value=“true”/>  
             <!– 是否可以使用列的别名 (取决于驱动的兼容性) default:true–>  
             <setting name=“useColumnLabel” value=“true”/>  
             <!–允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false–>  
             <setting name=“useGeneratedKeys” value=“false”/>  
             <!–指定 MyBatis 如何自动映射 数据基表的列
 NONE:不隐射 PARTIAL:部分  FULL:全部–>  
             <setting name=“autoMappingBehavior” value=“PARTIAL”/>  
             <!– 这是默认的执行类型   
                 SIMPLE :简单    
                 REUSE:执行器可能重复使用prepared statements 语句   
                 BATCH:执行器可以重复执行语句和批量更新  –>  
             <setting name=“defaultExecutorType” value=“SIMPLE”/>  
             <!– 设置驱动等待数据响应的超时数  默认没有设置–>  
             <setting name=“defaultStatementTimeout” value=“25000″/>  
             <!– [是否启用 行内嵌套语句  defaut:false] –>  
            <setting name=“safeRowBoundsEnabled” value=“false”/>  
             <!– [是否 启用  数据中 A_column 自动映射 到 Java类中驼峰命名的属性 default:fasle] –>  
             <setting name=“mapUnderscoreToCamelCase” value=“false”/>  
             <!– 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session –>  
             <setting name=“localCacheScope” value=“SESSION”/>  
             <!– 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER –>  
             <setting name=“jdbcTypeForNull” value=“DEFAULT”/>  
             <!– 设置触发延迟加载的方法  –>  
             <setting name=“lazyLoadTriggerMethods” value=“equals,clone,hashCode,toString”/>  
         </settings> 

大概了解了MyBatis的配置信息,接下来通过一个增删改查的Demo来系统的了解一下MyBatis的流程吧。工程只为测试,建一个Java工程就行。

新建一个Java工程,上图是大体结构以及所使用到的包(没有包是运行不了的):
db.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=1011
log4j.properties:
## Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

sqlMapConfig.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>
	<!-- 加载属性文件 -->
	<properties resource="db.properties"></properties>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
		<!-- 数据库连接池-->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="org/mybatis/pojo/UserInfo.xml"></mapper>
	</mappers>
</configuration>


POJO类:
package org.mybatis.pojo;

public class UserInfo {
    private int id;
    private String username;
    private String password;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public UserInfo() {
	super();
	// TODO Auto-generated constructor stub
    }
    public UserInfo(Integer id, String username, String password) {
	super();
	this.id = id;
	this.username = username;
	this.password = password;
    }
    
}


POJO映射文件:
<?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="mybatis_example">
	<select id="findUserInfo" parameterType="int" resultType="org.mybatis.pojo.UserInfo">
		select * from user_info where id = #{id}
	</select>
	<insert id="addUser" parameterType="org.mybatis.pojo.UserInfo">
		insert into user_info(username,password) value (#{username},#{password})
	</insert>
	<delete id="delUser" parameterType="org.mybatis.pojo.UserInfo">
		delete from user_info where id = #{value}
	</delete>
	<update id="updUser" parameterType="org.mybatis.pojo.UserInfo">
		update user_info set username=#{username},password=#{password} where id=#{id}
	</update>
</mapper>


接下来是测试类,使用单元测试:
package org.mybatis.example;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.mybatis.pojo.UserInfo;

public class MyBatisExample {
//    查询
    @Test
    public void findUserInfo() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	//第一个参数:映射文件的id,
	//第二个参数:指定和映射文件parameterType所匹配的参数
	UserInfo user = sqlsession.selectOne("mybatis_example.findUserInfo",1);
	System.out.println("用户名是:"+user.getUsername());
    }
//    新增
    @Test
    public void addUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	String name = "赵敏";
	String pass = "123";
	UserInfo ui = new UserInfo();
	ui.setUsername(name);
	ui.setPassword(pass);
	sqlsession.insert("mybatis_example.addUser",ui);
	sqlsession.commit();
	sqlsession.close();
    }
//    删除
    @Test
    public void delUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	sqlsession.delete("mybatis_example.delUser",1);
	sqlsession.commit();
	sqlsession.close();
    }
//    修改
    @Test
    public void updUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	String name = "张无忌";
	String pass = "123";
	UserInfo ui = new UserInfo();
	ui.setId(2);
	ui.setUsername(name);
	ui.setPassword(pass);
	sqlsession.update("mybatis_example.updUser",ui);
	sqlsession.commit();
	sqlsession.close();
    }
}


代码中的名词解释:
parameterType:MyBatis中通过parameterType指定输入的参数类型
resultType:MyBatis中通过resultType指定输出的结果
#{}:表示的是占位符,#{}接收的参数是输入的参数,类型可以是简单类型、pojo、hashmap
#{}如果接收的是简单类型的话,里面的值可以value或者其他名称
#{}接收pojo对象,通过OGNL读取对象中的属性值,通过属性.属性的方式获取。
selectOne:表示查询出一条记录,如果是使用selectone是可以实现的结果,selectList也是可以实现了(list中只有一个对象)
selectList:表示查询出一个列表(多条记录)进行映射的。如果是使用selectOne是不可以实现的。






版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MyBatis学习笔记(四) 注解
使用MyBatis注解开发,可以省去类配置文件,简洁方便。但是比较复杂的SQL和动态SQL还是建议书写类配置文件。 注解还是不推荐使用的。只是了解了解!简单的CRUD可以使用注解。简单写写。
734 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2963 0
mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架。sql语句需要程序员自己编写, 但是mybatis也是有映射(输入参数映射、输出结果映射) mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便, 适用于需求变化较多项目,比如互联网项目。
1584 0
学习日记:java SSM框架(Spring+SpringMVC+MyBatis)
这段时间搭建ssm环境,并测试几个下载的项目demo安装相关文件:MyEclipse界面:测试项目简单增删改:ssm+mysql+easyui项目:SSM+MYSQL+EXTJS项目
3271 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12078 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13897 0
MyBatis浅尝笔记
MyBatis应属于一种轻量级的java持久层技术,它通过简单的SQL xml或注解,将数据库数据映射到接口与POJO。最近项目要用到mybatis,所以学习之后在这里做个总结,文中的示例以xml配置为主,mybatis也支持注解的方式。
694 0
+关注
笔记侠
Java开发,喜欢交流,个人网站:https://www.javazhiyin.com/ 欢迎多多交流
88
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载