1.mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
2.mybatis的优点
1、MyBatis是最简单的持久化框架,小巧并且简单易学。
2、MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
3、提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
4、提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
3.mybatis的缺点
对SQL语句依赖程度很高,导致数据库移植性差。比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
4.myatis入门demo
1.首先创建一个maven项目
image.png
image.png
image.png
- 将下面的 dependency 代码置于 pom.xml 文件中
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.frank</groupId>
<artifactId>mybatis-studying</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--配置mybatis需要的依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--数据库 mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
<scope>test</scope>
</dependency>
<!--junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
- 3.创建数据库和表信息
database structure for mybatis_test
CREATE DATABASE IF NOT EXISTS `mybatis_test` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
USE `mybatis_test`;
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `username`, `birthday`, `sex`, `address`) VALUES
(1, '王五', NULL, '2', NULL),
(10, '张三', '2014-07-10', '1', '北京市'),
(16, '张小明', NULL, '1', '河南郑州'),
(22, '陈小明', NULL, '1', '河南郑州'),
(24, '张三丰', NULL, '1', '河南郑州'),
(25, '陈小明', NULL, '1', '河南郑州'),
(26, '王五', NULL, NULL, NULL),
(27, 'gyf05', '2019-08-15', '2', '广州');
- 4.创建jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
- 5.创建xml映射配置文件: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="jdbc.properties"/>
<!-- 别名 包以其子包下所有类 头字母大小都行-->
<typeAliases>
<!-- <typeAlias type="com.frank.dao.model" alias="User"/> -->
<package name="com.frank.dao.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- Mapper的位置 Mapper.xml 写Sql语句的文件的位置 -->
<mappers>
<!-- 1.resource方式
在UserMapper.xml,定义namespace为mapper接口的地址,映射文件通过namespace找到对应的mapper接口文件
-->
<mapper resource="com.frank.dao.mapper/UserMapper.xml"/>
<!--2. class方式 class:指定 mapper接口的地址
遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同-->
<!-- <mapper class="com.com.frank.dao.mapper.UserMapper"/> -->
<!--3. 批量mapper扫描
遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同
-->
<!--<package name="com.com.frank.dao.mapper"/>-->
</mappers>
</configuration>
- 6.创建sql映射文件
<?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">
<!-- 写Sql语句 -->
<mapper namespace="com.frank.dao.mapper.UserMapper">
<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="com.frank.dao.model.User">
SELECT *
FROM user
WHERE id = #{id}
</select>
<!-- //根据用户名称模糊查询用户列表
#{} select * from user where id = ? 占位符 ? == '五'
${} select * from user where username like '%五%' 字符串拼接
-->
<select id="findUserByUsername" parameterType="String" resultType="com.frank.dao.model.User">
SELECT *
FROM user
WHERE username LIKE "%"#{haha}"%";
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="User">
<!--selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的model的主键里面,
keyProperty 对应的model中的主键的属性名,这里是 user 中的id,因为它跟数据库的主键对应
order AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,
这种适合那种主键不是自增的类型
resultType 主键类型 -->
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
</insert>
<!-- 更新 -->
<update id="updateUserById" parameterType="User">
UPDATE user
SET username = #{username}, sex = #{sex}, birthday = #{birthday}, address = #{address}
WHERE id = #{id}
</update>
<!-- 删除 -->
<delete id="deleteUserById" parameterType="Integer">
DELETE FROM user
WHERE id = #{id}
</delete>
</mapper>
- 开始测试
package com.frank.test;
import com.frank.dao.model.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @author :frank
* @date :2019-08-13 16:57
* @description : 测试
*/
public class MapperTest {
private SqlSession session;
@Before
public void before() throws IOException {
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//读取配置文件的配置信息,利用SqlSessionFactoryBuilder创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过SqlSessionFactory创建SqlSession。
session = sessionFactory.openSession();
}
@After
public void after() {
System.out.println("after.....关闭session");
// 关闭SqlSession。
session.close();
}
/**
* 查询:一条记录和多条记录
*
* @throws IOException
*/
@Test
public void findUser() throws IOException {
//查询一条结果
User user = session.selectOne("findUserById", 10);
System.out.println(user);
//查询多条结果
List<User> users = session.selectList("findUserByUsername", "小明");
System.out.println(users);
}
//删除用户
@Test
public void deleteUserById() throws IOException {
int affectRow = session.delete("deleteUserById", 27);
session.commit();//事务
System.out.println("受影响的行数:" + affectRow);
}
/**
* 插入后,往模型里设置id
*/
@Test
public void insertUser() throws IOException {
User user = new User("gyf05", "2", new Date(), "广州");
int affectRow = session.insert("insertUser", user);
session.commit();//事务
System.out.println("受影响的行数:" + affectRow);
System.out.println("用户的ID:" + user.getId());
}
}
5.工程结构
image.png代码全部测试通过!
网友评论