Mybatis mapper代理开发方法实现增删改查

接着上一篇文章:Mybatis原生dao开发方法实现增删改查 写

思路

程序员编写 mapper 接口的时候,要遵循一些开发规范,Mybatis 可以自动生成 mapper 接口实现类代理对象。

开发规范:

1、在 mapper.xml 中 namespace 等于 mapper 接口地址

Mybatis mapper代理开发方法实现增删改查

 

2、mapper.java 接口中的方法名和 mapper.xml 和 statement 的 id 一致

Mybatis mapper代理开发方法实现增删改查

Mybatis mapper代理开发方法实现增删改查

 

3、mapper.java 接口中方法输入参数类型 和 mapper.xml 中 statement 的parameterType 指定的类型一致

Mybatis mapper代理开发方法实现增删改查

Mybatis mapper代理开发方法实现增删改查

 

4、mapper.java 接口中方法返回值类型和 mapper.xml 中的 statement 的 resultType 指定的类型一致

Mybatis mapper代理开发方法实现增删改查

Mybatis mapper代理开发方法实现增删改查

 

总结:

以上规范主要是对下边的代码进行统一生成

  1. User user = sqlSession.selectOne("test.findUserById",2);
  2. List<User> list = sqlSession.selectList("test.findUserByName",username);
  3. sqlSession.insert("test.insertUser",user);
  4. sqlSession.delete("test.deleteUserById",id);
  5. sqlSession.update("test.updateUserById",user);

 

项目准备

同上篇文章基本相同

1、项目结构

① 新建 Java 项目

② 在 src 下新建 com.liuyanzhao.mybatis.po 包(用来放持久化类,和数据库对应)

和 com.liuyanzhao.mybatis.mapper 包 (用来放 CURD 实现代码)

③ 在 src 下新建(或者拷贝)Configuration.xml (mybatis全局配置文件)和 UserMapper.xml (映射文件)

 

2、导入 两个必备的 jar 包

  • mysql-jdbc 驱动包: mysql-connector-java-5.1.41-bin.jar
  • mybatis 包:mybatis-3.4.4.jar

在项目中新建一个 lib 目录,将两个包拷贝到 lib 中,然后将两个包加入环境(build path)中

 

3、新建数据库和数据表

我这里在本地测试,主机 localhost,数据库用户名root,密码为空

① 新建数据库:mybatis

② 新建数据表:user表

表结构如下,五个字段(id,username,gender,birthday,address)

Mybatis mapper代理开发方法实现增删改查

 

代码实现

1、Configuration.xml   Mybatis 全局配置文件

  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.   <!-- 和Spring整合后,environments配置将废除-->
  7.   <environments default="development">
  8.     <environment id="development">
  9.       <!--使用JDBC事务管理,事务控制由mybatis-->
  10.       <transactionManager type="JDBC">
  11.         <property name="" value=""/>
  12.       </transactionManager>
  13.       <!--数据库连接池-->
  14.       <dataSource type="UNPOOLED">
  15.         <property name="driver" value="com.mysql.jdbc.Driver"/>
  16.         <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
  17.         <property name="username" value="root"/>
  18.         <property name="password" value=""/>
  19.       </dataSource>
  20.     </environment>
  21.   </environments>
  22.   <!--加载映射文件-->
  23.   <mappers>
  24.     <mapper resource="UserMapper.xml" />
  25.   </mappers>
  26. </configuration>

记得添加 映射文件

 

2、UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--namespace命名空间,作用是对sql进行分类话管理,理解sql,理解sql隔离
  6.     注意:使用mapper代理方法开发,namespace有着特殊的作用
  7. -->
  8. <mapper namespace="com.liuyanzhao.mybatis.mapper.UserMapper">
  9.     <!--在映射文件中配置很多sql语句-->
  10.     <!--
  11.     id:表示映射文件中的sql
  12.     将sql语句封装到mappedStatement对象中,所以称id为Statement的id
  13.     parameterType:指定输入参数的类型
  14.     resultType:指定就是单条记录所映射的java对象类型
  15.     #{}表示占位符,相当于?
  16.     #{id} 其中id表示接受输入的参数,参数名就是id,如果输入的参数是简单类型,#{}中的参数可以任意,可以value或者其他名称
  17.     ${}:表示拼接sql串,将接受到的参数的内容不加任何修饰直接拼接在sql中
  18.     ${}安全隐患:使用${}拼接sql,引起sql注入
  19.     ${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只有使用value
  20.     -->
  21.     <select id="findUserById" parameterType="int" resultType="com.liuyanzhao.mybatis.po.User">
  22.         SELECT * FROM user WHERE id=#{value}
  23.     </select>
  24.     <!--根据用户名称模糊查询,可能返回多条-->
  25.     <select id="findUserByName" parameterType="java.lang.String" resultType="com.liuyanzhao.mybatis.po.User">
  26.         SELECT * FROM user WHERE username LIKE '%${value}%'
  27.     </select>
  28.     <!--#{}指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过OGNL获取对象的属性值-->
  29.     <!--添加用户-->
  30.     <insert id="insertUser" parameterType="com.liuyanzhao.mybatis.po.User">
  31.      <!--
  32.         将插入数据的主键返回,返回到user对象中
  33.         SELECT LAST_INSERT_ID(); 得到insert进去的主键值,只适用自增主键
  34.     -->
  35.         <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
  36.             SELECT LAST_INSERT_ID()
  37.         </selectKey>
  38.         INSERT INTO user(username,birthday,gender,address) VALUE(#{username},#{birthday},#{gender},#{address})
  39.     </insert>
  40.     <!--删除用户,根据id-->
  41.     <delete id="deleteUserById" parameterType="java.lang.Integer">
  42.         DELETE FROM user WHERE id=#{id}
  43.     </delete>
  44.     <!--更新用户,根据id
  45.     需要传入用户信息
  46.     parameterType指定user对象,包括id和更新信息。注意:id必须存在
  47.     #{id}:从输入的user对象中获取id的属性值
  48.     -->
  49.     <update id="updateUserById" parameterType="com.liuyanzhao.mybatis.po.User">
  50.         UPDATE user SET username=#{username},birthday=#{birthday},gender=#{gender},address=#{address} WHERE id=#{id}
  51.     </update>
  52. </mapper>

修改 namespace 的值,其他的不变

 

3、UserMapper.java

  1. package com.liuyanzhao.mybatis.mapper;
  2. import com.liuyanzhao.mybatis.po.User;
  3. import java.util.List;
  4. /**
  5.  * Created by Liu_Yanzhao on 2017/8/10.
  6.  */
  7. public interface UserMapper {
  8.     //根据id查询用户信息
  9.     public User findUserById(int id) throws Exception;
  10.     //根据username模糊查询用户信息
  11.     public List<User> findUserByName(String name) throws Exception;
  12.     //添加用户信息
  13.     public void insertUser(User user) throws Exception;
  14.     //删除用户信息
  15.     public void deleteUserById(int id) throws Exception;
  16.     //更新用户信息
  17.     public void updateUserById(User user) throws  Exception;
  18. }

和 UserDao.java 代码一样

 

4、测试类 UserMapper.java

  1. package com.liuyanzhao.mybatis.test;
  2. import com.liuyanzhao.mybatis.mapper.UserMapper;
  3. import com.liuyanzhao.mybatis.po.User;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import java.io.InputStream;
  11. import java.util.Date;
  12. import java.util.List;
  13. /**
  14.  * Created by 言曌 on 2017/8/10.
  15.  */
  16. public class UserMapperImplTest {
  17.     private SqlSessionFactory sqlSessionFactory;
  18.     @Before
  19.     public void setUp() throws Exception {
  20.         String resource = "Configuration.xml";
  21.         InputStream inputStream = Resources.getResourceAsStream(resource);
  22.         sqlSessionFactory = new SqlSessionFactoryBuilder()
  23.             .build(inputStream);
  24.     }
  25.     //测试 根据id查询用户
  26.     @Test
  27.     public void testFindUserById() throws Exception {
  28.         SqlSession sqlSession = sqlSessionFactory.openSession();
  29.         //创建UserMapper对象,mybatis自动生成mapper代理对象
  30.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  31.         //调用userMapper方法
  32.         User user = userMapper.findUserById(6);
  33.         System.out.println(user);
  34.     }
  35.     //测试 根据username查询用户
  36.     @Test
  37.     public void testFindUserByName() throws Exception {
  38.         SqlSession sqlSession = sqlSessionFactory.openSession();
  39.         //创建UserMapper对象,mybatis自动生成mapper代理对象
  40.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  41.         //调用usermapper对象
  42.         List<User> list = userMapper.findUserByName("明");
  43.         System.out.println(list);
  44.     }
  45.     //添加用户信息
  46.     @Test
  47.     public void testInsertUser() throws Exception {
  48.         SqlSession sqlSession = sqlSessionFactory.openSession();
  49.         //获得UserMapper对象
  50.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  51.         //创建对象,存储信息
  52.         User user = new User();
  53.         //
  54.         user.setUsername("李小成");
  55.         user.setGender("男");
  56.         user.setBirthday(new Date());
  57.         user.setAddress("陕西榆林");
  58.         userMapper.insertUser(user);
  59.         sqlSession.commit();
  60.     }
  61.     //测试,根据id删除用户
  62.     @Test
  63.     public void testDeleteUserById() throws Exception {
  64.         SqlSession sqlSession = sqlSessionFactory.openSession();
  65.         //获得UserMapper对象
  66.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  67.         //删除操作
  68.         userMapper.deleteUserById(1);
  69.         //提交事务
  70.         sqlSession.commit();
  71.     }
  72.     //测试,根据id更新用户
  73.     @Test
  74.     public void testUpdateUserById() throws Exception {
  75.         SqlSession sqlSession = sqlSessionFactory.openSession();
  76.         //获得UserMapper对象
  77.         UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  78.         //创建对象,存储信息
  79.         User user = new User();
  80.         user.setId(2);
  81.         user.setUsername("岳小飞");
  82.         user.setGender("男");
  83.         user.setBirthday(new Date());
  84.         user.setAddress("河南安阳");
  85.         //更新用户
  86.         userMapper.updateUserById(user);
  87.         //提交事务
  88.         sqlSession.commit();
  89.     }
  90. }

 

本文链接:https://liuyanzhao.com/5789.html

 

  • 微信
  • 赶快加我聊天吧
  • weinxin
  • 博客交流群
  • 海纳百川,大家来水
  • weinxin
言曌

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: