作用:解决大量拼装SQL的工作
1.动态sql 1)<sql> a)把公共的字段抽取出来 b)用<include refid="base_user"> 2)<if> a)条件查询 b)修改的时候 3)<where> a)自动添加where关键字,去掉多余的and 4)<trim> a)可以代替where和set 5)<set> a)自动添加set关键字,去掉多余的逗号(传多个逗号,只会去掉一个) 6)<choose> a)when b)otherwise 7)<foreach> 1)collection a)如何是数组就写array b)如何是集合就写list a)如何是Map就写map中的key 2)open:循环之前添加 3)close:循环之后添加 4)separator:分隔符 5)item:临时变量
事例:
0.数据库
1.创建项目
2.建包建配置文件
com.qf.entity
com.qf.dao
com.qf.mapper
com.qf.utils
mybatis-config.xml
3.con.qf.entity包中创建实体类
package com.qf.entity; public class User { private Integer id; private String name; private String password; private String isAdmin; public User(String name, String password) { this.name = name; this.password = password; } public User() { } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getIsAdmin() { return isAdmin; } public void setIsAdmin(String isAdmin) { this.isAdmin = isAdmin; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + ", isAdmin=" + isAdmin + "]"; } }
4.con.qf.dao包中创建接口
package com.qf.dao; import java.util.List; import java.util.Map; import com.qf.entity.User; public interface IUserDao { public User getUserById(Integer id); public List<User> findUser(User user); public List<User> findUser2(User user); public List<User> findUser3(User user); public List<User> findUser4(User user); public List<User> findUser5(List<Integer> ids); public List<User> findUser6(int[] ids); public List<User> findUser7(Map<String, Integer[]> map); public void update(User user); public void update2(User user); public List<User> getUserList(); }
5.配置jdbc.properties配置文件
jdbc.url =jdbc:mysql://localhost:3306/1707_hibernate jdbc.name=root jdbc.password=root jdbc.driver=com.mysql.jdbc.Driver
配置mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 加载属性文件 resource:本地资源文件 --> <properties resource="jdbc.properties"></properties> <typeAliases> <package name="com.qf.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.name}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> </configuration>
6.com.qf.mapper包创建接口的映射文件
<?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"> <mapper namespace="com.qf.dao.IUserDao"> <resultMap type="user" id="userMap"> <result column="is_admin" property="isAdmin"/> </resultMap> <!-- 把共用的sql都可以抽取出来 --> <sql id="base_user"> id, NAME, PASSWORD, is_admin </sql> <select id="getUserById" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user WHERE id = #{id} </select> <select id="getUserList" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user </select> <!-- 测试if标签 --> <select id="findUser" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user WHERE 1 =1 <if test="id != null"> and ID = #{id} </if> <!--字符串判断非空的时候有两种情况 --> <!--concat 链接字符串 --> <if test="name != null and name != ''"> <!-- and name = #{name} --> and name like concat("%",#{name},"%") </if> </select> <!-- 测试where标签 --> <select id="findUser2" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <!-- where标签自动添加where关键字,去掉多余的and关键字 --> <where> <if test="id != null"> and ID = #{id} </if> <if test="name != null and name != ''"> and name like concat("%",#{name},"%") </if> </where> </select> <!-- 测试trim标签 --> <select id="findUser3" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <!-- 添加前缀,去掉多余的内容 --> <trim prefix="where" prefixOverrides="and"> <if test="id != null"> and ID = #{id} </if> <if test="name != null and name != ''"> and name like concat("%",#{name},"%") </if> </trim> </select> <!-- 测试set标签 添加set关键字,去掉多余的逗号 --> <update id="update" parameterType="user"> UPDATE t_user <set> <if test="name != null and name != ''"> NAME = #{name}, </if> <if test="password != null and password != ''"> password = #{password} </if> </set> where id = #{id} </update> <update id="update2" parameterType="user"> UPDATE t_user <trim prefix="set" suffixOverrides=","> <if test="name != null and name != ''"> NAME = #{name}, </if> <if test="password != null and password != ''"> password = #{password} </if> </trim> where id = #{id} </update> <!-- 测试when、otherwise标签 --> <select id="findUser4" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <where> <choose> <when test="name != null and name != ''"> name like concat("%",#{name},"%") </when> <otherwise> name is not null </otherwise> </choose> </where> </select> <!-- 传递list --> <select id="findUser5" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <where> id in <foreach collection="list" open="(" close=")" separator="," item="id"> #{id} </foreach> </where> </select> <!-- 传递数组 --> <select id="findUser6" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <where> id in <foreach collection="array" open="(" close=")" separator="," item="id"> #{id} </foreach> </where> </select> <!-- 传递Map --> <select id="findUser7" resultMap="userMap"> SELECT <include refid="base_user"></include> FROM t_user <where> id in <foreach collection="ids" open="(" close=")" separator="," item="id"> #{id} </foreach> </where> </select> </mapper>
7.在mybatis-config.xml里面读取Mapper文件
<!-- Mapper文件 --> <mappers> <mapper resource="com/qf/mapper/IUserDao.xml" /> </mappers>
8.com.qf.util工具类
package com.qf.utils; import java.io.IOException; import java.io.InputStream; 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.xml.sax.InputSource; public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; public static SqlSessionFactory getSqlSessionFactory() { if (sqlSessionFactory == null) { initSqlSessionFactory(); // 为空再去参加 } return sqlSessionFactory; } private static void initSqlSessionFactory() { InputStream ips = null; try { // 1.指定配置文件 ips = Resources.getResourceAsStream("mybatis-config.xml"); // 2.赋值操作 synchronized (MyBatisUtil.class) { if (sqlSessionFactory == null) { sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips); } } } catch (IOException e) { e.printStackTrace(); } finally { if (ips != null) { try { ips.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
9.测试类
package com.qf.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.log4j.Logger; import org.junit.Test; import com.qf.entity.User; import com.qf.utils.MyBatisUtil; public class UserDaoTest { private Logger logger = Logger.getLogger(UserDaoTest.class); /** * useGeneratedKeys:开启主键回填 keyProperty:回填到那个属性 */ /** * 抽取公共sql,查询当个对象 */ @Test public void testGetUserById() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = userDao.getUserById(4); System.out.println(user); sqlSession.commit(); sqlSession.close(); } /** * 抽取公共sql,查询List */ @Test public void testGetUserList() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); List<User> userList = userDao.getUserList(); for (User user2 : userList) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试if标签 初识if */ @Test public void testFindUser() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); user.setPassword("123"); List<User> findUser = userDao.findUser(user); for (User user2 : findUser) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试if标签 if+模糊查询 */ @Test public void testFindUser1() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); // 模糊查询 user.setName("张"); List<User> findUser = userDao.findUser1(user); for (User user2 : findUser) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试where标签 初识where */ @Test public void testFindUser2() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); user.setPassword("123"); List<User> findUser = userDao.findUser2(user); for (User user2 : findUser) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试trim标签 */ @Test public void testFindUser3() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); user.setPassword("123"); List<User> findUser = userDao.findUser3(user); for (User user2 : findUser) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试update标签 */ @Test public void testUpdate() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); user.setId(3); user.setName("李四"); user.setPassword("435"); userDao.update(user); sqlSession.commit(); sqlSession.close(); } @Test public void testUpdate2() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); user.setId(3); user.setName("李5"); userDao.update2(user); sqlSession.commit(); sqlSession.close(); } /** * 测试when、otherwise标签 */ @Test public void testFindUser4() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user = new User(); // user.setName("李"); List<User> findUser4 = userDao.findUser4(user); for (User user2 : findUser4) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 传递list */ @Test public void testFindUser5() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); List<Integer> list = new ArrayList<Integer>(); list.add(2); list.add(3); list.add(4); list.add(5); List<User> findUser4 = userDao.findUser5(list); for (User user2 : findUser4) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 传递数组 */ @Test public void testFindUser6() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); int[] ids = new int[] { 1, 2, 3, 4, 5 }; List<User> findUser4 = userDao.findUser6(ids); for (User user2 : findUser4) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } /** * 测试map */ @Test public void testFindUser7() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); IUserDao userDao = sqlSession.getMapper(IUserDao.class); Integer[] ids = new Integer[] { 1, 2, 3, 4, 5 }; Map<String, Integer[]> map = new HashMap<String, Integer[]>(); map.put("ids", ids); List<User> findUser4 = userDao.findUser7(map); for (User user2 : findUser4) { System.out.println(user2); } sqlSession.commit(); sqlSession.close(); } }
总结: