概念
Mybatis是一个用于替代DAO层(实现类)的框架
有了Mybatis层后,Dao层只需要接口,而不需要实现类.
这是因为Mybatis的配置文件带来的功能替代了实现类.
同样的,以后也不会用到JdbcTemplate了
准备
导入Jar包
一.导入数据库的驱动Jar包,此处我以Mysql数据库举例.
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
二.导入Mybatis的Jar包
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
二.创建核心配置文件
创建一个xml文件,用于Mybatis的核心配置.
文件名任意,但业内规范文件名为’sqlMapConfig.xml’
注意:文件头部的命名空间也要一并导入
具体配置参数详解可以参考如下图:
关于数据库连接池:
注意:当处于Mybatis模式下,那么默认的数据库连接池为Mybatis公司自己的连接池
名字为POOLED DataSource,即:’<dataSource type="POOLED">
’
但是Pooled DataSource连接池性能不如druid和c3p0.
如果我们要修改数据库连接池为duird或者c3p0,那么需要修改核心配置,但这么做非常麻烦.
所以,如果你在学习Mybatis阶段,可以用默认的Pooled DataSource连接池.
但在日常开发中,要更改连接池为druid或c3P0.
格式:
<?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="从以下的环境ID中选一个,用于耦合到Mybatis">
<!-- 你可以在配置多个数据库环境,并通过数据库环境的id选出其中一个当作来同Mybatis耦合.'default'的属性值为你所设置的某个数据库环境id -->
<environment id="自定义第一个数据库环境的ID">
<!-- 指定事务管理类型,如果指定为jdbc的事务管理类型,需要手动用commit方法来提交事务,以更新数据库的增删改 -->
<transactionManager type="指定事务管理类型,多数为'JDBC'"></transactionManager>
<!-- 指定要用哪种数据库连接池 可以直接用Mybatis自带的'POOLED'连接池
但性能不及c3p0和druid,如果想要使用后两者,则会相当麻烦,本篇幅先不介绍用法.默认格式
以POOLED连接池为准 -->
<dataSource type="指定当前数据源的连接池,学习时建议为Mybatis自带的连接池'POOLED'">
<!-- 为该数据池指定连接参数 -->
<property name="driver" value="该连接池的驱动包地址"/>
<property name="url" value="该数据库的链接地址:端口/数据库名称"/>
<property name="username" value="该数据库的账号"/>
<property name="password" value="该数据库密码"/>
</dataSource>
</environment>
<environment id="自定义第二个数据库环境的ID">
<transactionManager type="指定事务管理类型,多数为'JDBC'"></transactionManager>
<dataSource type="指定当前数据源的连接池,多数为Mybatis自带的连接池'POOLED'">
<property name="driver" value="该连接池的驱动包地址"/>
<property name="url" value="该数据库的链接地址:端口/数据库名称"/>
<property name="username" value="该数据库的账号"/>
<property name="password" value="该数据库密码"/>
</dataSource>
</environment>
</environments>
<!-- 加载用于替代Dao实现类的SQL配置文件 -->
<mappers>
<mapper resource="配置文件在resource目录下的相对路径"></mapper>
</mappers>
</configuration>
列如:
<?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="jdbcId">
<environment id="jdbcId">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/tarveltest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载用于替代Dao实现类的SQL配置文件 -->
<mappers>
<mapper resource="cn/mybatistest/dao/UserDao.xml"></mapper>
</mappers>
</configuration>
三.创建SQL操作配置文件
步骤一:创建
SQL语句配置文件用于耦合Dao层的接口,并根据接口中的方法去进行对应的sql操作.
配置文件的格式为xml,配置文件的路径和名称必须同Dao层的实现类完全一致.
步骤二:耦合目标Dao层的接口
mapper围堵标签用于对指定的Dao接口耦合,并将指定的SQL语句应用到起接口中的指定方法上.
其中namespace属性用于通过Dao接口的路径来耦合Dao接口.
你通过定义多个mapper围堵标签来耦合多个不同的接口.
格式:
<?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="要耦合的第一个Dao接口之路径">
//SQL语句操作的代码体
</mapper>
<mapper namespace="要耦合的第二个Dao接口之路径">
//SQL语句操作的代码体
</mapper>
<mapper namespace="要耦合的第三个Dao接口之路径">
//SQL语句操作的代码体
</mapper>
应用步骤一:SQL操作配置
注意:本篇章介绍的配置方式存在问题,因为实际上未完全应用到Dao接口.
比如无法实际应用到接口方法中的参数.所以当作参考即可.
真正的实际应用方法在Mybatis下一篇文章.
我们可以分别通过select,insert,update,delete这四个围堵标签来耦合指定Dao接口中的指定方法,并通过在其中定义对应的SQL语句来完成增删改查.
这四个围堵标签必须要被在mapper围堵标签内定义.
应用于查询数据
格式:
<mapper namespace="指定要耦合的Dao接口之路径">
<select id="指定Dao接口中要耦合的方法名" resultType="指定一个实体类的路径,用于以List集合对象的形式存放查询结果">
此处定义SQL查询语句
</select>
</mapper>
列如:
<mapper namespace="cn.mybatistest.dao.UserDao">
<!-- id属性值必须为Dao接口类中的方法名 resultType属性值必须为实体类的文件路径 它用来让Mybatis作为Dao实现类,自动设置返回值类型,并进行数据封装 -->
<select id="findInfo" resultType="cn.mybatistest.domain.User">
SELECT * FROM userinfo
</select>
</mapper>
应用于数据添加操作
格式:
<mapper namespace="指定要耦合的Dao接口之路径">
<insert id="指定Dao接口中要耦合的方法名" parameterType="指定一个实体类的路径,用来将其成员变量的数值和列名耦合">
INSERT INTO 表名 VALUES(#{实体类成员变量名})
</insert>
</mapper>
列如:
<mapper namespace="cn.mybatistest.dao.UserDao">
<insert id="userAdd" parameterType="cn.mybatistest.domain.User">
INSERT INTO userinfo VALUES(#{id},#{username},#{password})
</insert>
</mapper>
应用于数据修改操作
格式:
<mapper namespace="指定要耦合的Dao接口之路径">
<update id="指定Dao接口中要耦合的方法名" parameterType="指定一个实体类的路径,用来将其成员变量的数值和列名耦合">
UPDATE 表名 SET 列名=#{实体类成员变量名} WHERE 列名=#{实体类成员变量名}
</update>
</mapper>
列如:
<mapper namespace="cn.mybatistest.dao.UserDao">
<update id="userSet" parameterType="cn.mybatistest.domain.User">
UPDATE userinfo SET username=#{username} WHERE id=#{id}
</update>
</mapper>
应用于数据删除操作
注意:当只有一个参数,而且参数是简单(基本)类型的时候, #{}里边无论写啥, 都是获取参数本身
格式:
<mapper namespace="指定要耦合的Dao接口之路径">
<delete id="指定Dao接口中要耦合的方法名" parameterType="java.lang.Integer">
DELETE FROM 表名 WHERE 列名=#{实体类成员变量名}
</delete>
</mapper>
列如:
<mapper namespace="cn.mybatistest.dao.UserDao">
<delete id="userDelete" parameterType="java.lang.Integer">
DELETE FROM userinfo WHERE 列名=#{实体类成员变量名}
</delete>
</mapper>
应用步骤二:执行SQL命令
我们既然在SQL操作配置的文件中配置好了SQL命令
但是我们还未执行,既然要执行,就必须要创建一个类,该类用于充当Service层.
一.创建实体类对象并通过set方法赋值
之所以这么做,是为了通过实体类对象的set方法,将我们欲充填的sql语句参数赋值到实体类对象中.然后把实体类对象作为一个参数,用于执行sql语句.
这一点,同传统的dao实现类的操作方法一样.
列如:
User userObj = new User();
userObj.setUsername("nihao");
userObj.setPassword("testpassword");
二.加载核心配置文件,并返回一个io流对象
格式:InputStream 自定义配置文件IO流对象名 = Resources.getResourceAsStream("核心配置文件名.xml");
列如:
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
三.通过io流对象,获得sqlSession工厂对象
格式:SqlSessionFactory 自定义sqlSeesion工厂对象名 = new SqlSessionFactoryBuilder().build(自定义配置文件IO流对象名);
列如:
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream);
四.通过sqlSession工厂对象,获得sqlSession对象
格式:SqlSession 自定义sqlSession对象名 = 自定义sqlSession工厂对象名.openSession();
列如:
SqlSession sqlSession = sqlSessionFactory.openSession();
五.执行sql语句,同时将实体类对象作为sql语句的充填参数来传入
1.执行查询语句
之格式:
List<实体类名> 自定义查询结果接收名 = 自定义sqlSession对象名.selectList("Dao接口的路径.对应的方法名");
列如:
List<User> userList = sqlSession.selectList("userMapper.findAll");
2.执行数据添加
语句之格式:
自定义sqlSession对象名.insert("Dao接口的路径.对应的方法名",实体类对象名);
列如:
sqlSession.insert("cn.mybatistest.dao.UserDao.userAdd",userObj );
3.执行数据修改
语句之格式:
自定义sqlSession对象名.update("Dao接口的路径.对应的方法名",实体类对象名);
列如:
sqlSession.update("cn.mybatistest.dao.UserDao.userSet",userObj );
4.执行数据删除
语句之格式:
自定义sqlSession对象名.delete("Dao接口的路径.对应的方法名",基本数据类型的数据);
列如:
sqlSession.delete("cn.mybatistest.dao.UserDao.userDelete",2 );
六.提交事务,让其操作生效
如果我们使用JDBC来当作事务管理器,那么JDBC就默认开启了事务,
因此在进行增删改操作后,需要通过’commit’方法来提交事务,完成数据表的更新.
格式: 自定义sqlSession对象名.commit();
七.释放资源
格式:自定义sqlSession对象名.close();