MyBatis 简介
MyBatis 本是 apache 的一个开源项目 iBatis, 2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为MyBatis 。iBATIS 一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis 优点:
1.MyBatis 小而简单,没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。非常灵活。
- 和业务代码解耦,通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的分离,提高了可维护性。对开发人员而言,核心 sql 还是需要自己优化:sql 和 java 编码分开,功能边界清晰,一个专注业务、 一个专注数据。
相比较于 Hibernate:
Hibernate 无法很好应对,复杂 SQL 语句和复杂关联关系。全表映射比较困难,影响性能。黑盒封装,调优复杂。
快速入门
首先建立工程
image.png
导入所需的包
image.png
创建数据库
image.png
mysql驱动配置文件
image.png
image.png
注意: 画红线部分需要改成自己的数据库名字、和自己工程文件相应地址和 mysql jar 包存放地址。
添加 mybatis 配置文件 mybatis.cfg.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>
<!-- 为JAVA Bean起类别名 -->
<typeAliases >
<!-- 别名方式1,一个一个的配置 type中放置的是类的全路径,alias中放置的是类别名
<typeAliase type="com.pb.mybatis.beans.UserBean" alias="UserBean"/> -->
<!-- 别名方式2,自动扫描,将JAVA类的类名作为类的类别名 -->
<package name="com.pb.mybatis.beans"/>
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="pbbatis">
<environment id="pbbatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC" />
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<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>
<!-- 告知映射文件方式1,一个一个的配置
<mapper resource="com/cy/mybatis/mapper/UserMapper.xml"/>-->
<!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
<package name="com.pb.mybatis.mapper"/>
</mappers>
</configuration>
这里大概介绍一下各个参数的含义:
image.png
settings 参数较多下面是 settings 参数的解释 了解就好:
image.png image.png image.png
environments 参数介绍:
environment 元素是配置一个数据源的开始,属性id是它的唯一标识;
transactionManager 元素配置数据库事务,其中type属性有三种配置方式
jdbc,采用jdbc的方式管理事务;
managed,采用容器的方式管理事务,在JNDI数据源中使用;
自定义,自定义数据库事务管理办法;
dataSource 元素配置数据源连接信息,type属性是连接数据库的方式配置,有四种配置方式
UNPOOLED 非连接池方式连接
POOLED 使用连接池连接
JNDI 使用JNDI数据源
自定义数据源
创建对应的实体对象
image.png
package com.pb.mybatis.beans;
import java.io.Serializable;
public class UserBean implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private int deptId;
private float salary;
public UserBean() {
}
public UserBean(String name, int deptId, float salary) {
this.name = name;
this.deptId = deptId;
this.salary = salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "UserBean{" +
"id=" + id +
", name='" + name + '\'' +
", deptId=" + deptId +
", salary=" + salary +
'}';
}
}
创建方法接口 UserMapper.java 和定义操作 tb_emp1 表的 sql 映射文件UserMapper.xml
image.png
package com.pb.mybatis.mapper;
import com.pb.mybatis.beans.UserBean;
import java.util.List;
public interface UserMapper {
public int insertUser(UserBean user) throws Exception;
/**
* 修改用戶
* @param user
* @param id
* @return
* @throws Exception
*/
public int updateUser (UserBean user,int id) throws Exception;
/**
* 刪除用戶
* @param id
* @return
* @throws Exception
*/
public int deleteUser(int id) throws Exception;
/**
* 根据id查询用户信息
* @param id
* @return
* @throws Exception
*/
public UserBean selectUserById(int id) throws Exception;
/**
* 查询所有的用户信息
* @return
* @throws Exception
*/
public List<UserBean> selectAllUser() throws Exception;
}
<?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="com.pb.mybatis.mapper.UserMapper">
<!-- 自定义返回结果集 -->
<resultMap id="userMap" type="UserBean">
<id property="id" column="id" javaType="java.lang.Integer"></id>
<result property="name" column="name" javaType="java.lang.String"></result>
<result property="deptId" column="deptId" javaType="java.lang.Integer"></result>
<result property="salary" column="salary" javaType="java.lang.Float"></result>
</resultMap>
<!-- 在各种标签中的id属性必须和接口中的方法名相同 , id属性值必须是唯一的,不能够重复使用。parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型-->
<!-- useGeneratedKeys:( 仅 对 insert 有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的getGeneratedKeys
方法来取出由数据(比如:像 MySQL 和 SQLServer 这样的数据库管理系统的自动递增字段)内部生成的主键。默认值: false。 -->
<!--keyProperty: (仅对 insert有用)标记一个属性, MyBatis 会通过 getGeneratedKeys或者通过 insert 语句的 selectKey 子元素设置它的值。默认:不设置。 -->
<!--#{}中的内容,为占位符,当参数为某个JavaBean时,表示放置该Bean对象的属性值 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into tb_emp1 (name,deptId,salary) values (#{name},#{deptId},#{salary})
</insert>
<update id="updateUser" >
update tb_emp1 set name=#{name},deptId=#{deptId},salary=#{salary} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from tb_emp1 where id=#{id}
</delete>
<select id="selectUserById" parameterType="int" resultMap="userMap">
select * from tb_emp1 where id=#{id}
</select>
<select id="selectAllUser" resultMap="userMap">
select * from tb_emp1
</select>
</mapper>
XML 映射器参数解释:
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
select 元素:
image.png
在 mybatis-cfg.xml 里注册 UserMapper.xml 文件。请看前面的 mybatis-cfg.xml
需要建立一个工具类文件
image.png
package com.pb.mybatis.tools;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class DBTools {
public static SqlSessionFactory sessionFactory;
static {
try{
//使用MyBatis提供的Resources类加载mybatis的配置文件
Reader reader = Resources.getResourceAsReader("com/pb/mybatis/mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建能执行映射文件中sql的sqlsession
public static SqlSession getSession(){
return sessionFactory.openSession();
}
}
测试一下:
image.png
package com.pb.mybatis.service;
import com.pb.mybatis.beans.UserBean;
import com.pb.mybatis.mapper.UserMapper;
import com.pb.mybatis.tools.DBTools;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserService {
public static void main(String[] args){
insertUser();
}
/**
* 新增用户
*/
private static void insertUser() {
SqlSession session = DBTools.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserBean user = new UserBean("bo",123,2000);
try {
mapper.insertUser(user);
System.out.println(user.toString());
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
}
/**
* 删除用户
*/
private static void deleteUser(){
SqlSession session=DBTools.getSession();
UserMapper mapper=session.getMapper(UserMapper.class);
try {
mapper.deleteUser(1);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
}
/**
* 根据id查询用户
*/
private static void selectUserById(){
SqlSession session=DBTools.getSession();
UserMapper mapper=session.getMapper(UserMapper.class);
try {
UserBean user= mapper.selectUserById(2);
System.out.println(user.toString());
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
}
/**
* 查询所有的用户
*/
private static void selectAllUser(){
SqlSession session=DBTools.getSession();
UserMapper mapper=session.getMapper(UserMapper.class);
try {
List<UserBean> user=mapper.selectAllUser();
System.out.println(user.toString());
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}
}
}
测试结果:
image.png
网友评论