public class User { private int id; private String username;// 用戶姓名 private String sex;// 性別 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
public class UserCustom extends User { //添加一些擴展字段 }
public class UserQueryVo { //用戶信息 private User user; //自定義user的擴展對象 private UserCustom userCustom; //用戶id集合 private List<Integer> ids; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public UserCustom getUserCustom() { return userCustom; } public void setUserCustom(UserCustom userCustom) { this.userCustom = userCustom; } public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"></properties> <!-- 定義 別名 --> <typeAliases> <!-- 單個別名的定義 alias:別名,type:別名映射的類型 --> <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --> <!-- 批量別名定義 指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認爲類名(首字母小寫或大寫) --> <package name="cn.itcast.mybatis.po"/> </typeAliases> <!-- 和spring整合後 environments配置將廢除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理--> <transactionManager type="JDBC" /> <!-- 數據庫鏈接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--加載mapper映射 若是將和spring整合後,能夠使用整合包中提供的mapper掃描器,此處的mappers不用配置了。 --> <mappers> <package name="cn.yzu.mybatis.mapper"/> </mappers> </configuration>
public interface UserMapper { //根據用戶id查詢用戶信息 public User findUserById(int id) throws Exception; //根據用戶名稱 查詢用戶信息 public List<User> findUserByName(String username) throws Exception; //自定義查詢條件查詢用戶信息 public List<User> findUserList(UserQueryVo userQueryVo) throws Exception; //查詢用戶,使用resultMap進行映射 public List<User> findUserListResultMap(UserQueryVo userQueryVo)throws Exception; //查詢用戶,返回記錄個數 public int findUserCount(UserQueryVo userQueryVo) throws Exception; //插入用戶 public void insertUser(User user)throws Exception; //刪除用戶 public void deleteUser(int id) throws Exception; //修改用戶 public void updateUser(User user) throws Exception; }
<?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"> <!-- namespace命名空間,爲了對sql語句進行隔離,方便管理 ,mapper開發dao方式,使用namespace有特殊做用 mapper代理開發時將namespace指定爲mapper接口的全限定名 --> <mapper namespace="cn.yzu.mybatis.mapper.UserMapper"> <!-- 在mapper.xml文件中配置不少的sql語句,執行每一個sql語句時,封裝爲MappedStatement對象 mapper.xml以statement爲單位管理sql語句 --> <!-- 將用戶查詢條件定義爲sql片斷 建議對單表的查詢條件單獨抽取sql片斷,提升公用性 注意:不要將where標籤放在sql片斷 --> <sql id="query_user_where"> <!-- 若是 userQueryVo中傳入查詢條件,再進行sql拼接--> <!-- test中userCustom.username表示從userQueryVo讀取屬性值--> <if test="userCustom!=null"> <if test="userCustom.username!=null and userCustom.username!=''"> and username like '%${userCustom.username}%' </if> <if test="userCustom.sex!=null and userCustom.sex!=''"> and sex = #{userCustom.sex} </if> <!-- 根據id集合查詢用戶信息 --> <!-- 最終拼接的效果: SELECT id ,username ,birthday FROM USER WHERE username LIKE '%小明%' AND id IN (16,22,25) collection:集合的屬性 open:開始循環拼接的串 close:結束循環拼接的串 item:每次循環取到的對象 separator:每兩次循環中間拼接的串 --> <foreach collection="ids" open=" AND id IN ( " close=")" item="id" separator=","> #{id} </foreach> <!-- SELECT id ,username ,birthday FROM USER WHERE username LIKE '%小明%' AND (id = 16 OR id = 22 OR id = 25) <foreach collection="ids" open=" AND ( " close=")" item="id" separator="OR"> id = #{id} </foreach> --> <!-- 還有不少的查詢條件 --> </if> </sql> <!-- 定義resultMap,列名和屬性名映射配置 id:mapper.xml中的惟一標識 type:最終要映射的pojo類型 --> <resultMap id="userListResultMap" type="user" > <!-- 列名 id_,username_,birthday_ id:要映射結果集的惟 一標識 ,稱爲主鍵 column:結果集的列名 property:type指定的哪一個屬性中 --> <id column="id_" property="id"/> <!-- result就是普通列的映射配置 --> <result column="username_" property="username"/> <result column="birthday_" property="birthday"/> </resultMap> <!-- 根據id查詢用戶信息 --> <select id="findUserById" parameterType="int" resultType="user"> SELECT * FROM USER WHERE id= #{id} </select> <!-- 根據用戶名稱查詢用戶信息,可能返回多條--> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.yzu.mybatis.po.User"> select * from user where username like '%${value}%' </select> <!-- 自定義查詢條件查詢用戶的信息 %${userCustom.username}%:userCustom是userQueryVo中的屬性,經過OGNL獲取屬性的值 --> <select id="findUserList" parameterType="userQueryVo" resultType="user"> select id,username,birthday,sex from user <!-- where標籤至關 於where關鍵字,能夠自動去除第一個and --> <where> <!-- 引用sql片斷,若是sql片斷和引用處不在同一個mapper必須前邊加namespace --> <include refid="query_user_where"></include> <!-- 下邊還有很其它的條件 --> <!-- <include refid="其它的sql片斷"></include> --> </where> </select> <!-- 使用resultMap做結果映射 resultMap:若是引用resultMap的位置和resultMap的定義在同一個mapper.xml,直接使用resultMap的id,若是不在同一個mapper.xml要在resultMap的id前邊加namespace --> <select id="findUserListResultMap" parameterType="userQueryVo" resultMap="userListResultMap"> select id id_,username username_,birthday birthday_ from user where username like '%${userCustom.username}%' </select> <!-- 輸出簡單類型 功能:自定義查詢條件,返回查詢記錄個數,一般用於實現 查詢分頁 --> <select id="findUserCount" parameterType="userQueryVo" resultType="int"> select count(*) from user <where> <include refid="query_user_where"></include> </where> </select> <!-- 添加用戶--> <insert id="insertUser" parameterType="cn.yzu.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() </selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
public class UserMapperTest { // 會話工廠 private SqlSessionFactory sqlSessionFactory; // 建立工廠 @Before public void init() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); // 建立代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1); System.out.println(user); } @Test public void testFindUserByUsername() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.findUserByName("小明"); System.out.println(list); } @Test public void testInsertUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("李奎123"); userMapper.insertUser(user); sqlSession.commit(); sqlSession.close(); } // 經過包裝類型查詢用戶信息 @Test public void testFindUserList() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 構造查詢條件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setUsername("小明"); userCustom.setSex("1"); userQueryVo.setUserCustom(userCustom); //id集合 List<Integer> ids = new ArrayList<Integer>(); ids.add(16); ids.add(22); userQueryVo.setIds(ids); List<User> list = userMapper.findUserList(userQueryVo); sqlSession.close(); System.out.println(list); } // 使用resultMap進行結果映射 @Test public void testFindUserListResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setUsername("小明"); userQueryVo.setUserCustom(userCustom); List<User> list = userMapper.findUserListResultMap(userQueryVo); sqlSession.close(); System.out.println(list); } // 返回查詢記錄總數 @Test public void testFindUserCount() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setUsername("小明"); userQueryVo.setUserCustom(userCustom); //id集合 List<Integer> ids = new ArrayList<Integer>(); ids.add(16); ids.add(22); userQueryVo.setIds(ids); int count = userMapper.findUserCount(userQueryVo); sqlSession.close(); System.out.println(count); } }