续上节
一、模糊查询
- 因为每次都要加载配置文件所有抽取工具类名称为:SqlSessionFactoryUtils
package com.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//工具类
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sql;
//get方法获取
public static SqlSessionFactory getSql() {
return sql;
}
static {
try {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder s = new SqlSessionFactoryBuilder();
// 配置输入流
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通过输入流创建创建SqlSessionFactory对象
sql = s.build(input);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.修改映射文件User.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问号
${} $字符串拼接
如果传入参数为普通类型,大括号为value
如果传入为对象,大括号为对象成员变量-->
<mapper namespace="user">
<!-- id:sql唯一标识
parameterType 入参类型
resultType 返回结果类型-->
<select id="getUserByid" parameterType="int" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
WHERE id=#{id}
</select>
<!-- 如果返回为集合时,设置每个数据类型即可 -->
<select id="getUserByUserName" parameterType="string" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
<!-- WHERE username LIKE #{name} -->
WHERE username LIKE '%${value}%'
</select>
<!-- 如果返回为集合时,设置每个数据类型即可 -->
<select id="getUserByUserName" parameterType="string" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
<!-- WHERE username LIKE #{name} -->
WHERE username LIKE '%${value}%'
</select>
</mapper>
2.添加测试方法
@Test
public void testGetUserByUserName() throws Exception {
//获取SqlSessionFactory
SqlSessionFactory sql= SqlSessionFactoryUtils.getSql();
//创建SqlSession对象
SqlSession ss=sql.openSession();
//查询,参数一SQL id 参数二 入参
/* List<User> list= ss.selectList("user.getUserByUserName", "%百%"); */
List<User> list= ss.selectList("user.getUserByUserName", "百");
for(User user : list)
System.out.println(user);
//释放资源
ss.close();
}
二、增加功能返回主键
1.修改映射User.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问号
${} $字符串拼接
如果传入参数为普通类型,大括号为value
如果传入为对象,大括号为对象成员变量-->
<mapper namespace="user">
<!-- id:sql唯一标识
parameterType 入参类型
resultType 返回结果类型-->
<select id="getUserByid" parameterType="int" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
WHERE id=#{id}
</select>
<!-- 如果返回为集合时,设置每个数据类型即可 -->
<select id="getUserByUserName" parameterType="string" resultType="com.mybatis.domain.User">
SELECT
`id`,
`username`,
`birthday`,
`sex`,
`address`
FROM `user`
<!-- WHERE username LIKE #{name} -->
WHERE username LIKE '%${value}%'
</select>
<!-- useGeneratedKeys使用自增,keyProperty结合使用,为user主键 -->
<insert id="insertUser" parameterType="com.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey主键返回
keyProperty 主键属性
resultType 数据类型
order 何时执行-->
<!--
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
useGeneratedKeys="true" keyProperty="id"与这段相等
</selectKey>
-->
INSERT INTO `user`
(`username`,
`birthday`,
`sex`,
`address`)
VALUES (#{username},
#{birthday},
#{sex},
#{address});
</insert>
</mapper>
2.增加测试方法
@Test
public void testInsertUser() throws Exception {
//获取SqlSessionFactory
SqlSessionFactory sql= SqlSessionFactoryUtils.getSql();
//创建SqlSession对象,默认不是自动提交,设置为ture自动提交
SqlSession ss=sql.openSession();
User user = new User();
user.setUsername("百分百欧克3111");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("天津");
ss.insert("user.insertUser", user);
System.out.println(user);
ss.commit();
//释放资源
ss.close();
}
-
理解以下内容 order=“AFTER”,order="BEFORE"区别
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
<selectKey keyProperty="id" resultType="string" order="BEFORE">
SELECT LAST_INSERT_ID()
</selectKey>
useGeneratedKeys="true" keyProperty="id"
改设置与 order="AFTER"获得结果一样,先插入后获取id
当设置为 order="BEFORE"获得的值为null
三、增加功能,利用SQL自动生成uuid
1.修改User.xml映射文件
<insert id="insertUserUUID" parameterType="com.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey主键返回
keyProperty 主键属性
resultType 数据类型
order 何时执行-->
<selectKey keyProperty="uuid" resultType="string" order="BEFORE">
SELECT UUID()
</selectKey>
INSERT INTO `user`
(`username`,
`birthday`,
`sex`,
`address`,
`uuid`)
VALUES (#{username},
#{birthday},
#{sex},
#{address},
#{uuid});
</insert>
2.增加测试方法
@Test
public void testInsertUserUUID() throws Exception {
//获取SqlSessionFactory
SqlSessionFactory sql= SqlSessionFactoryUtils.getSql();
//创建SqlSession对象,默认不是自动提交,设置为ture自动提交
SqlSession ss=sql.openSession();
User user = new User();
user.setUsername("百分百欧克41");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("天津");
ss.insert("user.insertUserUUID", user);
System.out.println(user);
ss.commit();
//释放资源
ss.close();
}
-
理解id 与uuid 问题,当设置UUid时id不生效默认为null
<insert id="insertUserUUID" parameterType="com.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey主键返回
keyProperty 主键属性
resultType 数据类型
order 何时执行-->
<selectKey keyProperty="uuid" resultType="string" order="BEFORE">
SELECT UUID()
</selectKey>
useGeneratedKeys="true" keyProperty="id"不生效默认为空
-
理解uuid ,order=“BEFORE” ,order="AFTER"区别
当设置为order="AFTER"时,无法获得值
三、修改功能
1.修改User.xml映射
<update id="updateUser" parameterType="com.mybatis.domain.User">
UPDATE `user`
SET
`username` = #{username}
WHERE
`id` = #{id} ;
</update>
2.添加测试方法
@Test
public void testUpdateUser() throws Exception {
//获取SqlSessionFactory
SqlSessionFactory sql= SqlSessionFactoryUtils.getSql();
//创建SqlSession对象,默认不是自动提交,设置为ture自动提交
SqlSession ss=sql.openSession();
User user = new User();
user.setUsername("百分百欧克22");
user.setId(22);
ss.update("user.updateUser", user);
ss.commit();
//释放资源
ss.close();
}
四、删除功能
1.修改User.xml映射
<update id="deleteUser" parameterType="int">
DELETE FROM `user`
WHERE
`id` = #{id} ;
</update>
2.添加测试方法
@Test
public void testDeleteUser() throws Exception {
//获取SqlSessionFactory
SqlSessionFactory sql= SqlSessionFactoryUtils.getSql();
//创建SqlSession对象,默认不是自动提交,设置为ture自动提交
SqlSession ss=sql.openSession();
/*
* User user = new User(); user.setId(22);
*
* ss.delete("user.deleteUser", user);
*/
ss.delete("user.deleteUser", 22);
ss.commit();
//释放资源
ss.close();
}
五、小结
- #{}占位符 相当于SQL问号
${} $字符串拼接
如果传入参数为普通类型,大括号为value
如果传入为对象,大括号为对象成员变量 - id:sql唯一标识
parameterType 入参类型
resultType 返回结果类型 - selectKey主键返回
keyProperty 主键属性
resultType 数据类型
order 何时执行 - useGeneratedKeys使用自增,keyProperty结合使用
- selectList和selectOne区别
- 增改删功能 创建SqlSession对象,默认不是自动提交,设置为ture自动提交