public class User {private Integer id;private String userName;private String password;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;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +'}';}}
import com.example.mybatis.domain.User;import com.example.mybatis.service.impl.UserServiceImpl;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 org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.InputStream;/*** @Description:* @Author: baxiang* @Date: 2021/8/31.*/public class UserServiceTest {private InputStream is;private UserService userService;private SqlSession sqlSession;@Beforepublic void setUp() throws Exception {String resource = "mybatis-config.xml";// 读取配置文件is = Resources.getResourceAsStream(resource);// 构建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 获取sqlSessionsqlSession = sqlSessionFactory.openSession();this.userService = new UserServiceImpl(sqlSession);}@Afterpublic void tearDown() throws Exception {sqlSession.commit();sqlSession.close();is.close();}@Testpublic void queryUserById() {System.out.println(this.userService.queryUserById(1));}@Testpublic void insertUser() {User user = new User();user.setUserName("test");user.setPassword("123456");this.userService.insertUser(user);this.sqlSession.commit();}@Testpublic void updateUser() {User user = new User();user.setId(1);user.setUserName("Test1");user.setPassword("654321");this.userService.updateUser(user);this.sqlSession.commit();}@Testpublic void deleteUserById() {this.userService.deleteUserById(1);this.sqlSession.commit();}}
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 根标签 --><configuration><!-- 属性 --><properties><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false&characterEncoding=utf-8&allowMultiQueries=true"/><property name="username" value="root"/><property name="password" value="123456"/></properties><!-- 全局设置 --><settings><!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键值 --><setting name="useGeneratedKeys" value="true"/><!-- 开启驼峰命名转换 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 环境,可以配置多个,default:指定采用哪个环境 --><environments default="dev"><!-- id:唯一标识 --><environment id="dev"><!-- 事务管理器,JDBC类型的事务管理器 --><transactionManager type="JDBC" /><!-- 数据源,池类型的数据源 --><dataSource type="POOLED"><property name="driver" value="${driver}" /> <!-- 配置了properties,所以可以直接引用 --><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><mappers><mapper resource="mappers/UserMapper.xml" /></mappers></configuration>
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:命名空间,保证命名空间唯一 -->
<mapper namespace="UserMapper">
    <!--获取用户-->
    <select id="selectUser" resultType="com.example.mybatis.domain.User">
        SELECT
            id ,
            user_name ,
            password
        FROM
            user
        WHERE id = #{id};
    </select>
    <!--插入数据-->
    <insert id="insertUser" parameterType="com.example.mybatis.domain.User">
        INSERT INTO user (
            user_name,
            password
        )
        VALUES
            (
                #{userName},
                #{password}
            );
    </insert>
    <update id="updateUser" parameterType="com.example.mybatis.domain.User">
        UPDATE user
        <trim prefix="set" suffixOverrides=",">
            <if test="userName!=null">user_name = #{userName},</if>
            <if test="password!=null">password = #{password},</if>
        </trim>
        WHERE
        (id = #{id});
    </update>
    <delete id="deleteUser">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>
接口类
public interface UserService {
    /**
     * 根据id查询用户信息
     *
     * @param id
     * @return
     */
    User selectUser(Integer id);
    /**
     * 新增用户
     *
     * @param user
     */
    void insertUser(User user);
    /**
     * 更新用户信息
     *
     * @param user
     */
    void updateUser(User user);
    /**
     * 根据id删除用户信息
     *
     * @param id
     */
    void deleteUser(Integer id);
}
UserServiceImpl
�
import com.example.mybatis.domain.User;
import com.example.mybatis.service.UserService;
import org.apache.ibatis.session.SqlSession;
public class UserServiceImpl implements UserService {
    private SqlSession sqlSession;
    public UserServiceImpl(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
    @Override
    public User selectUser(Integer id) {
        return this.sqlSession.selectOne("UserMapper.selectUser", id);
    }
    @Override
    public void insertUser(User user) {
        this.sqlSession.insert("UserMapper.insertUser", user);
    }
    @Override
    public void updateUser(User user) {
        this.sqlSession.update("UserMapper.updateUser", user);
    }
    @Override
    public void deleteUser(Integer id) {
        this.sqlSession.delete("UserMapper.deleteUser", id);
    }
}
动态代理Mapper
- 接口->实现类->mapper.xml
 - 2、实现类中,使用mybatis的方式非常类似
 - 3、xml中的sql statement 硬编码到java代码中。
 
思考:能否只写接口,不写实现类。只编写接口和Mapper.xml即可?
因为在dao(mapper)的实现类中对sqlsession的使用方式很类似。因此mybatis提供了接口的动态代理。
import com.example.mybatis.domain.User;
public interface UserMapper {
    /**
     * 根据id查询用户信息
     *
     * @param id
     * @return
     */
    User selectUser(Integer id);
    /**
     * 新增用户
     *
     * @param user
     */
    void insertUser(User user);
    /**
     * 更新用户信息
     *
     * @param user
     */
    void updateUser(User user);
    /**
     * 根据id删除用户信息
     *
     * @param id
     */
    void deleteUser(Integer id);
}
,在UserMapper.xml中配置接口的全路径
mapper.xml namespace
如果希望使用mybatis通过的动态代理的接口,就需要namespace中的值,和需要对应的Mapper(dao)接口的全路径一致。Mapper中Namespace的定义本身是没有限制的,只要不重复即可,但如果使用Mybatis的DAO接口动态代理,则namespace必须为DAO接口的全路径,例如:com.example.mybatis.mapper.UserMapper
�
// 1. 映射文件的命名空间(namespace)必须是mapper接口的全路径         
// 2. 映射文件的statement的id必须和mapper接口的方法名保持一致         
// 3. Statement的resultType必须和mapper接口方法的返回类型一致        
 // 4. statement的parameterType必须和mapper接口方法的参数类型一致(不一定)
