Java框架學習_Mybatis(二)(查)根據id查詢使用者資訊、抽取工具類,根據使用者名稱模糊查詢
阿新 • • 發佈:2019-01-10
原始碼:MybatisDemo增刪改查
1、Mybatis根據id查詢使用者資訊:
前面已經配置過了,現在來做一個測試類
- 修改一下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">
<!-- 名稱空間,用於隔離sql語句,後續會有重要作用 -->
<mapper namespace ="user">
<!--
id:sql語句的唯一標識
parameterType:入參的資料型別
resultType:返回結果的資料型別
#{}:佔位符,相當於?,裡面的東西隨便寫
${value}:基本資料型別必須是value
-->
<select id="getUserById" parameterType="int" resultType="cn.nupt.pojo.User">
select * from user where id = #{id2}
<!--或者: select * from user where id = ${value} -->
</select>
</mapper>
然後在src下面建一個測試包測試類,這裡用junit做單元測試
package cn.nupt.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import javax.jws.soap.SOAPBinding.Use;
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.Test;
import cn.nupt.pojo.User;
public class MybatisTest {
@Test
public void testMybatis() throws IOException {
// 建立SqlSessionFactoryBuilder物件
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 建立核心配置檔案的輸入流
InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通過輸入流建立SqlSessionFactory物件
SqlSessionFactory sqlSessionFactory = ssfb.build(stream);
// 建立SqlSession物件
SqlSession session = sqlSessionFactory.openSession();
// 執行查詢,第一個引數就是user.xml裡面sql語句的id,最好加上user字首,第二個引數就是佔位符裡面的數了
//這裡就相當於了 select * from user where id = 1
User user = session.selectOne("user.getUserById", 1);
System.out.println(user);
session.close();
}
}
輸出:User [id=1, username=王五, sex=2, birthday=null, address=null]
2、抽取工具類,根據使用者名稱模糊查詢:
就像之前抽取JDBC語句一樣,在這裡也來把通用的步驟抽取一下,主要是抽取SqlSessionFactory物件
新建Utils包,然後建立SqlSessionFactoryUtils:
package cn.nupt.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 sqlSessionFactory;
//靜態程式碼塊,只初始化一次
static {
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
InputStream stream;
try {
stream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = ssfb.build(stream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//增加一個get方法
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
為什麼只抽取到sqlSessionFactory,不抽取到sqlSession?
Mybatis文件裡面是這麼說的:Mybatis文件(中英)
大概意思就是說每個執行緒都應該只擁有自己的sqlSession例項,因為sqlSession是執行緒不安全的,所以它最好作用在請求域或者方法域裡面,不要將sqlSession的引用放在靜態域裡面(就是static修飾的),甚至於不要放在類的方法屬性裡面…最好還需要在一個方法塊(就是{ })裡面把sqlSession關掉
然後我們繼續在user.xml裡面新增sql語句:
<?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">
<!-- 名稱空間,用於隔離sql語句,後續會有重要作用 -->
<mapper namespace="user">
<!--
id:sql語句的唯一標識
parameterType:入參的資料型別
resultType:返回結果的資料型別
#{}:佔位符,相當於?,裡面的東西隨便寫
${value}:普通資料型別必須是value
-->
<select id="getUserById" parameterType="int" resultType="cn.nupt.pojo.User">
<!-- select * from user where id = #{id2} -->
<!-- 或者: --> select * from user where id = ${value}
</select>
<select id="getUserByName" parameterType="string" resultType="cn.nupt.pojo.User">
<!-- select * from user where name like '%張%' -->
<!-- 和下面的一樣都可以,只不過輸入完整的:“%張%”
select * from user where username like #{id2} -->
select * from user where username like '%${value}%'
</select>
</mapper>
然後用已經抽取的工具類在測試方法裡面輸入:
package cn.nupt.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.jws.soap.SOAPBinding.Use;
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.Test;
import cn.nupt.mybatis.utils.SqlSessionFactoryUtils;
import cn.nupt.pojo.User;
public class MybatisTest {
@Test
public void testMybatis() throws IOException {
SqlSessionFactory sessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession session = sessionFactory.openSession();
List<User> list = session.selectList("user.getUserByName", "張");
for (User user : list) {
System.out.println(user);
}
session.close();
}
}