MyBatis代理开发

Posted zhangjinru123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis代理开发相关的知识,希望对你有一定的参考价值。

一、开发步骤和程序代码 
1、程序员需要编写user.xml映射文件,程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
2、创建数据库配置文件db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123
View Code
3、创建mybatis配置文件SqlMapConfig.xml
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 加载属性文件 -->
 7     <properties resource="db.properties"></properties>
 8     
 9     <!-- 全局配置参数,需要时再设置 -->
10     <!-- <settings></settings> -->
11     
12     <!-- 别名定义 -->
13     <typeAliases>
14         <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
15         <!-- <typeAlias type="com.zhang.domain.User" alias="user"/> -->
16         <!-- 批量别名定义  指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)-->
17         <package name="com.zhang.domain"/>
18     </typeAliases>
19     
20     <environments default="development">
21         <environment id="development">
22         <!-- 使用jdbc事务管理,事务控制由mybatis-->
23             <transactionManager type="JDBC" />
24         <!-- 数据库连接池,由mybatis管理-->
25             <dataSource type="POOLED">
26                 <property name="driver" value="${jdbc.driver}" />
27                 <property name="url" value="${jdbc.url}" />
28                 <property name="username" value="${jdbc.username}" />
29                 <property name="password" value="${jdbc.password}" />
30             </dataSource>
31         </environment>
32     </environments>
33     
34     <mappers>
35         <mapper resource="sqlmap/User.xml"/>
36         
37         <!-- 通过mapper接口加载单个 映射文件
38         遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中
39         上边规范的前提是:使用的是mapper代理方法
40          -->
41         <!-- <mapper class="com.zhang.dao.UserDao"/> -->
42         
43         <!-- 批量加载mapper
44         指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
45         遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中
46         上边规范的前提是:使用的是mapper代理方法
47          -->
48     <!--     <package name="com.zhang.dao"/> -->
49     </mappers>
50 </configuration>
View Code
4、创建接口类UserDao.java
 1 package com.zhang.dao;
 2 
 3 import java.util.List;
 4 import com.zhang.domain.User;
 5 
 6 public interface UserDao {
 7     
 8     //根据id查询用户信息,使用resultMap输出
 9     public User findUserByIdResultMap(int id) throws Exception;
10         
11     //根据id查询用户信息
12     public User findUserById(int id) throws Exception;
13     
14     //根据用户名列查询用户列表
15     public List<User> findUserByName(String name) throws Exception;
16     
17     //添加用户信息
18     public void insertUser(User user) throws Exception;
19     
20     //删除用户信息
21     public void deleteUser(int id) throws Exception;
22 
23 }
View Code

5、创建user.xml映射文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 加载属性文件 -->
 7     <properties resource="db.properties"></properties>
 8     
 9     <!-- 全局配置参数,需要时再设置 -->
10     <!-- <settings></settings> -->
11     
12     <!-- 别名定义 -->
13     <typeAliases>
14         <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->
15         <!-- <typeAlias type="com.zhang.domain.User" alias="user"/> -->
16         <!-- 批量别名定义  指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)-->
17         <package name="com.zhang.domain"/>
18     </typeAliases>
19     
20     <environments default="development">
21         <environment id="development">
22         <!-- 使用jdbc事务管理,事务控制由mybatis-->
23             <transactionManager type="JDBC" />
24         <!-- 数据库连接池,由mybatis管理-->
25             <dataSource type="POOLED">
26                 <property name="driver" value="${jdbc.driver}" />
27                 <property name="url" value="${jdbc.url}" />
28                 <property name="username" value="${jdbc.username}" />
29                 <property name="password" value="${jdbc.password}" />
30             </dataSource>
31         </environment>
32     </environments>
33     
34     <mappers>
35         <mapper resource="sqlmap/User.xml"/>
36         
37         <!-- 通过mapper接口加载单个 映射文件
38         遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中
39         上边规范的前提是:使用的是mapper代理方法
40          -->
41         <!-- <mapper class="com.zhang.dao.UserDao"/> -->
42         
43         <!-- 批量加载mapper
44         指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
45         遵循一些规范:需要将mapper接口类名和User.xml映射文件名称保持一致,且在一个目录 中
46         上边规范的前提是:使用的是mapper代理方法
47          -->
48     <!--     <package name="com.zhang.dao"/> -->
49     </mappers>
50 </configuration>
View Code

6、创建实体类User.java文件

 1 package com.zhang.domain;
 2 
 3 import java.util.Date;
 4 public class User {
 5     
 6     //属性名和数据库表的字段对应
 7     private int id;
 8     private String username;// 用户姓名
 9     private String sex;// 性别
10     private Date birthday;// 生日
11     private String address;// 地址
12     public int getId() {
13         return id;
14     }
15     public void setId(int id) {
16         this.id = id;
17     }
18     public String getUsername() {
19         return username;
20     }
21     public void setUsername(String username) {
22         this.username = username;
23     }
24     public String getSex() {
25         return sex;
26     }
27     public void setSex(String sex) {
28         this.sex = sex;
29     }
30     public Date getBirthday() {
31         return birthday;
32     }
33     public void setBirthday(Date birthday) {
34         this.birthday = birthday;
35     }
36     public String getAddress() {
37         return address;
38     }
39     public void setAddress(String address) {
40         this.address = address;
41     }
42     @Override
43     public String toString() {
44         return "User [id=" + id + ", username=" + username + ", sex=" + sex
45                 + ", birthday=" + birthday + ", address=" + address + "]";
46     }
47 
48 
49 }
View Code

7、测试,创建测试类TestMy.java

 1 package com.zhang.test;
 2 
 3 import java.io.InputStream;
 4 import java.util.Date;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import com.zhang.dao.UserDao;
15 import com.zhang.domain.User;
16 
17 public class TestMy {
18     private SqlSessionFactory sqlSessionFactory;
19 
20     // 此方法是在执行testFindUserById之前执行
21     @Before
22     public void setUp() throws Exception {
23         // 创建sqlSessionFactory
24         // mybatis配置文件
25         String resource = "SqlMapConfig.xml";
26         // 得到配置文件流
27         InputStream inputStream = Resources.getResourceAsStream(resource);
28         // 创建会话工厂,传入mybatis的配置文件信息
29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
30     }
31     
32     @Test
33     public void testFindUserById() throws Exception {
34         SqlSession sqlSession = sqlSessionFactory.openSession();
35         //创建UserMapper对象,mybatis自动生成mapper代理对象
36         UserDao userDao = sqlSession.getMapper(UserDao.class);
37         //调用userMapper的方法
38         User user = userDao.findUserById(1);
39         System.out.println(user);
40     }
41     
42     @Test
43     public void testFindUserByName() throws Exception {
44         SqlSession sqlSession = sqlSessionFactory.openSession();
45         //创建UserMapper对象,mybatis自动生成mapper代理对象
46         UserDao userDao = sqlSession.getMapper(UserDao.class);
47         //调用userMapper的方法
48         List<User> list = userDao.findUserByName("小明");
49         sqlSession.close();
50         System.out.println(list);
51     }
52 
53     @Test
54     public void insertUser() throws Exception {
55         SqlSession sqlSession = sqlSessionFactory.openSession();
56         //创建UserMapper对象,mybatis自动生成mapper代理对象
57         UserDao userDao = sqlSession.getMapper(UserDao.class);
58         User user=new User();
59         user.setAddress("深圳");
60         user.setBirthday(new Date());
61         user.setSex("女");
62         user.setUsername("zhangjinru");
63         //调用userMapper的方法
64         userDao.insertUser(user);
65         //提交事务
66         sqlSession.commit();
67         sqlSession.close();
68     }
69     
70     @Test
71     public void deleteUser() throws Exception {
72         SqlSession sqlSession = sqlSessionFactory.openSession();
73         //创建UserMapper对象,mybatis自动生成mapper代理对象
74         UserDao userDao = sqlSession.getMapper(UserDao.class);
75         //调用userMapper的方法
76         userDao.deleteUser(24);
77         // 提交事务
78         sqlSession.commit();
79         sqlSession.close();
80     }
81 
82     @Test
83     public void testFindUserByIdResultMap() throws Exception {
84         SqlSession sqlSession = sqlSessionFactory.openSession();
85         //创建UserDao对象,mybatis自动生成mapper代理对象
86         UserDao userDao = sqlSession.getMapper(UserDao.class);
87         //调用userDao的方法
88         User user = userDao.findUserByIdResultMap(1);
89         System.out.println(user);
90     }
91     
92 
93 }
View Code

 8、整个工程目录结构

二、一些问题总结

1、在user.xml中namespace等于UserDao接口地址
2、UserDao.java接口中的方法名和user.xml中statement的id一致

3、UserDao.java接口中的方法输入参数类型和user.xml中statement的parameterType指定的类型一致。UserDao.java接口中的方法返回值类型和user.xml中statement的resultType指定的类型一致
4、代理对象内部调用selectOne或selectList ,如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
5、typeAliases(别名)
在user.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针parameterType或resultType指定的类型定义一些别名,在user.xml中通过别名定义,方便开发。
 6、通过resource加载单个映射文件
7、通过mapper接口加载单个mapper,按照上边的规范,将User.java和User.xml放在一个目录 ,且同名。

 资源下载地址:http://download.csdn.net/detail/u013865056/9907003



以上是关于MyBatis代理开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring+SpringMVC+MyBatis深入学习及搭建——MyBatis原始Dao开发和mapper代理开发(转发同上)

Mybatis学习---MyBatis知识原始Dao开发和mapper代理开发

Mybatis——Dao层实现映射文件深入核心配置文件深入

Mybatis 和Spring整合之mapper代理开发

Mybatis中Mapper代理形式开发与spring整合

Mybatis框架三:DAO层开发Mapper动态代理开发