Mybatis mapper代理开发方法实现增删改查
2017-11-19 10:19
633 查看
接着上一篇文章:Mybatis原生dao开发方法实现增删改查 写
开发规范:
1、在 mapper.xml 中 namespace 等于 mapper 接口地址
2、mapper.java 接口中的方法名和 mapper.xml 和 statement 的 id 一致
3、mapper.java 接口中方法输入参数类型 和 mapper.xml 中 statement 的parameterType 指定的类型一致
4、mapper.java 接口中方法返回值类型和 mapper.xml 中的 statement 的 resultType 指定的类型一致
总结:
以上规范主要是对下边的代码进行统一生成
User user = sqlSession.selectOne("test.findUserById",2);
List<User> list = sqlSession.selectList("test.findUserByName",username);
sqlSession.insert("test.insertUser",user);
sqlSession.delete("test.deleteUserById",id);
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)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和Spring整合后,environments配置将废除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由mybatis-->
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<!--数据库连接池-->
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
记得添加 映射文件
2、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命名空间,作用是对sql进行分类话管理,理解sql,理解sql隔离
注意:使用mapper代理方法开发,namespace有着特殊的作用
-->
<mapper namespace="com.liuyanzhao.mybatis.mapper.UserMapper">
<!--在映射文件中配置很多sql语句-->
<!--
id:表示映射文件中的sql
将sql语句封装到mappedStatement对象中,所以称id为Statement的id
parameterType:指定输入参数的类型
resultType:指定就是单条记录所映射的java对象类型
#{}表示占位符,相当于?
#{id} 其中id表示接受输入的参数,参数名就是id,如果输入的参数是简单类型,#{}中的参数可以任意,可以value或者其他名称
${}:表示拼接sql串,将接受到的参数的内容不加任何修饰直接拼接在sql中
${}安全隐患:使用${}拼接sql,引起sql注入
${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只有使用value
-->
<select id="findUserById" parameterType="int" resultType="com.liuyanzhao.mybatis.po.User">
SELECT * FROM user WHERE id=#{value}
</select>
<!--根据用户名称模糊查询,可能返回多条-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.liuyanzhao.mybatis.po.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
<!--#{}指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过OGNL获取对象的属性值-->
<!--添加用户-->
<insert id="insertUser" parameterType="com.liuyanzhao.mybatis.po.User">
<!--
将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID(); 得到insert进去的主键值,只适用自增主键
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(username,birthday,gender,address) VALUE(#{username},#{birthday},#{gender},#{address})
</insert>
<!--删除用户,根据id-->
<delete id="deleteUserById" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id}
</delete>
<!--更新用户,根据id
需要传入用户信息
parameterType指定user对象,包括id和更新信息。注意:id必须存在
#{id}:从输入的user对象中获取id的属性值
-->
<update id="updateUserById" parameterType="com.liuyanzhao.mybatis.po.User">
UPDATE user SET username=#{username},birthday=#{birthday},gender=#{gender},address=#{address} WHERE id=#{id}
</update>
</mapper>
修改 namespace 的值,其他的不变
3、UserMapper.java
package com.liuyanzhao.mybatis.mapper;
import com.liuyanzhao.mybatis.po.User;
import java.util.List;
/**
* Created by Liu_Yanzhao on 2017/8/10.
*/
public interface UserMapper {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据username模糊查询用户信息
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUserById(int id) throws Exception;
//更新用户信息
public void updateUserById(User user) throws Exception;
}
和 UserDao.java 代码一样
4、测试类 UserMapper.java
package com.liuyanzhao.mybatis.test;
import com.liuyanzhao.mybatis.mapper.UserMapper;
import com.liuyanzhao.mybatis.po.User;
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.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* Created by 言曌 on 2017/8/10.
*/
public class UserMapperImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "Configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
//测试 根据id查询用户
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper方法
User user = userMapper.findUserById(6);
System.out.println(user);
}
//测试 根据username查询用户
@Test
public void testFindUserByName() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用usermapper对象
List<User> list = userMapper.findUserByName("明");
System.out.println(list);
}
//添加用户信息
@Test
public void testInsertUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建对象,存储信息
User user = new User();
//
user.setUsername("李小成");
user.setGender("男");
user.setBirthday(new Date());
user.setAddress("陕西榆林");
userMapper.insertUser(user);
sqlSession.commit();
}
//测试,根据id删除用户
@Test
public void testDeleteUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//删除操作
userMapper.deleteUserById(1);
//提交事务
sqlSession.commit();
}
//测试,根据id更新用户
@Test
public void testUpdateUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建对象,存储信息
User user = new User();
user.setId(2);
user.setUsername("岳小飞");
user.setGender("男");
user.setBirthday(new Date());
user.setAddress("河南安阳");
//更新用户
userMapper.updateUserById(user);
//提交事务
sqlSession.commit();
}
}
本文链接:https://liuyanzhao.com/5789.html
思路
程序员编写 mapper 接口的时候,要遵循一些开发规范,Mybatis 可以自动生成 mapper 接口实现类代理对象。开发规范:
1、在 mapper.xml 中 namespace 等于 mapper 接口地址
2、mapper.java 接口中的方法名和 mapper.xml 和 statement 的 id 一致
3、mapper.java 接口中方法输入参数类型 和 mapper.xml 中 statement 的parameterType 指定的类型一致
4、mapper.java 接口中方法返回值类型和 mapper.xml 中的 statement 的 resultType 指定的类型一致
总结:
以上规范主要是对下边的代码进行统一生成
User user = sqlSession.selectOne("test.findUserById",2);
List<User> list = sqlSession.selectList("test.findUserByName",username);
sqlSession.insert("test.insertUser",user);
sqlSession.delete("test.deleteUserById",id);
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)
代码实现
1、Configuration.xml Mybatis 全局配置文件<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和Spring整合后,environments配置将废除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事务管理,事务控制由mybatis-->
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<!--数据库连接池-->
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
记得添加 映射文件
2、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命名空间,作用是对sql进行分类话管理,理解sql,理解sql隔离
注意:使用mapper代理方法开发,namespace有着特殊的作用
-->
<mapper namespace="com.liuyanzhao.mybatis.mapper.UserMapper">
<!--在映射文件中配置很多sql语句-->
<!--
id:表示映射文件中的sql
将sql语句封装到mappedStatement对象中,所以称id为Statement的id
parameterType:指定输入参数的类型
resultType:指定就是单条记录所映射的java对象类型
#{}表示占位符,相当于?
#{id} 其中id表示接受输入的参数,参数名就是id,如果输入的参数是简单类型,#{}中的参数可以任意,可以value或者其他名称
${}:表示拼接sql串,将接受到的参数的内容不加任何修饰直接拼接在sql中
${}安全隐患:使用${}拼接sql,引起sql注入
${value}:接受输入参数的内容,如果传入类型是简单类型,${}中只有使用value
-->
<select id="findUserById" parameterType="int" resultType="com.liuyanzhao.mybatis.po.User">
SELECT * FROM user WHERE id=#{value}
</select>
<!--根据用户名称模糊查询,可能返回多条-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.liuyanzhao.mybatis.po.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
<!--#{}指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过OGNL获取对象的属性值-->
<!--添加用户-->
<insert id="insertUser" parameterType="com.liuyanzhao.mybatis.po.User">
<!--
将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID(); 得到insert进去的主键值,只适用自增主键
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(username,birthday,gender,address) VALUE(#{username},#{birthday},#{gender},#{address})
</insert>
<!--删除用户,根据id-->
<delete id="deleteUserById" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id}
</delete>
<!--更新用户,根据id
需要传入用户信息
parameterType指定user对象,包括id和更新信息。注意:id必须存在
#{id}:从输入的user对象中获取id的属性值
-->
<update id="updateUserById" parameterType="com.liuyanzhao.mybatis.po.User">
UPDATE user SET username=#{username},birthday=#{birthday},gender=#{gender},address=#{address} WHERE id=#{id}
</update>
</mapper>
修改 namespace 的值,其他的不变
3、UserMapper.java
package com.liuyanzhao.mybatis.mapper;
import com.liuyanzhao.mybatis.po.User;
import java.util.List;
/**
* Created by Liu_Yanzhao on 2017/8/10.
*/
public interface UserMapper {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据username模糊查询用户信息
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUserById(int id) throws Exception;
//更新用户信息
public void updateUserById(User user) throws Exception;
}
和 UserDao.java 代码一样
4、测试类 UserMapper.java
package com.liuyanzhao.mybatis.test;
import com.liuyanzhao.mybatis.mapper.UserMapper;
import com.liuyanzhao.mybatis.po.User;
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.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* Created by 言曌 on 2017/8/10.
*/
public class UserMapperImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "Configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
//测试 根据id查询用户
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper方法
User user = userMapper.findUserById(6);
System.out.println(user);
}
//测试 根据username查询用户
@Test
public void testFindUserByName() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用usermapper对象
List<User> list = userMapper.findUserByName("明");
System.out.println(list);
}
//添加用户信息
@Test
public void testInsertUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建对象,存储信息
User user = new User();
//
user.setUsername("李小成");
user.setGender("男");
user.setBirthday(new Date());
user.setAddress("陕西榆林");
userMapper.insertUser(user);
sqlSession.commit();
}
//测试,根据id删除用户
@Test
public void testDeleteUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//删除操作
userMapper.deleteUserById(1);
//提交事务
sqlSession.commit();
}
//测试,根据id更新用户
@Test
public void testUpdateUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得UserMapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建对象,存储信息
User user = new User();
user.setId(2);
user.setUsername("岳小飞");
user.setGender("男");
user.setBirthday(new Date());
user.setAddress("河南安阳");
//更新用户
userMapper.updateUserById(user);
//提交事务
sqlSession.commit();
}
}
本文链接:https://liuyanzhao.com/5789.html
相关文章推荐
- mybatis的mapper代理方法开发实现用户的增删改查
- 10_Mybatis开发Dao方法——mapper代理实现
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- 【MyBatis学习04】mapper代理方法开发dao
- Mybatis之使用mapper代理方法开发dao(程序员只需要写mapper接口(dao接口))(12)
- 【MyBatis学习04】mapper代理方法开发dao
- mybatis和spring整合之dao方法和mapper代理开发方法之记录
- 【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法
- Mybatis中mapper代理方法替换原始Dao开发方法
- Mybatis学习(05)-mapper代理方法开发dao && 输入映射和输出映射
- Mybatis (三)原始DAO开发和mapper代理方法
- 【MyBatis学习04】mapper代理方法开发dao
- Mybatis Mapper动态代理方法 即 只写Dao接口 不谢Dao的实现类
- 【MyBatis学习04】mapper代理方法开发dao
- mybatis(四)开发dao方法 开发原始dao方法 mapper代理开发方法
- MyBatis_mapper代理开发方法
- mybatis CRUD之Mapper代理开发模式(接口实现 不需要实现类)
- mybatis mapper代理方法实现单表的增删改查
- mybatis的mapper代理方法来实现