mybatis简介
mybatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为mybatis 。2013年11月迁移到github。
mybatis 是支持定制化 sql、存储过程以及高级映射的优秀的持久层框架。mybatis 避免了几乎所有的 jdbc 代码和手动设置参数以及获取结果集。mybatis 可以对配置和原生map使用简单的 xml 或注解,将接口和 java 的 pojos(plain old java objects,普通的 java对象)映射成数据库中的记录。
mybatis参考资料官网
http://www.mybatis.org/mybatis-3/zh/index.html
mybatis下载地址
https://github.com/mybatis/mybatis-3
mybatis的优势
开源的优秀的持久层框架
sql语句与代码分离
面向配置的编程
良好支持复杂数据映射
动态sql
mybatis开发步骤
1.添加需要的jar包1)mybatis-3.3.0 核心包(如果需要日志操作,可以导入依赖包)
2)数据库驱动(mysql-connector-java-5.1.22-bin)
2.创建数据库,添加测试数据
create table `tal_employee` ( `id` int (11), `last_name` varchar (360), `email` varchar (300), `gender` char (9));
insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('1','韩信','hanxin@gemail.com','男');insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('2','libaihh','libai@gemail.com','男');insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('3','孙尚香','sunshangxiang@gemail.com','女');insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('4','安琪拉','anqila@gemail.com','女');insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('5','hello','hello@gemail.com','男');insert into `tal_employee` (`id`, `last_name`, `email`, `gender`) values('6','miya','miya@gemail.com','男');
3.创建实体类public class employee { private integer id; private string lastname; private string email; private string gender; //此处省略get set tostring。。。}
4.创建实体类映射配置文件<?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="employeemapper"> <!-- 定义一个查询方法 resulttype 返回值类型--> <select id="findall" resulttype="com.simple.mybatis.entitys.employee"> select * from tal_employee </select></mapper>
5.创建mybatis主配置文件<?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> <!-- 配置环境 default默认使用环境名字--> <environments default="development"> <!-- 配置一个环境 --> <environment id="development"> <!-- 使用事务jdbc事务管理器 --> <transactionmanager type="jdbc" /> <!-- 配置数据库连接 --> <datasource type="pooled"> <property name="driver" value="com.mysql.jdbc.driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="root" /> </datasource> </environment> </environments> <!-- 加载映射 --> <mappers> <mapper resource="com/simple/mybatis/entitys/employeemapper.xml" /> </mappers></configuration>
获取sqlsessionfactory对象
private sqlsessionfactory sqlsessionfactory; @before public void init() throws ioexception{ //读取mybatis主配置文件 inputstream inputstream = resources.getresourceasstream("mybatis-config.xml"); /** * 实例化sqlsessionfactory * 如果没有指定默认环境,可以在这里指定使用的环境id,比如我先在有个dev环境 * sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream,"dev"); * 我这里已经使用了默认环境所以我就不用这种方式创建了 */ sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream); }
访问数据库
获取sqlsession对象,作用于与数据库的一次回话作用于与数据库的一次回话
sqlsession session = sqlsessionfactory.opensession();
获取所有员工记录
employeemapper就是我们实体类映射文件的命名空间,findall就是我们select标签的id
list<employee> employees = session.selectlist("employeemapper.findall"); for (employee employee : employees) { system.out.println(employee); }
访问结果:
employee [id=1, lastname=null, email=hanxin@gemail.com, gender=男]employee [id=2, lastname=null, email=libai@gemail.com, gender=男]employee [id=3, lastname=null, email=sunshangxiang@gemail.com, gender=女]employee [id=4, lastname=null, email=anqila@gemail.com, gender=女]employee [id=5, lastname=null, email=hello@gemail.com, gender=男]employee [id=6, lastname=null, email=miya@gemail.com, gender=男]
在这里我们访问数据库是正常的,为什么lastname为空呢?
解决表字段与类属性名不对应
原因:应为我们这里实体类上的属性叫做lastname与数据库列last_name名字不对应所以获取的值为空
解决方案1:将实体类映射文件的中select标签中的取别名
<select id="findall" resulttype="com.simple.mybatis.entitys.employee"> select id,last_name as lastname,email,gender from tal_employee</select>
解决方案2:在mybatis主配置文件中配置驼峰式命名,需要将配置排在前面否则xml报错
<settings> <!-- 开启驼峰式命名规则 --> <setting name="mapunderscoretocamelcase" value="true"/></settings>
使用方案2我们类中属性lastname会匹配数据库字段last_name
使用日志查看sql语句等
首先我们需要添加mybatis依赖包
添加log4j.properties
#设置输出级别和输出位置log4j.rootlogger=debug,console#设置控制台相关的参数log4j.appender.console=org.apache.log4j.consoleappender log4j.appender.console.layout=org.apache.log4j.patternlayout log4j.appender.console.layout.conversionpattern=%d [%t] %-5p [%c] - %m%n #设置mybatis的输出内容log4j.logger.java.sql.resultset=info log4j.logger.org.apache=info log4j.logger.java.sql.connection=debug log4j.logger.java.sql.statement=debug log4j.logger.java.sql.preparedstatement=debug
这样我们就可以使用log4j来查看我们的sql语句啊,传入的参数啊。。等等
mybatis的配置文件
通过前面简单的mybatis案例,大家应该了解到了mybatis框架的基本结构,和hibernate一样,mybatis包含了一个核心配置文件和映射文件。
核心配置文件(mybatis-config.xml):包含了对mybatis的核心配置,包含连接池信息,事务,加载映射文件,参数设置等配置。
映射文件(employeemapper.xml):主要实现实体对象对数据库的映射,关联关系,sql语句等。
核心配置文件标签说明
配置环境
一些外部属性,这些属性可以被替换
mybatis中极为重要的调整设置,会改变mybatis的默认行为。
为java类型设置一个别名,它只和xml配置有关。
映射器,加载mybatis的映射文件。
插件,mybatis允许用户在映射的某一点进行拦截。
环境配置mybatis可以通过
配置多种环境,比如开发环境、测试环境和生产环境等。
不过要记住,尽管可以配置多个环境,但是sqlsessionfactory对象只能加载一个。如果你需要同时连接多个数据库,需要创建多个sqlsessionfactory实例。
事务管理在 mybatis来进行事务的设置,其中有两种类型的事务管理器。
jdbc:这个配置就是直接使用了 jdbc 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
managed:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 jee 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeconnection 属性设置为 false 来阻止它默认的关闭行为。
<transactionmanager type="managed"> <property name="closeconnection" value="false"/></transactionmanager>
如果你正在使用 spring + mybatis,则没有必要配置事务管理器, 因为 spring 模块会使用自带的管理器来覆盖前面的配置。
数据源使用标准的 jdbc 数据源接口来配置 jdbc 连接对象的资源。有三种数据源类型
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
pooled:这种数据源的实现利用“池”的概念将 jdbc 连接对象组织起来, 避免了创建新的连接实例时所必需的初始化和认证时间。
jndi:使用jndi在外部配置数据源。
properties标签properties为外部属性,比如数据库连接信息可以配置到一个单独的properties文件中,然后在xml中进行引入。
添加一个db.properties文件
driver=com.mysql.jdbc.driverurl=jdbc:mysql://localhost:3306/testusername=rootpassword=root
在mybatis主配置文件中引用
<properties resource="db.properties" /><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>
映射器通常mybatis中将映射关系(非必须)和sql语句写入到映射文件中,在配置文件中需要手动进行加载映射文件。加载映射文件使用进行加载。mybatis中有4种加载方式。
1.使用resource,加载classpath路径进行加载。
<mappers> <mapper resource="com/simple/mybatis/entitys/employeemapper.xml"/></mappers>
2.使用url路径进行加载。
<mappers> <mapper url="file:///var/mappers/authormapper.xml"/></mappers>
3.使用calss进行加载,注解方式。
<!– 加载class类--><mappers> <mapper class="使用注解的全类名"/></mappers>
4.使用package进行加载,注解方式。
<!– 加载某个包下的所有class文件--><mappers> <package name="com.simple.mybatis.entitys"/></mappers>
别名的使用之前,我们在sql映射xml文件中的引用实体类时,resulttype需要写上实体类的全类名(包名+类名),如下:
<select id="findall" resulttype="com.simple.mybatis.entitys.employee"> select id,last_name as lastname,email,gender from tal_employee</select>
在mybatis主配置文件中加入
<typealiases> <typealias type=“com.simple.mybatis.entitys.employee" alias="employee"/></typealiases>
这样在resulttype中就可以直接使用employee类型了。这个别名是不区分大小写的。
以上就是mybatis是什么?mybatis的相关内容介绍的详细内容。
