MyBatis快速入门
先说说缘由为啥今天才来学习和总结MyBatis。。
我自己学Springboot刚入门的时候,用SptingBoot+JdbcTemplate+Thymeleaf 搭建了一个bug管理平台
后来自己用自己的接口,测试DB连接数对性能的影响,TPS会特别受到程序中连接池的配置影响
后来DB中就涌现了很多数据,我的bug管理平台,有一个接口是列出所有的bug,这个页面就会特别特别地慢,于是想到分页。
在网上查找分页信息的时候,发现大多数都是针对MyBatis的,用JdbcTemplate的查询,将没有现成的分页插件,需要自己改写JdbcTemplate中的一些方法,要添加页码和每页的条数
每天依旧,工作依旧。
忽然一日得闲,又开始自学SpringBoot,于是根据教程先用springboot+MyBatis+MyBatis插件 自动生成了Mapper和实体类。
难道MyBatis必须在SpringBoot框架中? 忽然冒出这样的疑问之后,就开始搜索MyBatis的历史,也开始最简单的学习。
mybatis是什么?最初开发出来做什么的?
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
http://blog.mybatis.org/ mybatis官方网站 --- 需要FQ
https://github.com/mybatis/mybatis-3/releases
下载第一个zip格式的,解压后如下图,其中有个pdf文档,可以参考用来配置mapper以及配置config文件。 License和Notice只是一些证书说明等,可以忽略。lib目录下是一些常搭配的jar包。
mybatis-xx.xx.x.jar 可以放置到自己的项目源中。用了maven的话,可以自己去找maven的路径。
mybatis是怎么用的呢?
不管是何种程序,持久化的数据都是重中之重。不可能让前段用户直接去操作数据库吧,这样都不安全,而且也不是任何一个人都会的。
所以要用程序编写页面,编写后台接口,让mybaits操作对象,就像操作数据库这么简单。
user表, user对象,一一对应
想查看,想更新,想新增,直接操作对象,就能存入持久化数据DB中
use test
select * from user
create table user(
id INT NOT NULL auto_increment primary key,
name VARCHAR(20),
age int,
phone varchar(20),
password varchar(20)
)ENGINE=InnoDB AUTO_INCREMENT=300;
insert user(name,age,phone,password) values ("王族 ",33,"18962811111","12345")
以上是创建了user表,接下来创建User对象
public class User {
private Integer id;
private String name;
private String phone;
private String password;
private Integer age;
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 String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(){
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
表和对象都有了,现在就是mybatis的作用了,首先要进行配置config.xml,然后配置映射文件UserMapper.xml.这些在刚下载的pdf中都有介绍,有例子。
上面是项目的目录结构,我创建的有点随意,下面l两个分别是config.xml 和UserMapper.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
<?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="useraaa"> <select id="selectById" parameterType ="int" resultType="com.test.mybatis.entity.User"> select * from user where id = #{id} </select> <select id="selectAll" resultType="com.test.mybatis.entity.User"> select * from user </select> <insert id="addUser" parameterType="com.test.mybatis.entity.User"> insert into user (name,age,phone,password) values(#{name},#{age},#{phone},#{password}) </insert> <update id="updateUser" parameterType="com.test.mybatis.entity.User"> update user set name = #{name},age =#{age},phone =#{phone},password = #{password} where id = #{id} </update> <delete id="deleteUserById" parameterType ="int"> delete from user where id = #{id} </delete> </mapper>
下面是如何读取配置文件config.xml,如何将UserMapper中的查询语句打印出表中的信息
用了testNG来测试,具体测试内容如下
import com.test.mybatis.entity.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.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
public class TestMyBatis {
@Test(description = "通过InputStream读取配置config文件")
public void TestInputStream() throws IOException {
String resource = "config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectById";
User user = session.selectOne(statement,300);
System.out.println(user);
session.close();
}
@Test(description = "通过Reader读取配置config文件")
public void Reader() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectById";
User user = session.selectOne(statement,300);
System.out.println(user);
session.close();
}
@Test(description = "读取所有的对象")
public void selectAll() throws IOException {
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader);
SqlSession session =sessionFactory.openSession();
String statement = "useraaa.selectAll";
List<User> user = session.selectList(statement);
System.out.println(user);
session.close();
}
}
以下是新增,更新,删除的测试,注意事物的提交【当前config.xml中可以配置,目前是JDBC,需要手动提交】
import com.test.mybatis.entity.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.testng.annotations.Test; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.List; public class TestMyBatis02 { @Test(description = "新增记录") public void Add() throws IOException { Reader reader =Resources.getResourceAsReader("config.xml"); SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader); SqlSession session =sessionFactory.openSession(); String statement = "useraaa.addUser"; User user= new User(); user.setName("may"); user.setAge(20); user.setPassword("12345678"); user.setPhone("18976532121"); int count = session.insert(statement,user); System.out.println(count); session.commit(); System.out.println(user); session.close(); } @Test(description = "更新记录") public void Update() throws IOException { Reader reader =Resources.getResourceAsReader("config.xml"); SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader); SqlSession session =sessionFactory.openSession(); String statement = "useraaa.updateUser"; User user= new User(); user.setId(300); user.setName("may"); user.setAge(20); user.setPassword("12345678"); user.setPhone("18976532121"); int count = session.update(statement,user); System.out.println(count); session.commit(); System.out.println(user); session.close(); } @Test(description = "删除记录") public void Delete() throws IOException { Reader reader =Resources.getResourceAsReader("config.xml"); SqlSessionFactory sessionFactory= new SqlSessionFactoryBuilder().build(reader); SqlSession session =sessionFactory.openSession(); String statement = "useraaa.deleteUserById"; int count = session.delete(statement,307); System.out.println(count); session.commit(); session.close(); } }
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>mybatis01</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
mybatis使用中要注意的地方?
1. config.xml 和 Mapper.xml 中的头部分要复制正确,是不一样的,config中是configration,后者是Mapper
2. config.xml中数据的连接url,驱动,用户名和密码要全部填写正确
3.UserMapper.xml中的namespace 要用到,之后读取的是namespace.select的id的值,如下
4. 有很多报错原因是两个xml中的路径没有写对,pay attention~
5. config.xml中有挺多可以讲的,
比如数据库的确定是由environments下的default值 与 enviroment下的id值来确定的,备注:也可以通过SqlSessionFactoryBuilder的第二个参数来强制指定
上图是缺省模式,默认config中的配置
上图进行了指定,要开发环境的数据库配置
比如 <transactionManager type="JDBC"/>表示事务提交方式是JDBC,即利用JDBC的方式处理事务,需要手动去commit,rollback和close操作
<transactionManager type="MANAFED"/>表示将事务交给其他组件去托管,比如spring,jboss,默认会关闭连接等
比如 <dataSource type="POOLED">,POOLED是指用数据库连接池;
<dataSource type="UNPOOLED">表示使用传统的JDBC模式,即每次访问数据库,均需要打开、关闭等数据库操作,每次打开关闭数据库通常比较消耗性能,一般不建议
<dataSource type="JNDI">表示从tomcat中间件中获取一个内置的数据库连接,数据库连接池,数据源,可以认为是pooled方式相似
6. mybatis的sql映射文件的UserMapper潜在约定:
1# 输入参数和输出参数,即parameterType和resultType在形式上都只能是一个
2# 输入参数parameterType如果是简单类型,即8个基本类型+String,是可以使用任何占位符的, #{xxx}
如果是对象类型,则必须是对象的属性,#{属性名}
一般,为了可读性,都会尽量写成 #{属性名}
3# 输出参数resultType,如果返回类型是一个对象,比如User对象,则无论返回一个还是多个,都写成User对象
比如resultType="com.test.mybatis.entity.User"