上一篇博客我们将了mybatis项目的原理和搭建一个查询的小demo,今天我们就对mybatis的增删该查做一下介绍,具体的环境我就不说了,大家需要的话可以参考博客:mybatis环境搭建,上一篇博客我们讲了其实mapper.xml中我们主要需要写的就是mapped statement,今天我们就讲一下User.xml文件的编写和客户端的调用。所以我下边的xml就是mapper.xml中的mapped statement。
查询
根据ID查询单个实体
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE ID=#{id}
</select>
id表示mapped statement的id,传入参数(parameterType)是int类型,mybatis的输出类型是User(pojo),#{id}表示我们平时写java语言的时候的占位符“?”。
客户端
// 根据id查询用户信息
@Test
public void findUserById() throws IOException {
// mybatis的配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.创建会话工厂,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.通过sqlSession操作数据库
// 第一个参数:映射文件中的statement的id,等于命名空间(ps:test)——satatementId(ps:findUserById)
// 第二个参数:置顶和映射文件中匹配的parameterType的参数
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println("user.name" + user.getUsername());
// 释放资源
sqlSession.close();
}
根据名称模糊查询
<!-- 根据用户名模糊查询用户信息,可能返回多条记录
resultType:指定的就是单挑记录锁映射的java对象类型
${}表示拼接字符串,将接收的内容,不加任何修饰的凭借到sql中
使用${}凭借sql,会引起sql注入
${}:接受输入的内容,如果传入的是简单类型,${}只能使用value
-->
<select id="findUserByName" parameterType="String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE USERNAME LIKE '%${value}%'
</select>
上边的代码中’% value {value}就是我们java中的OGNL表达式,而他的作用就是传入我们是什么,在这个sql中就表示什么信息
模糊查询客户端调用
// mybatis的配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.创建会话工厂,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.通过sqlSession操作数据库
// 第一个参数:映射文件中的statement的id,等于命名空间(ps:test)——satatementId(ps:findUserById)
// 第二个参数:置顶和映射文件中匹配的parameterType的参数
List<User> list = sqlSession.selectList("test.findUserByName", "王");
System.out.println("user.name");
System.out.println(list);
// 释放资源
sqlSession.close();
添加信息
添加用户,返回用户实体
<!-- 添加用户
parameterType:指定输入的参数类型(包括用户信息)
#{}中指定pojo的属性名,接受到pojo对象的属性值
mybatis也是通过OGNL来获取属性的值
-->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" >
<!--select LAST_INSERT_ID() :得到刚刚在insert进去记录的主键值,值适用于自增列 -->
<!-- keyProperty:将查询到的主键值设置到parameterType置顶的对象的哪个属性 -->
<!-- order="AFTER":select LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 -->
<!-- resultType:指定结果的类型 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into User(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})
</insert>
因为我的mybatis用的数据库是mysql,而主键用的是自增列,所以我在插入之间获取一下插入的主键信息,这样返回的实体就会是含有主键信息。
客户端调用
// mybatis的配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.创建会话工厂,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.通过sqlSession操作数据库
User user = new User();
user.setUsername("孟海滨");
user.setBirthday(new Date());
user.setAddress("万达广场");
user.setSex("1");
sqlSession.insert("test.updateUser",user);
//提交事务
sqlSession.commit();
// 关闭会话,释放资源
sqlSession.close();
删除
根据id查询某个信息
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
客户端调用
// mybatis的配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.创建会话工厂,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// 2.通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.通过sqlSession操作数据库
sqlSession.delete("test.deleteUser",30);
//提交事务
sqlSession.commit();
// 关闭会话,释放资源
sqlSession.close();
}
更新
更新实体
<!-- 更新用户
需要用户的id和用户信息
#{id}:从传入的user实体中获取对应属性的值
-->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
更新实体客户端
// mybatis的配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1.创建会话工厂,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.通过sqlSession操作数据库
User user = new User();
user.setId(32);
user.setUsername("孟海滨是个大帅哥11");
user.setBirthday(new Date());
user.setAddress("万达广场");
user.setSex("1");
sqlSession.insert("test.updateUser",user);
//提交事务
sqlSession.commit();
// 关闭会话,释放资源
sqlSession.close();
小结
是不是非常的方便,当我们吧xml写好以后,就可以按照传统的ROM框架的思想来写代码了,而且客户端因为是小Demo,所以代码难免会有重复,当我们在以后的博客把他们来封装起来以后,就会发现其实mybatis是非常的简单。而且因为sql的问题,对于不太熟悉ORM框架的人,也是相对比较容易进行代码优化。