一、新增maven项目,引入mybatis依赖
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
项目结构:
二、创建user表
create table user(
id int(10) primary key not null auto_increment,
username varchar(10),
password varchar(10)
);
三、编写user实体类
此处省略get、set方法
四、编写映射配置文件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.review.mapper.UserMapper">
<sql id="selectUser">select * from user</sql>
<select id="findAll" resultType="user">
select * from user
</select>
<select id="findById" resultType="user" parameterType="int">
select * from user where id=#{id}
</select>
<insert id="addUser" parameterType="com.review.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into user(username, password) values(#{username}, #{password})
</insert>
<update id="updateUser" parameterType="com.review.pojo.User" >
update user set username=#{username}, password=#{password} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<select id="findByCondition" parameterType="user" resultType="user">
<include refid="selectUser"></include>
<where>
<if test="id != null">
and id=#{id}
</if>
<if test="username != null">
and username=#{username}
</if>
</where>
</select>
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"></include>
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
</mapper>
说明:
xml约束头:mapper
namespace:命名空间
resultType:返回结果类型
parameterType:参数类型
sql:公共sql抽取
include:引用抽取公共部分
易错点:
1)insert into user(username, password) 此处对应的字段名称,不应加 ‘’
2)sql语句中使用 #{} 引用参数,例如:#{id}
五、编写核心配置文件SqlMapConfig.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>
<!--加载外部的properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--打印日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<typeAliases>
<!--单个实体的别名-->
<!--<typeAlias type="com.lagou.pojo.User" alias="user"></typeAlias>-->
<!--整个包下的别名,默认为实体首字母小写-->
<package name="com.review.pojo"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--方式一:引入单个xml文件,xml文件路径-->
<!--<mapper resource="com/mapper/UserMapper.xml"/>-->
<!--方式二:使用mapper接口路径,要求:mapper接口名称与mapper映射配置文件名称一致-->
<!--<mapper class="com.review.mapper.UserMapper"/>-->
<!--注册指定包下的所有mapper接口,要求mapper接口与mapper映射配置文件同包同名-->
<package name="com.review.mapper"/>
</mappers>
</configuration>
jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://x.x.x.x:3306/x
jdbc.username=root
jdbc.password=Root!!2020
说明:
xml约束头:configuration
environments :环境,可建立多个environment ,对应开发环境,生产环境
transactionManager:事务管理器
dataSource:数据源
typeAliases:类型别名。可以整包引入,默认为实体类的首字母小写
mappers:引入映射配置文件
properties :引入外部配置文件
setting:设置日志打印
易错点:
此处引入映射配置文件不会反显出来,一般会出现找不到资源的问题
解决方法:以下两种方案供选择
在确保引入映射配置文件路径正确的前提下
①删除编译后的target文件,重新编译
②将UserMapper.xml文件手动放入 target对应目录中
六、编写测试类
//1.加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SQLSession工厂对象
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3.获取SQLSession对象
SqlSession sqlSession = sessionFactory.openSession(true);
/**
* 调用sqlSession接口自带方法
* @throws IOException
*/
@Test
public void findAll() throws IOException {
List<User> list = sqlSession.selectList("userMapper.findAll");
for (User user : list) {
System.out.println(user);
}
}
/**
* 传统ddao层接口测试
*/
@Test
public void testTraditionDao(){
UserDao userDao = new UserDaoImpl();
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
/**
* 代理接口测试
*/
@Test
public void testMapperDao(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(mapper.findById(1));
}
执行结果:
七、总结
mapper代理方式是采用jdk动态代理方式实现,底层仍使用sqlSession接口API访问数据库
本次开发顺序:sqlSession自带接口 --> 传统dao层开发 --> mapper代理方式开发
mapper代理方式开发注意事项:
1)mapper.xml的namespace必须与mapper接口的全限定类名一致
2)mapper接口方法名和mapper.xml中定义的每个statement的id一致
3)mapper接口方法的参数类型和mapper.xml中parameterType一致
4)mapper接口方法的返回类型和mapper.xml中resultType一致