mybatis学习(2)
3、实例(根据用户名称模糊查询用户列表)
//根据用户名称模糊查询用户列表
@Test
public void findUserByNameTest() {
String resource = "SqlMapConfig.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("test.findUserByName", "客");
System.out.println(list);
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
User.xml:
<!--
${}:表示拼接sql串,将接收到参数得内容不加任何修饰
拼接在sql中,使用${}拼接sql,会引起sql注入
${value}:接收输入参数得内容,如果输入类型是简单
类型,${}中只能用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.fzy.mybatis.po.User">
select * from users where userName like '%${value}%'
</select>
4、小结:
parameterType:输入映射
resultType: 输出映射
#{}表示一个占位符号 #{value}
${}表示一个拼接符号,会引起sql注入。 ‘%${value}%’
selectOne和selectList
selectOne表示查询出一条记录进行映射(可以用selectList查询)
selectList表示查询出一个列表(多条记录)进行映射
5、添加用户
映射文件:在user.xml中配置添加用户得Statement
<!-- 添加用户
patameterType:指定输入参数类型POJO(包括用户信息)
#{}中指定pojo得属性名,接收pojo对象得属性值,mybatis通过OGNL获取对象得属性值
-->
<insert id="insertUser">
insert into users(userName,password,phone,email,sex,status)
value(#{userName},#{password},
#{phone},#{email},#{sex},#{status})
</insert>
程序代码:
//添加用户信息
@Test
public void insertUserTest() {
String resource = "SqlMapConfig.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//插入用户对象
User user = new User();
user.setUserName("why");
user.setPassword("fzy");
user.setPhone("13683");
user.setEmail("why@qq.com");
user.setSex("女");
user.setStatus(2);
sqlSession.insert("test.insertUser", user);
//事务提交
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
6、自增主键返回
mysql自增主键,执行insert提交之前自动生成一个自增主键
通过mysql函数获取到刚插入记录的自增主键
LAST_INSERT_ID() :在insert之后调用该函数
<!-- 添加用户
patameterType:指定输入参数类型POJO(包括用户信息)
#{}中指定pojo得属性名,接收pojo对象得属性值,mybatis通过OGNL获取对象得属性值
-->
<insert id="insertUser" parameterType="com.fzy.mybatis.po.User">
<!-- 将插入数据的主键返回,返回到User对象中
select last_insert_id():得到刚插入记录的主键值
注:只适用于自增主键
keyProperty:将查询得到的主键值设置到parameterType指定的对象的属性
order:此查询语句的执行顺序,相对于insert语句的执行顺序
resultType指定查询的结果类型
-->
<selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
select last_insert_id()
</selectKey>
insert into users(userName,password,phone,email,sex,status)
value(#{userName},#{password},
#{phone},#{email},#{sex},#{status})
</insert>
7、非自增主键返回(使用uuid())
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
思路:
通过uuid()得到主键,将主键值设置到user对象的userId属性中
执行uuid()语句顺序相对于insert语句之前执行
在insert执行时,从user对象中取出userId属性值
<selectKey keyProperty=”userId” order=”BEFORE” resultType=”java.lang.String”>
select uuid()
</selectKey>
insert into users(userId,username,……) value (#{userId},#{username},……)
通过Oracle的序列生成主键:
<selectKey keyProperty=”userId” order=”BEFORE” resultType=”java.lang.String”>
select 序列名.nextval()
</selectKey>
insert into users(userId,username,……) value (#{userId},#{username},……)
8、删除用户
<!-- 根据userId删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where userId=#{userId}
</delete>
@Test
public void deleteUserTest() {
String resource = "SqlMapConfig.xml";
InputStream config;
try {
config = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(config);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser", 5);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
9、更新用户
<!-- 根据userId更新用户
需要初入用户的id
传入用户的更新信息
parameterType指定user对象(包括id和更新信息,i的必须存在)
#{userId}:从输入user对象中获取id属性值
-->
<update id="updateUser" parameterType="com.fzy.mybatis.po.User">
update users set userName=#{userName} where userId=#{userId}
</update>
@Test
public void updateUserTest() {
String resource = "SqlMapConfig.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUserId(4);
user.setUserName("岩");
sqlSession.update("test.updateUser", user);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
10、总结
#{}表示一个占位符号,#{}接收输入参数,类型可以时简单类型,pojo,hashmap
若是简单类型,#{}可以写成value或其它名称
若是pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值。
${}表示一个拼接符号, 会引起sql注入 ‘%${value}%’
#{}接收输入参数,类型可以时简单类型,pojo,hashmap
若是简单类型,#{}只能写成value
若是pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值。