为什么使用MyBatis?
目前使用开发遇到的问题
A、每一个操作对应的使用Dao中的方法,每一个方法中都需要连接数据库,这样我们连接数据库的代码就需要写好多次
B、如果我们做的是查询的操作,从rs中取值是一个比较麻烦,而且影响开发效率的问题
解决方案:
(1)提取DBUtil工具类即可
优点:不用在每一次书写连接数据库的操作
缺点:传统的JDBC连接数据库的效率非常慢
(2)使用数据库连接池连接数据库
优点:连接数据库的速度比较快
缺点:没有办法实现SQL语句和java代码之间的解耦
(3)使用MyBatis框架
作用:[1]解决了SQL语句和java代码之间的耦合
[2]连接数据库的效率也比较快
[3]取值问题就会变得非常的简单
Mybatis使用:
1、导入mybatis核心包及其依赖还有mysql驱动包,在module下创建一个lib目录来存放项目所需jar包
2、书写配置mybatis.xml
①在src下创建mybatis.xml文件
②在xml文件中添加mybatis头部声明
<?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">
③填写mybatis.xml配置信息【只介绍最重要的部分,很多细节太多,自主看chm文档】
<?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="mysql">
<!--default中填写所配置的environment的id,
表示默认使用的数据库环境,
可以有多个<environment>标签 -->
<!-- environment 元素体中包含对事务管理和连接池的环境配置。
-->
<!--MySQL数据库连接-->
<environment id="mysql">
<!--MyBatis中的事务管理,type有两种取值,
填写JDBC表示目前的事务管理和JDBC中的事务保持一致,
还有一种是 MANAGED 表示MyBatis不去管理事务,交给其他容器进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!--底层使用连接池连接数据库-->
<!--type有三种取值:
①POOLED使用连接池技术. 访问频率比较高时使用.
连接池的使用可以降低服务器压力,提高连接对象重用性,跟数据库连接池原理一样
通过连接池先和数据库进行连接,当使用时从连接池中拿取连接,降低连接时间
②UNPOOLED不使用连接池技术.每次对数据库访问时打开数据库连接,
访问结束后关闭数据库连接.
③JNDI : java命名目录接口.数据库的连接可以依赖于其他技术或应用.
-->
<!--dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis2?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
<!--ORCL数据库-->
<!-- <environment id="orcl">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>-->
</environments>
<!--进行mapper文件的扫描-->
<mappers>
<!--resource:书写的是XML所在的目录-->
<!--告诉mybatis上哪去找sql映射文件-->
<!--mapper常用属性,两个
①resource="com/bjsxt/xxx.xml" 加载项目中资源文件 ,使用相对路径的
②url="" 加载互联网或本机的配置文件,使用绝对路径的
<mapper url="file:///E:/FlowerMapper.xml"/>
-->
<mapper resource="com/bjsxt/mapper/FlowerMapper.xml"></mapper>
</mappers>
</configuration>
3、配置mapper.xmlSQL映射文件,注意该文件的头部声明文件和mybatis.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.sw.mapper.FlowerMapper">
<!-- namespace 随便写
但是规范一点的写法是,在namespace填写xml文件在src下的路径
-->
<!--
List<Flower> selectAll();
id:方法名称
resultType:返回值类型
查询返回的时候一般不是对象就是集合
如果返回值是一个对象,就写对象所在包的全路径
如果返回值是一个集合,这个时候书写集合的泛型类的全路径
-->
<select id="selectAll" resultType="com.bjsxt.entity.Flower">
SELECT * from flower
</select>
</mapper>
测试代码Test:
public class TestA {
public static void main(String[] args) throws IOException {
//解析XML文件
InputStream stream = Resources.getResourceAsStream("mybatis.xml");
//获得session工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);
//获得session对象
SqlSession session = factory.openSession();
//调用方法,selectList中填写方法的全路径
List<Flower> list = session.selectList("com.sw.mapper.FlowerMapper.selectALL");
System.out.println(list);
//关闭资源
session.close();
}
}