这片文章是对自己学习的总结,学习材料是Java EE互联网轻量级框架整合开发 SSM框架(Spring MVC + Spring + Mybatis)和Redis实现。作者是杨开振,周吉文,梁华辉和谭茂华。电子工业出版社出版。
MyBatis简介
MyBatis是用来管理数据库资源的。传统操作数据库的方法比较繁琐,大部分代码用来连接和关闭数据库,而真正的业务代码只占了其中很小的一部分。使用MyBatis之后,开发者就不用花太多时间去管理数据库资源了,只需要专注于业务本身的代码即可。比如我们定义一个UserDao的接口,里面有findAll()方法用来查找所有用户。
public interface UserDao{
public List<User> findAll();
}
传统的写法是定一个UserDaoImpl实现类实现findAll()方法,然后在业务层才可以调用findAll方法,伪代码如下所示
public class UserDaoImpl implements UserDao{
public List<User> findAll(){...}
}
public class UserServiceImpl implements UserService{
public List<User> findAll(){
return new UserDaoImpl().findAll();
}
}
其中UserDaoImpl中的findAll方法就必然会涉及到管理数据库资源的代码,数据库的连接,关闭等操作。
如果我们使用Mybatis,就不需要写UserDaoImpl的内容,不存在UserDaoImpl这个类,只需要写一个配置文件,配置文件的关键内容如下所示
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
具体什么意思先不用管,只需要注意其中的sql语句。使用Mybatis之后,我们就不用管数据库的资源,只需要专注业务,也就是sql语句,select * from user。
数据库真正的逻辑就写在xml之中,那么我们我们业务层调用持久层的函数就是下面这种写法。
//先不管session是什么,只要知道业务层怎么调用持久层函数就行
SqlSession session = ctx.getBean("session");
List<User> users = userDao.findAll();
//对users进行一些操作
这写法很简单。
如何配置MyBatis
一般是在资源目录下添加mybatis-config.xml用来专门配置mybatis信息。
首先要先引入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">
之后加入<configuration>标签,mybatis的详细配置信息放在其中,比如数据库配置的信息,定义mysql语句的配置信息。
<configuration>
...
</configuration>
下面讲解configuration里的子标签
- <environment>标签
回想使用传统的JDBC方法,第一件事是获取Connection。而获取连接资源需要的参数如下所示
driver = com.mysql.cj.jdbc.driver
url = jdbc:mysql://localhost:3306/mybatis
username = root
password = 1234
这四个参数是获取Connection的必须参数,java语句很麻烦,但是使用Mybatis就比较容易,直接使用<environment>标签就可以。<environments>里就是定义数据库的配置信息。
<environments default="mysql">
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
enviromnets标签下的其它标签暂时不管。
现在数据库资源就配置完成了,接下来就该是配置业务信息。
- <mappers>标签
<mappers>标签下只有一个子标签<mapper>,示例如下。
<mappers>
<mapper resource="com/itheima/dao/UserDao.xml">
</mappers>
值得注意的信息就是resource,它的值表示之前配置的数据库连接要应用在dao层的哪些类之中。
com.itheima.dao就是目录名,在idea中我们放在resourceces之下,看下图。
UserDao和UserDao.xml的路径要“相对”一致。
那UserDao.xml的作用是什么?前面我们提到Mybatis不需要写UserDao接口的实现类也能实现功能,这是因为具体的实现不是被定义在类中,而是被定义在UserDao.xml中。所以UserDao.xml和UserDao的路径要“相对”一致。
接下这篇文章详细说了UserDao.xml里如何定义具体sql逻辑。
- <settings>标签
settings是用来规范整个Mybatis行为的。通过对一些键值对的设定,就可以改变Mybatis的行为。比如说数据库users表中有一列列名为user_id,实体类User中对应的成员变量是userId。Mybatis默认是要将实体类的成员变量和数据库属性名严格对应。比如映射器配置中的语句是
<mapper>
<select id="com.itheima.dao.UserDao" resultType="com.itheima.domain.User">
select user_id as userId from users
</select>
</mapper>
我们必须把user_id重名名为userId(和java实体内完全一样),这样才能将值赋给User类并返回。
但如果我们在<settings>中这样设置。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
那系统会自动为我们完成名称转化。数据库中的user_id会自动转成驼峰形式userId,user_name会自动转成userName,这样就简化了工作量。
<!--自动驼峰转换-->
<mapper>
<select id="com.itheima.dao.UserDao" resultType="com.itheima.domain.User">
select user_id from users
</select>
</mapper>
待续。。。。。。