引入
总结,使用mapper代理开发的好处就是可以解决开发中硬编码的问题和简化后期的SQL执行。使用这种方式可以不用写接口的实现类,免除了复杂的方法,使得代码更加清晰易懂按照以前的DAO 开发模式 ,我们有一个写了一个接口类 然后需要写这接口的实现类,现在就是MyBATis 通过帮我们生成了这个实现了。而我们要做的就是配置好这实现类的 XML。
在不使用mapper开发时,我们需要将名称空间和SQL的id传入到sqlSession的参数里面去,而且我们发现里面的参数是写死的,这就是硬编码问题:
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("test.selectAll");//这里的参数
在Mapper的配置文件里,将来写了很多SQL语句时你还需要一个个查找其id,相当麻烦。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="selectAll" resultType="sdut.jsjxy.pojo.User">
select * from tb_user;
</select>
</mapper>
如果使用mapper代理开发,则如下代码替换为:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();//这里的方法
UserMapper会成为一个接口,一旦获取mapper之后,则可以直接调用其SQL方法。
Mapper代理开发要求
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
设置SQL映射文件的namespace属性为Mapper接口全限定名
在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
通过SqISession的getMapper方法获取Mapper接口的代理对象并调用对应方法完成sql的执行
解析要求
第一步完成之后的开发目录:
![](https://i-blog.csdnimg.cn/blog_migrate/32b70ceea71c8f4d063935d498f929a2.png)
设置属性名:
这里的namespace的路径名应该改成接口的路径
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sdut.jsjxy.mapper.UserMapper">//这里的路径
<select id="selectAll" resultType="sdut.jsjxy.pojo.User">
select * from tb_user;
</select>
</mapper>
在接口里面返回一个User实体类对象,并且是List类型的(我们这里的案例是查询所有,故必须要返回一个集合类型)。
所以Mapper接口里面的代码应为:
public interface UserMapper {
List<User> selectAll();
}
配置工作都已完成,我们新建一个main方法测试一下。
package sdut.jsjxy;
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 sdut.jsjxy.mapper.UserMapper;
import sdut.jsjxy.pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisDemo2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();//前面提到的
System.out.println(users);
sqlSession.close();
}
}
输出结果为:
![](https://i-blog.csdnimg.cn/blog_migrate/579cc5d1901b9c27210a6326aeb381d9.png)
MyBatis核心
核心配置文件
我们回归头来分析一下mybatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://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/mybatis?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="sdut/jsjxy/mapper/UserMapper.xml"/>-->
<package name="sdut.jsjxy.mapper"/>
</mappers>
</configuration>
<environments>环境信息
这里是配置数据库信息的地方,我们可以在里面配置多种数据库的连接信息,例如在实际开发中会有生产库和测试库。添加新的环境只需要修改<environment>里面信息即可,比如基本的修改数据库的名称等。通过default属性切换不同的environment。
<typeAliases>类型别名
在mybatsi的范围内为某一个具体的类型设置一个别名,并可以用别名来表示。
<typeAliases>
<typeAlias type="sdut.jsjxy.pojo.User"/>
</typeAliases>
这里面的type属性就是设置起别名的类型,其中还有一个aligs属性是设置别名的名称,例如aligs="abc"的含义就是把type里的类型名称用"abc"来替代。这个属性大多数情况下是不用写的如果不写的话,那别名启动设置为他的类名切不区分大小写,这里就是"user"或"User"。这是映射文件里的SQL语句的代码就是:
<select id="selectAll" resultType="user">
select * from tb_user;
</select>
即替换了resultType的属性值为别名,不用写一串路径了。
<mappers>映射文件的引入
这里可以用包的方式引入映射文件。之前我们是用<mapper resource = "">的方式引入,当我们的映射文件一多就需要一个个找了,是十分麻烦的。我们使用包扫描方式引入映射文件,就可以利用IDE的自动补全功能快速引入。
<mappers>
<package name="sdut.jsjxy.mapper"/>//使用包扫描自动补全
</mappers>
但使用包扫描的前提是mapper接口和映射文件所在的包必须一致,mapper接口的名字和映射文件的名字必须一致,这一点我们之前创建文件时就做好了。(见上面的目录图片)所以以后我们把映射文件都创建在resources的mapper包下就好了。
![](https://i-blog.csdnimg.cn/blog_migrate/97a230bf0ab87080d763aade5b2b04d1.png)
设置核心配置的模板
到这里mapper的核心配置文件已经讲解完了,那么之后在创建时也拥有了相应的模板,我们在idea里创建一个模板即可。这里给大家展示一下我的模板(注意我的mysql是8.0以上的版本,其他版本写法有所不同),其中[]里的内容是可以换的,大家换成自己的即可,还有数据库账号密码啥的。
![](https://i-blog.csdnimg.cn/blog_migrate/5e2118fb38d21ce58731531cd59d9611.png)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="[类型路径]"/>
</typeAliases>
<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/[数据库名]?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="[映射文件所在包名]"/>
</mappers>
</configuration>