前面使用了jdbc来连接数据库,有许多底层的连接和查询代码,参数设置需要我们自己去做。MyBatis是一个良好的框架帮助我们连接数据库
MyBatis
概念:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
a) 程序员在使用框架的时候,通常以配置文件的方式告知框架需要的信息,多数会使用 xml 作为框架的配置文件.
-
b) 因此, 在使用框架开发代码时, 需要编写配置文件, 代码的编写反而会减少.
-
c) 框架都是第三方提供的, 提供的都是 jar 包. 因此, 使用框架前, 必须将框架涉及的 jar 包导入项目中.
MyBatis 环境搭建 jar 包详解
MyBatis 核心 jar
mybatis-3.2.7.jar
MyBatis 依赖的 jar
asm-3.3.1.jar 字节码解析包, 被 cglib 依赖
cglib-2.2.2.jar 动态代理的实现
commons-logging-1.1.1.jar 日志包 javassist-3.17.1-GA.jar 字节码解析包
log4j-1.2.17.jar 日志包
log4j-api-2.0-rc1.jar 日志
log4j-core-2.0-rc1.jar 日志
slf4j-api-1.7.5.jar 日志
slf4j-log4j12-1.7.5.jar 日志
驱动 jar
mysql-connector-java-5.1.48.jar
构建第一个MyBatis项目来连接数据库
先构建一个web项目,在web.WEB-INF下构建lib包,将需要的jar包导入
MyBatis 核心配置文件
要求
是一个 xml 文件 , 命名无要求 , 位置无要求 , 一般叫 mybatis.xml或applicationContext-dao.xml, 放在 src 目录下.
dtd:MyBatis 官方提供了applicationContext-dao的 dtd 约束, 方便 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">
applicationContext-dao.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"/> <!--使用事务管理沿用JDBC的事务-->
<dataSource type="POOLED"> <!--使用连接池-->
<property name="driver" value="oracle.jdbc.OracleDriver"/> <!--驱动-->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><!--要连接的数据库-->
<property name="username" value="servlet"/><!--用户名-->
<property name="password" value="servlet"/><!--密码-->
</dataSource>
</environment>
</environments>
Mapper 映射文件
在 MyBatis 中, 推荐使用 mapper 作为包名, 我们只需要写一个映射配置文件即可. UserMapper.xml, 用于定义要执行的 SQL 语句, 同时设定返回结果的类型.
dtd:MyBatis 官方提供了 mappar的dtd 约束, 方便 xml 的编写
<?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">
UserMapper.xml:
<?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="com.batis.mapper.UserMapper"> <!--这是名称空间的值写当前配置文件所在的包的包名-->
<select id="selByName" resultType="com.batis.pojo.User">
select * from t_user where uname = '李四'
</select>
</mapper>
在核心配置文件中添加 mapper 扫描
<!--扫描mybatis的sql语句所在的文件-->
<mappers>
<mapper resource="com/batis/mapper/UserMapper.xml"></mapper>
</mappers>
applicationContext-dao.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"/> <!--使用事务管理沿用JDBC的事务-->
<dataSource type="POOLED"> <!--使用连接池-->
<property name="driver" value="oracle.jdbc.OracleDriver"/> <!--驱动-->
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/><!--要连接的数据库-->
<property name="username" value="servlet"/><!--用户名-->
<property name="password" value="servlet"/><!--密码-->
</dataSource>
</environment>
</environments>
<!--扫描mybatis的sql语句所在的文件-->
<mappers>
<mapper resource="com/batis/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
编写测试代码
TestBatis:
package com.batis.test;
import com.batis.pojo.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.Test;
import java.io.IOException;
import java.io.Reader;
public class TestBatis {
@Test
public void test() throws IOException {
//加载MyBatis的核心配置文件,通过流的方式读取,注意配置文件要放在src目录下
Reader in = Resources.getResourceAsReader("applicationContext-dao.xml");//字符流
//通过配置文件构建工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//通过工厂类构建发送sql语句的session对象,事务是手动提交的
SqlSession session = factory.openSession();
Object user = session.selectOne("com.batis.mapper.UserMapper.selByName");//传入命名空间加sql的id,返回值为object
//默认会封装成对象,类型在com.batis.mapper.UserMapper的resulttype中
User u = (User)user;
System.out.println(u);
}
}
运行结果:
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58288:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectOne
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User{tid=12, uname='李四', pwd='123456', sex=1}
Process finished with exit code 0
MyBatis 中常用的三个查询方法
1 selectList
用于查询多条数据的情况, 返回值是一个 list 集合. 如果没有查到任何数据, 返回没有元素的集合(空集合, 不是 null)
2 selectOne
用于查询单条数据的情况, 返回值是一个对象. 如果没有查到任何数据, 返回null
3 selectMap
用于查询多条数据的情况, 多条数据要形成一个 Map 集合. 需要指定哪个属性作为 key. 如果查不到, 返回一个空 map 集合(不是 null)
例子:
UserMapper.xml:
<?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="com.batis.mapper.UserMapper"> <!--这是名称空间的值写当前配置文件所在的包的包名-->
<select id="selByName" resultType="com.batis.pojo.User">
select * from t_user where uname = '李四'
</select>
<select id="selAll" resultType="com.batis.pojo.User"><!--返回值是集合,则返回集合的泛型即可-->
select * from t_user
</select>
</mapper>
TestBatis:
package com.batis.test;
import com.batis.pojo.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.Test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import java.util.Map;
public class TestBatis {
private SqlSession session;
public TestBatis() throws IOException{
//加载MyBatis的核心配置文件,通过流的方式读取,注意配置文件要放在src目录下
Reader in = Resources.getResourceAsReader("applicationContext-dao.xml");//字符流
//通过配置文件构建工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//通过工厂类构建发送sql语句的session对象,事务是手动提交的
session = factory.openSession();
}
@Test
public void selectOne() {
User user = session.selectOne("com.batis.mapper.UserMapper.selByName");//传入命名空间加sql的id,返回值为object
//默认会封装成对象,类型在com.batis.mapper.UserMapper的resulttype中
System.out.println(user);
}
@Test
public void selectAll(){
List<User> list = session.selectList("com.batis.mapper.UserMapper.selAll");
System.out.println(list);
}
@Test
public void selectAll2(){
Map<User, Integer> tid = session.selectMap("com.batis.mapper.UserMapper.selAll", "tid");
System.out.println(tid);
}
}
运行结果:
selectAll():
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58273:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectAll
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[User{tid=12, uname='李四', pwd='123456', sex=1}, User{tid=10, uname='王五', pwd='123456', sex=1}, User{tid=11, uname='张三', pwd='123456', sex=1}, User{tid=5, uname='李超', pwd='123', sex=0}, User{tid=6, uname='赵飞燕', pwd='123456', sex=0}]
Process finished with exit code 0
selectAll2():
D:\Java\jdk-14.0.1_windows-x64_bin\jdk-14.0.1\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=58306:D:\JAVA\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\JAVA\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit5-rt.jar;D:\JAVA\IntelliJ IDEA 2019.3.2\plugins\junit\lib\junit-rt.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\out\production\firstmybatis;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\asm-3.3.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\cglib-2.2.2.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\commons-logging-1.1.1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\javassist-3.17.1-GA.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\junit-4.9.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-1.2.17.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-api-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\log4j-core-2.0-rc1.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mybatis-3.5.3.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\mysql-connector-java-5.1.48.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\ojdbc6.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-api-1.7.5.jar;D:\JAVA\JavaProject\Day\MyBatis\firstmybatis\web\WEB-INF\lib\slf4j-log4j12-1.7.5.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.batis.test.TestBatis,selectAll2
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
{5=User{tid=5, uname='李超', pwd='123', sex=0}, 6=User{tid=6, uname='赵飞燕', pwd='123456', sex=0}, 10=User{tid=10, uname='王五', pwd='123456', sex=1}, 11=User{tid=11, uname='张三', pwd='123456', sex=1}, 12=User{tid=12, uname='李四', pwd='123456', sex=1}}
Process finished with exit code 0