mybatis的CRUD实例(三)

  前面的文章我们已经实现了根据id查询用户信息的功能,下面我们进行其他业务功能的实现。

一、根据用户名模糊查询用户列表

  查询使用的sql : select * from user where username like '%小明%'

方法一:

  1.1.1 在UserMapper.xml映射文件中添加如下信息:

1 <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中  -->
2     <!--resultType的配置和返回一个结果的配置一样  -->
3     <!--实现功能 :根据用户名模糊查询用户列表  -->
4     <select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
5         select * from user where username like #{username}
6     </select>

  1.2.1 在Test类中添加Junit测试方法:

 1 package mybatis_study;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.After;
12 import org.junit.Before;
13 
14 import com.lwjnicole.pojo.User;
15 
16 public class Test {
17     private SqlSessionFactory sqlSessionFactory = null;
18     private SqlSession session = null;
19     
20     @Before
21     public  void before(){
22         //创建SqlSessionFactoryBuilder对象
23         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
24         InputStream inputStream = null;
25         try {
26             //加载SqlMapConfig.xml配置文件
27             inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
28         } catch (IOException e) {
29             e.printStackTrace();
30         }
31         //创建SqlSessionFactory对象
32         this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
33     }
34     
35     //根据用户名模糊查询用户列表
36     @org.junit.Test
37     public void findUserByUsername(){
38         //创建SqlSession对象
39         session = sqlSessionFactory.openSession();
40         //使用SqlSession对象执行查询sql,获得结果(查询多条数据,使用selectList方法)
41         List<User> userList  = session.selectList("findUserByUsername", "%小明%");
42         //打印结果
43         for (User user : userList) {
44             System.out.println(user);
45         }
46     }
47     
48     @After
49     public void after(){
50         //释放资源
51         session.close();
52     }    
53 }

  1.3.1 打印结果为:

方法二:

  2.1.1 在UserMapper.xml映射文件中添加如下信息:

1     <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中  -->
2     <!--resultType的配置和返回一个结果的配置一样  -->
3     <!--实现功能 :根据用户名模糊查询用户列表  -->
4     <select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
5         select * from user where username like '%${value}%'
6     </select>

  2.1.2 在Test类中添加Junit测试方法:

 1 package mybatis_study;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.After;
12 import org.junit.Before;
13 
14 import com.lwjnicole.pojo.User;
15 
16 public class Test {
17     private SqlSessionFactory sqlSessionFactory = null;
18     private SqlSession session = null;
19     
20     @Before
21     public  void before(){
22         //创建SqlSessionFactoryBuilder对象
23         SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
24         InputStream inputStream = null;
25         try {
26             //加载SqlMapConfig.xml配置文件
27             inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
28         } catch (IOException e) {
29             e.printStackTrace();
30         }
31         //创建SqlSessionFactory对象
32         this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
33     }
34     
35     //根据用户名模糊查询用户列表
36     @org.junit.Test
37     public void findUserByUsername(){
38         //创建SqlSession对象
39         session = sqlSessionFactory.openSession();
40         //使用SqlSession对象执行查询sql,获得结果(查询多条数据,使用selectList方法)
41         List<User> userList  = session.selectList("findUserByUsername", "小明");
42         //打印结果
43         for (User user : userList) {
44             System.out.println(user);
45         }
46     }
47     
48     @After
49     public void after(){
50         //释放资源
51         session.close();
52     }
53 }

  2.1.3 打印结果:

二、总结

  2.1 #{}${} 的区别:

   #{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行java类型和jdbc类型转换。 #{} 可以有效的防止SQL注入。 #{} 可以接收简单类型值和 pojo 属性值。如果 parameterType 传输单个简单类型值,#{} 括号中可以填写 value 或者是 其他名称

  ${} 表示拼接SQL串,通过 ${} 可以将 parameterType 中传入的内容拼接在sql 中且 不进行jdbc类型转换,${} 可以接收简单类型值和 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中只能填写 value

  2.2 parameterType 和 resultType 

parameterType : 指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中;

resultType :指定输出结果类型,mybatis 将sql 查询结果的一行记录数据映射为 resultType 中指定类型的对象。如果有多条数据,则分别进行映射,并把对象存放到 list 容器中。

  2.3 selectOne 方法 和 selectList 方法:

selectOne 方法:查询一条记录,如果使用 selectOne 查询多条记录,则会抛出异常:

    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3

selectList  方法:可以查询一条或者多条记录。

原文地址:https://www.cnblogs.com/lwjnicole/p/8358713.html