目录
1、Mapper接口和映射文件关系
2、Mapper接口和映射文件的命名规则
2.1 Mapper接口的命名规则
2.2 映射文件的命名规则
3、Mapper接口和映射文件的创建及增删改查的实现
3.1 Mapper接口和映射文件的创建
3.2 增删改查的实现
3.2.1表结构
3.2.2 创建表User对应的实体类
3.3.3 创建表User对应的Mapper接口
3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句
4、MyBatis核心配置文件关联Mapper接口和映射文件
5、测试Mapper接口中的方法
6、测试结果
1、Mapper接口和映射文件关系
个人理解为:Mapper接口类似于以前的Dao接口,映射文件类似于实现Dao接口中的各个方法。
在Mapper接口中定义了对数据库的各种操作方法,这些方法的实现需要在映射文件编写各种SQL语句。
2、Mapper接口和映射文件的命名规则
一个Mapper接口(映射文件)对应一个实体类,对应一张表的操作方法(SQL语句)。Mapper接口用于声明操作数据库的方法; MyBatis映射文件用于编写SQL,访问以及操作表中的数据。
MyBatis的Mapper接口的位置是src/main/项目名/mappers目录下;映射文件存放的位置是src/main/resources/mappers目录下。
2.1 Mapper接口的命名规则
表所对应的实体类的类名+Mapper
例如:表t_user,对应的实体类为User,所对应的Mapper为UserMapper。
2.2 映射文件的命名规则
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml 。
3、Mapper接口和映射文件的创建及增删改查的实现
3.1 Mapper接口和映射文件的创建
Mapper接口的创建和普通的Java接口创建方法相同。
映射文件的创建如下,mapper标签中的namespace属性是mapper接口的路径。
<?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="Mapper接口路径">
</mapper>
3.2 增删改查的实现
下面以表t_user为例创建Mapper接口和映射文件,实现基本的增删改查。
3.2.1表结构
t_user表的结构如查下所示:
3.2.2 创建表User对应的实体类
public class User {
private Integer id;
private String userName;
private String password;
private Integer age;
private char gender;
public User() {
}
public User(Integer id, String userName, String password, Integer age, char gender) {
this.id = id;
this.userName = userName;
this.password = password;
this.age = age;
this.gender = gender;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
3.3.3 创建表User对应的Mapper接口
import com.review.mybatis.pojo.User;
public interface UserMapper {
//添加用户
int insertUser(User user);
//根据用户名和密码删除用户
int deleteUser(String username,String password);
//修改用户信息
int modifyUser(User user,Integer id);
//根据用户名查询用户信息
User getUserByUsername(String username);
}
3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句
MyBatis中可以面向接口操作数据,要保证两个一致:
1、mapper接口的全类名和映射文件的命名空间(namespace)保持一致
2、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="com.review.mybatis.mapper.UserMapper">
<!-- int insertUser(User user);-->
<insert id="insertUser" >
insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
</insert>
<!-- int deleteUser(String username,String password);-->
<delete id="deleteUser">
delete from t_user where username=#{arg0} and password=#{arg1}
</delete>
<!-- int modifyUser(User user,Integer id);-->
<update id="modifyUser" >
update t_user set username=#{arg0.userName},password=#{arg0.password},age=#{arg0.age},gender=#{arg0.gender} where id=#{arg1}
</update>
<!-- User getUserByUsername(String username);-->
<select id="getUserByUsername" resultType="User">
select id,username,password,age,gender from t_user where username=#{arg0}
</select>
</mapper>
上述代码中mapper接口和映射文件要保证一致:
①mapper接口的全类名和映射文件的namespace一致
②mapper接口的方法的方法名和映射文件中的sql的id保持一致
执行UserMapper接口中的方法时,通过映射文件中属性id绑定的方法名执行Sql语句。
对于查询操作:resultType:设置结果类型,记查询的数据要转换成的java类型,代码中将数据转成User类型
MyBatis获取参数值的两种方式:${}和#{}。
${}的本质就是字符串拼接,#{}的本质就是占位符赋值;${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。
映射文件中无法识别Mapper接口方法中的形参,若mapper接口中的方法参数为一个时,可以用任何字符串表示该参数;若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值。
4、MyBatis核心配置文件关联Mapper接口和映射文件
通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写,方便UserMapper.xml文件中resultType属性的设置:
resultType=”User“等同于resultType="com.review.mybatis.pojo.User"
通过包设置类型别名如下所示:
<typeAliases>
<package name="com.review.mybatis.pojo"/>
</typeAliases>
以包的方式引入映射文件,在通过Mapper接口调用方法时,通过MyBatis核心配置文件查找到映射文件的位置,从而执行sql语句。但是以包的方式引入映射文件必须满足两个条件:
1、mapper接口和映射文件所在的包必须一致
2、mapper接口的名字和映射文件的名字必须一致
如下所示:
<mappers>
<package name="com.review.mybatis.mapper"/>
</mappers>
完整的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>
<!--
MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?
-->
<properties resource="jdbc.properties"/>
<typeAliases>
<package name="com.review.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456789"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.review.mybatis.mapper"/>
</mappers>
</configuration>
MyBatis配置文件:配置连接数据库的环境,实现数据库连接_qq_46053741的博客-CSDN博客
5、测试Mapper接口中的方法
创建一个测试类,测试Mapper接口中的方法:
import com.review.mybatis.mapper.UserMapper;
import com.review.mybatis.pojo.User;
import com.review.mybatis.utils.JdbcUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class UserMapperTest {
@Test
public void insertUser() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
//获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int isInsert=0;
isInsert=userMapper.insertUser(new User(null,"小黑子","1234",34,'男'));
if(isInsert>0){
System.out.println("数据添加成功");
}else{
System.out.println("数据添加失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void deleteUser() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
//获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int isDelete=0;
isDelete=userMapper.deleteUser("蔡徐坤","123456");
if(isDelete>0){
System.out.println("数据删除成功");
}else{
System.out.println("数据删除失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void modifyUser() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
//获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=new User(3,"小黑子","1234",30,'男');
int isModify=0;
isModify=userMapper.modifyUser(user,3);
if(isModify>0){
System.out.println("数据修改成功");
}else{
System.out.println("数据修改失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void getUserByUsername() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
//获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserByUsername("小黑子");
System.out.println(user);
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
}
代码中UserMapper接口无法实例化对象,因此采用UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
6、测试结果
int insertUser(User user)测试结果:
控制台:
数据库:
int modifyUser(User user,Integer id)测试结果:
控制台:
数据库:
User getUserByUsername(String username)测试结果:
控制台:
int deleteUser(String username,String password)测试结果:
控制台:
数据库: