什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Java中常用的两个ORM框架:Hibernate和mybatis
Hibernate更强调如何对单条记录进行操作,对于更复杂的操作,它提供了一种新的面向对象的查询语言:HQL(面向对象的方式操作数据库)。
mybatis是另外一种ORM框架,和Hibernate擅长操作单条记录不同,iBatis是基于SQL模板的,可以说,mybatis每次和数据库进行操作时,都有明确的SQL语句,而这些SQL语句,就是我们定义在配置文件中的。
1:hibernate 面向对象方式操作数据库,使用hql语句,比较擅长单表操作,联表查询不太灵活
2:mybatis 基于原生sql执行,比较灵活
下面介绍基于maven的Java项目使用mybatis。
1、首先配置pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yun</groupId>
<artifactId>yun</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>yun</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
<build>
<!--定义打包后名称(非必填)-->
<finalName>yun</finalName>
<plugins>
<!--编译插件
source: 源代码编译版本;
target: 目标平台编译版本;
encoding: 字符集编码。-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
<!--解决java目录中 xml文件不处理的问题-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
2、配置jdbc.properties和mybatis-config.xml
目录结构如下
─main
├─java
└─resources
jdbc.properties
mybatis-config.xml
jdbc.properties
#数据库驱动
driver = com.mysql.jdbc.Driver
#数据库地址
url = jdbc:mysql://localhost:3306/yun
#数据库用户
username = root
#数据库密码
password = 1111
mybatis-config.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="jdbc.properties"/>
<!--类型别名-->
<!--在后面配置mapper.xml时会用到-->
<typeAliases>
<package name="com.yun.entity"/>
</typeAliases>
<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>
<!--表示mapper.xml所在的目录-->
<mappers>
<package name="com.yun.dao"/>
</mappers>
</configuration>
3、mapper接口---UserMapper.java(与UserMapper.xml对应)
package com.yun.dao;
import com.yun.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.HashMap;
import java.util.List;
/**
* 操作数据库表user的接口
*/
public interface UserMapper {
/**
* 根据卡号查询
*
* @param cardNo
* @return
*/
User selectUserByCardNo(@Param("cardNo") String cardNo);
/**
* 通过id修改性别
*
* @param sex
* @param id
* @return 影响行数
*/
int updateSexById(@Param("sex") String sex,
@Param("id") Integer id);
}
4、 UserMapper.xml文件(与UserMapper.java对应)
<?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">
<!--表示改xml与com.dayuan.dao.UserMapper接口是对应的-->
<mapper namespace="com.dayuan.dao.UserMapper">
<!--手动映射(推荐使用)-->
<resultMap id="userMap" type="User">
<!-- 此处需要注意,type="User",是因为mybatis-config.xml配置了<typeAliases>,
否则,type="com.dayuan.entity.User"
<typeAliases>
<package name="com.dayuan.entity"/>
</typeAliases>
-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="balance" property="balance"/>
<result column="card_no" property="cardNo"/>
<result column="pwd" property="pwd"/>
<result column="version" property="version"/>
<result column="sex" property="sex"/>
</resultMap>
<!--手动映射(推荐使用)-->
<resultMap id="userMap2" type="User">
<result column="card_no" property="cardNo"/>
<result column="pwd" property="pwd"/>
</resultMap>
<!--column="id":关联关系-->
<resultMap id="userMap3" type="User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="card_no" property="cardNo"/>
<collection property="streamsList" column="{userId=id}"
select="com.dayuan.dao.StreamMapper.listStreamByUserId"/>
</resultMap>
<!--公用字段-->
<sql id="baseSql">
id,name,balance,card_no,pwd,version,sex
</sql>
<select id="selectUserByCardNo" resultMap="userMap">
select
<include refid="baseSql"/>
from user where card_no = #{cardNo}
</select>
<update id="updateSexById">
update user set sex=#{sex} where id=#{id}
</update>
<!--
xml文件中的#{sex}和#{id}等#{xxxxxx}要与
com.dayuan.dao.UserMapper接口中的方法参数
@Param("sex")和@Param("id")等@Param("xxxxxx")一致
-->
</mapper>
5、简单使用
public class Test {
public static void main(String[] args) {
try {
//加载配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取SqlSessionFactory实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession实例(true:自动提交,默认非自动提交)
SqlSession session = sqlSessionFactory.openSession(true);
UserMapper userMapper = session.getMapper(UserMapper.class);
User user= userMapper.selectUserByCardNo("6225");
userMapper.updateSexById("1", 255);
} catch (IOException e) {
e.printStackTrace();
}
}
}