mybatis系列笔记---mapper代理方法

Posted 雨点的名字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis系列笔记---mapper代理方法相关的知识,希望对你有一定的参考价值。

mapper代理方法

在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类

当然这得需要遵守一些相应的规则:

(1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下:

(2)mapper.xmlnamespace等于mapper接口的地址

(3)Usermapper.java接口中国的方法名和Usermapper.xmlstatementid一致

<!-- 7综合查询 -->
      <select id="findUserCount" parameterType="com.study.model.User" resultType="int">
          select count(*) from user where user.sex=#{userCustomer.sex} and user.username like \'%${userCustomer.username}%\'
      </select> 

如果你在Usermapper.xml配置上面这些属性那么你所写的接口就必须:

1     /*findUserCount接口的名字必须和id属性一致
2      * 传入的参数必须和parameterType是一致,前面是user这里也是user
3      * 返回类型resultType是int类型,那么这里也必须是int类型
4      */
5     public int findUserCount(User user);

(4)SqlMapConfig.xml中加载mapper.xml

1 <mappers>
2     <!-- 这里是之前加载所写的 -->
3     <!--     <mapper resource="sqlmap/User.xml" /> -->
4         <!-- 通过mapper接口 加载单个映射文件 必须遵循一些规范: 需要将mapper接口和mapper.xml映射文件 文件名必须一致 并且在同一个目录下 -->
5         <mapper class="com.study.mapper.UserMapper" /> 
6     
7     </mappers>

(5)通过mapper代理方法进行增删改查

a.编写user对象

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
/*
 *提供set和get方法和tostring方法
 *
 */
}

b.配置SqlMapConfig.xml

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"></properties>
    <!-- 定义 别名 -->
    <typeAliases>
        <!--
            单个别名的定义
            alias:别名,type:别名映射的类型  -->
            <!-- <typeAlias type="com.study.model.User" alias="user"/> -->
            <!-- 批量别名定义
            指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写)
         -->
        <package name="com.study.model"/>
    </typeAliases>
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理-->
            <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>
    </environments>
    <!--加载mapper映射
    如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。
     -->
    <mappers>
    <mapper class="com.study.mapper.UserMapper" />    
</mappers>

 </configuration>

在这里有两个新的知识点:

  1: <properties resource="db.properties"></properties>

  之前在连接数据库填写配置文件直接把属性(连接数据库用户名,密码等)写在里面,而这里是写在外面的db.properties中,这样更好的体现代码的灵活性

 2:<typeAliases>标签,之前我们配置mapper.xml文件中的parameterType和resultType的属性如果是对象一定要写类的全名称,而通过<typeAliases>标签的配置我们只需要写类的名字就好了

c.配置db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\\:mysql\\://localhost\\:3306/study
jdbc.username=root
jdbc.password=root

 也就是这样的

d.配置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">
<!-- namespace的属性对应所在的UserMapper接口全名称 -->
<mapper namespace="com.study.mapper.UserMapper">
   <!-- 发现这里的resultType属性我们可以不用写类的全名称com.study.model.User,因为在-->
   <!--SqlMapConfig.xml属性中我们配置了<typeAliases>标签  --> 
    <!-- 根据id查询用户信息 -->
    <select id="findUserById" parameterType="int" resultType="user">
        SELECT * FROM USER WHERE id= #{id}
    </select>
   
      <!-- 根据用户名称查询用户信息,可能返回多条-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="user">
        select * from user where username like \'%${value}%\'
    </select>
    
     <!-- 添加用户-->
    <insert id="insertUser" parameterType="user">
        INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
   
</mapper>

f.配置UserMapper.java对象 

public interface UserMapper {
    //根据用户id查询用户信息
    public User findUserById(int id) throws Exception;
    //根据用户名称  查询用户信息
    public List<User> findUserByName(String username) throws Exception;//插入用户
    public void insertUser(User user)throws Exception;
  
//删除用户 public void deleteUser(int id) throws Exception; //修改用户 public void updateUser(User user) throws Exception; }

e.编写UserMapperTest类进行 增删改查

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.Before;
11 import org.junit.Test;
12 
13 import com.study.mapper.UserMapper;
14 import com.study.model.User;
15 
16 
17 public class UserMapperTest {
18     // 会话工厂
19     private SqlSessionFactory sqlSessionFactory;
20     // 创建工厂
21     @Before
22     public void init() throws IOException {
23         String resource = "SqlMapConfig.xml";
24         InputStream inputStream = Resources.getResourceAsStream(resource);
25         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
26     }
27     //通过用户id查找对象
28     @Test
29     public void testFindUserById() throws Exception {
30         SqlSession sqlSession = sqlSessionFactory.openSession();
31         // 创建代理对象,这里就相当于有事先类了
32         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
33         User user = userMapper.findUserById(1);
34         System.out.println(user);
35     }
36  
37     //根据用户相信模糊查询
38   @Test
39     public void testFindUserByUsername() throws Exception {
40         SqlSession sqlSession = sqlSessionFactory.openSession();
41         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
42         List<User> list = userMapper.findUserByName("小明");
43         System.out.println(list);
44     }
45   
46    //添加用户
47     @Test
48     public void testInsertUser() throws Exception {
49         SqlSession sqlSession = sqlSessionFactory.openSession();
50         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
51         User user = new User();
52         user.setUsername("小小洪");
53         //我这里只添加了用户名,其它信息没有添加,默认为null
54         //Preparing: INSERT INTO USER(username,birthday,sex,address) VALUES(?,?,?,?)
55         //Parameters: 小小洪(String), null, null, null
56         userMapper.insertUser(user);
57         sqlSession.commit();
58         sqlSession.close();
59     }
60 }
61   /*
62    *删除和修改我这里先不写了,大家理解就好
63    */

本文就讲到这,谢谢大家,欢迎大家指点谢谢!

 

 

 



 

以上是关于mybatis系列笔记---mapper代理方法的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis笔记 - Mapper动态代理开发方式

mybatis入门-mapper代理原理

MyBatis - Mapper动态代理开发

MyBatis之Mapper动态代理

MyBatis学习04mapper代理方法开发dao

Mybatis框架中Mapper动态代理方式