前面的文章我们已经实现了根据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 方法:可以查询一条或者多条记录。