搭建好了Mybatis环境之后,开始利用Mybatis对数据库进行增删改查操作。用的是MySQL数据库,图形化界面用的是navicate。
一、模糊查询操作:
在项目Mybatis_1中:
1.在SQL映射文件UserInfoMapper.xml中加入要执行的模糊查询语句:
<!-- 根据用户名模糊查询用户 -->
<select id="findUserInfoByUserName" parameterType="String" resultType="UserInfo">
select * from user_information where username like CONCAT(CONCAT('%',#{username}),'%')
</select>
select标签:代表进行查询操作
id属性:用于唯一标识该标签,在调用sqlsession的方法时该id值作为参数,来确定要执行映射文件中的哪段SQL语句
parameterType属性:传入给sql语句的参数类型是什么 (本例中String就表示查询语句中的username的类型 )
resultType属性:这里由于在mybatis核心配置文件 mybatis-config.xml 中对包中的类注册了别名,所以设置为UserInfo即可,表示将查询到的结果封装到实体类UserInfo中,注册别名代码如下:
<!--给包中的类注册别名 -->
<typeAliases>
<package name="wyd.mybatis.pojo"/>
</typeAliases>
通过注册别名,简化对需要用到该包中的实体类的书写,只需要写类名而不用写类的路径全名。
select语句:
select * from user_information where username like CONCAT(CONCAT('%',#{username}),'%')
①该语句利用CONCAT函数进行字符串拼接而不用 “+” 可以防止SQL注入从而更加安全
② #{}为一个占位符,相当于jdbc中的 “?” 此外还有一个 ${} ,能用#{}就别用 $(),前者需要传入参数值,能有效防止SQL注入,后者是直接拼接到SQL会有SQL注入的问题
2.在mybatis核心配置文件中引入映射文件UserInfoMapper
<mappers>
<!-- 引用映射文件 -->
<mapper resource="wyd/mybatis/mapper/UserInfoMapper.xml"/>
</mappers>
mappers标签的resource属性值为映射文件UserInfoMapper全路径名
3.在测试类MybatisTest中进行模糊查询,代码如下:
package wyd.mybatis.test;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.After;
import org.junit.Before;
import org.junit.Test;
import wyd.mybatis.pojo.UserInfo;
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
@Before
public void init(){
String resource="mybatis-config.xml";
InputStream inputStream;
try {
//读取mybatis核心配置文件
inputStream=Resources.getResourceAsStream(resource);
//建立会话工厂
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂获取执行SQL语句的sqlsession
sqlSession=sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
//根据用户名模糊查询用户
public void testFindUserInfoByUserName(){
//利用selectList查询,查询结果集封装到集合users中,该集合存的元素为UserInfo类型
//sqlsession传入的参数对应映射文件UserInfoMapper对应sql语句的id值
List<UserInfo> users=sqlSession.selectList("findUserInfoByUserName", "w");
//打印集合中的元素
System.out.println(users.toString());
}
@After
public void destory(){
//提交
sqlSession.commit();
//关闭连接
sqlSession.close();
}
}
选中testFindUserInfoByUserName()方法,执行,结果如下:
在打印的日志中可以看到有三条结果,每一条都是一个UserInfo类型的,对应数据库中数据表有如下三条记录中有’w’,模糊查询成功!
二、添加用户操作
映射文件文件中的insert语句:
<!-- 添加用户 -->
<insert id="addUserInfo" parameterType="String">
insert into user_information (username,password,realname,e_mail,phone) values(#{username},#{password},#{realname},#{e_mail},#{phone})
</insert>
添加用户的代码,如下:
@Test
//添加用户
public void testAddUserInfo(){
UserInfo ui=new UserInfo();
ui.setUsername("panda");
ui.setPassword("1233211");
ui.setRealname("大熊猫");
ui.setE_mail("123123@qq.com");
ui.setPhone("34234212312131");
//执行受影响的行
int result=sqlSession.insert("addUserInfo", ui);
if(result>0){
System.out.println("插入成功");
}else{
System.out.println("插入失败");
}
//插入之后需要提交事务
sqlSession.commit();
}
①利用sqlsession的insert方法进行增加操作,第一个参数对应映射文件相关insert语句的id值,插入的值利用实体类的set方法封装的对象ui
②sqlsession的insert返回一个整型值,代表受影响的行数,如果>0,说明插入成功,否则插入失败
选中该方法执行,结果如下:
查询数据库中的记录如下,可以看到增加了一条“大熊猫”的记录:
三、修改用户操作
映射文件中的update语句:
<!-- 修改用户 -->
<update id="uspdateUserInfo" parameterType="UserInfo">
update user_information set username=#{username},password=#{password} where id=#{id}
</update>
修改用户的代码如下:
//修改用户
public void testUpdateUserInfo(){
//先查询并获取获取id为15的记录ui(UserInfo类型)
UserInfo ui=sqlSession.selectOne("findUserInfoById",15);
//设置ui的密码属性为zzh2311123
ui.setPassword("zzh2311123");
//对ui执行update语句
int result=sqlSession.update("uspdateUserInfo", ui);
//如果影响的记录条数大于0,则修改成功,否则失败
if(result>0){
System.out.println("修改成功!");
System.out.println(ui);
}else{
System.out.println("修改失败!");
}
}
执行结果如下:
查询数据库id为15的记录:
密码已经改变为zzh2311123,至此,修改用户完毕!
四、根据用户id删除用户操作
映射文件中的delete语句:
<!-- 删除用户 -->
<delete id="deleteUserInfo" parameterType="int">
delete from user_information where id =#{id}
</delete>
删除用户的代码如下:
//删除用户
public void testDeleteUserInfo(){
//定义受影响的行数result
int result=sqlSession.delete("deleteUserInfo", 18);
if(result>0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
sqlSession.commit();
}
查询数据库,结果如下:
id为15的用户被删除,完毕!