1 PersonTestMapper.xml中的内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE PUBLIC "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间,用来唯一标识一个映射文件,命名规范就是当前的文件的包加上文件名 --> <mapper <!-- 根据id来查询一个Person的数据 sql语句接收参数的一个语法#{},如果接收的是一个{}中的内容任意select id:sql语句的唯一的标识不能重复 parameterType:sql要接收的数据类型 resultType:sql所返回的数据类型 --> <!-- 实际项目中数据库的表的字段一般由多个单词来构成 在java的model的实体类中的属性多个单词的命名规范是驼峰模式personAddr --> <select select * from person_test t where t.ID = #{id} </select> </mapper> |
2
PersonMapper.xml的配置内容如下(resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询map传递参数,模糊查询,插入,更新,删除,where条件查询,动态修改,in查询foreach迭代,批量插入foreach,批量删除,一对多查询,extends:resultMap的继承,多对多查询,延迟加载):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE PUBLIC "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间,用来唯一标识一个映射文件,命名规范就是当前的文件的包名+mapper的xml文件名 --> <mapper <!--当前映射文件开启二级缓存--> <cache <!-- id:resultMap的唯一标识 type:给哪个实体类做结果的映射 --> <resultMap <!-- column:数据库中表的字段 property:数据库中表所有映射的实体类javaBean中的属性名 --> <id <result <result <result <result </resultMap> <!-- 公用的sql片段,也可以接收参数,动态sql,所有的sql可以使用 --> <sql PERSON_ID, NAME, GENDER, PERSON_ADDR, BIRTHDAY </sql> <!-- 根据id来查询一个Person的数据 sql语句接收参数的一个语法#{},如果接收的是一个{}中的内容任意select id:sql语句的唯一的标识不能重复 parameterType:sql要接收的数据类型 resultType:sql所返回的数据类型 --> <!-- 实际项目中数据库的表的字段一般由多个单词来构成 在java的model的实体类中的属性多个单词的命名规范是驼峰模式personAddr --> <!-- useCache:控制当前的这个sql是否使用二级缓存 --> <select select * from person t where t.person_id = #{id} </select> <select select count(*) from person </select> <!-- <select select <include </select> <!-- 可以使用map map.put("gender",1); map.put("birthday" new Date()); #{}中的内容使用Map的key来接收参数 --> <select <![CDATA[ select * from person t where t.gender = #{gender} and t.birthday < #{birthday} ]]> </select> <!-- 使用查询对象的get方法来接收参数(也就是属性名) --> <select <![CDATA[ select * from person t where t.gender = #{gender} and t.birthday < #{birthday} ]]> </select> <!-- 模糊查询使用${} select * from person t parameterType:不能直接使用String,一定要用查询对象或者map --> <select select * from person t where t.name like ‘%${name}%‘ </select> <!-- <insert <!-- keyProperty:实体类中主键属性,主键生成后把主键返回给这个属性 order:生成主键的sql和insert执行的顺序, resultType: 主键返回的数据类型 sql: 在mysql中select 在oracle中 selectKey做了两件事:1.主键自增 --> <selectKey select LAST_INSERT_ID() </selectKey> insert into person (person_id, name, gender, person_addr, birthday) values(#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}) </insert> <update update person p set p.name = #{name}, p.gender = #{gender}, p.person_addr = #{personAddr}, p.birthday = #{birthday} where p.person_id = #{personId} </update> <!-- 删除的sql不能使用别名 --> <delete delete from person where person_id = #{personId} </delete> <!-- =============================动态sql================================== <!-- map.put("name", "安"); map.put("gender", "0"); map.put("personAddr", "东京") map.put("birthday", new Date()); <where>会自动处理and, --> <select select * from person t <where> <if t.name like ‘%${name}%‘ </if> <if and t.gender = #{gender} </if> <if and t.person_addr like ‘%${personAddr}%‘ </if> <if <![CDATA[ and t.birthday < #{birthday} ]]> </if> </where> </select> <!-- 动态修改 <set>标签可以去掉最后一个逗号 flushCache:二级缓存的刷新的配置:默认是true:会刷新,如果false就不刷新缓存 --> <update update person t <set> <if t.name = #{name}, </if> <if t.gender = #{gender}, </if> <if t.person_addr = #{personAddr}, </if> <if t.birthday = #{birthday} </if> </set> where t.person_id = #{personId} </update> <!-- select * from person t where t.person_id in (1,2,3) map.put("ids", list); --> <select select * from person t where t.person_id in <foreach #{personId} </foreach> </select> <!-- map.put("pList", pList); insert into person (person_id, name, gender, person_addr, birthday) values (#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}), (#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}), (#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}), (#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}), (#{personId}, #{name}, #{gender}, #{personAddr}, #{birthday}); --> <insert <selectKey select LAST_INSERT_ID() </selectKey> insert into person (person_id, name, gender, person_addr, birthday) values <foreach (#{person.personId}, #{person.name}, #{person.gender}, #{person.personAddr}, #{person.birthday}) </foreach> </insert> <delete delete from person where person_id in <foreach #{personId} </foreach> </delete> <!-- ===============================关联查询================== <!-- <resultMap <id <result <result <result <result <!-- collection:一对多的关联映射 property:一的端集合的属性名 ofType:集合中的泛型 --> <collection <id <result <result <result </collection> </resultMap> <!-- extends:resultMap的继承 --> <resultMap <collection <id <result <result <result </collection> </resultMap> <resultMap <collection <id <result <result <result <collection <id <result <result <result <result </collection> </collection> </resultMap> <resultMap <collection <id <result <result </collection> </resultMap> <select select * from person p, orders o where p.PERSON_ID = o.PERSON_ID and p.PERSON_ID = #{personId} </select> <select select * from person p, orders o, order_detail od where p.PERSON_ID = o.PERSON_ID and o.ORDER_ID = od.ORDER_ID and p.PERSON_ID = #{personId} </select> <!-- <select SELECT p.*, r.* from person p, person_role pr, role r where p.PERSON_ID = pr.PERSON_ID and pr.ROLE_ID = r.ROLE_ID and p.PERSON_ID = #{personId} </select> <!-- =========================延迟加载======================== <resultMap <!-- column:主sql的一列作为子sql的参数 select:指定子sql的位置 --> <collection </collection> </resultMap> <select select * from person t where t.person_id = #{personId} </select> </mapper> |
3
配置sqlMapConfig.xml中的<mappers>配置:
<!-- 集中管理表的映射文件 --> <mappers> <mapper <mapper <mapper <mapper <mapper </mappers> |
4
测试代码如下:
MybatisTest.java
package com.rl.test; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; 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.Before; import org.junit.Test; import com.rl.model1.Person; import com.rl.model1.QueryCondition; /** * mybatis的简单查询 */ public class MybatisTest { SqlSessionFactory sessionFactory; @Before public void setUp() throws Exception { InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(in); } /** * 通过id查询数据 */ @Test public void selectPersonById() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 com.rl.model.Person person = session.selectOne( "com.rl.mapper.PersonTestMapper.selectPersonById", 1); System.out.println(person); } finally{ session.close(); } } /** * 使用resultMap来查询 */ @Test public void selectPersonById1() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 Person person = session.selectOne("com.rl.mapper.PersonMapper.selectPersonById", 1); System.out.println(person); } finally{ session.close(); } } /** * 查询表的记录数 */ @Test public void selectPersonCount() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { Integer count = session.selectOne("com.rl.mapper.PersonMapper.selectPersonCount"); System.out.println(count); } finally{ session.close(); } } /** * 查询所有Person */ @Test public void selectPersonAll() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { //查询集合的时候需要使用selectList List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonAll"); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } /** * 使用多个参数用Map方式来查询 */ @Test public void selectPersonByParams() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { Map<String, Object> map = new HashMap<String, Object>(); map.put("gender",0); map.put("birthday", new Date()); //查询集合的时候需要使用selectList List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonByParams",map); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } /** * 使用多个参数查询数据,使用查询对象的方式 */ @Test public void selectPersonByParams1() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { QueryCondition qc = new QueryCondition(); qc.setGender("0"); qc.setBirthday(new Date()); //查询集合的时候需要使用selectList List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonByParams1",qc); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } /** * 模糊查询 */ @Test public void selectPersonByLike() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { QueryCondition qc = new QueryCondition(); qc.setName("武"); //查询集合的时候需要使用selectList List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonByLike",qc); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } } |
MybatisTest1.java的内容如下:
package com.rl.test; import java.io.InputStream; import java.util.Date; 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.Before; import org.junit.Test; import com.rl.model1.Person; /** * mybatis的数据库表的变更 */ public class MybatisTest1 { SqlSessionFactory sessionFactory; @Before public void setUp() throws Exception { InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(in); } /** * 数据插入主键返回 * public void saveOrder(Orders order, List<OrderDetail> detailList){ orderDao.save(order); for(OrderDetail detail : detailList){ detail.setOrderId(order.getOrderId()); detailDao.save(detail) } } */ @Test public void insert(){ SqlSession session = sessionFactory.openSession(); Person p = new Person(); //p.setPersonId(3); p.setName("武松"); p.setGender("0"); p.setPersonAddr("阳谷县"); p.setBirthday(new Date()); try { session.insert("com.rl.mapper.PersonMapper.insert", p); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } /** * 修改,将id是3的记录改成 */ @Test public void update(){ SqlSession session = sessionFactory.openSession(); Person p = new Person(); p.setPersonId(3); p.setName("陆虞候"); p.setGender("0"); p.setPersonAddr("阳谷县"); p.setBirthday(new Date()); try { session.update("com.rl.mapper.PersonMapper.update", p); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } /** * 删除 */ @Test public void delete(){ SqlSession session = sessionFactory.openSession(); try { session.delete("com.rl.mapper.PersonMapper.delete", 4); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } } |
MybatisTest2.java
package com.rl.test; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; 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.Before; import org.junit.Test; import com.rl.model1.Person; /** * mybatis的动态sql */ public class MybatisTest2 { SqlSessionFactory sessionFactory; @Before public void setUp() throws Exception { InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(in); } @Test public void selectPersonByCondition() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "安"); map.put("gender", "0"); //map.put("personAddr", "东京"); //map.put("birthday", new Date()); //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonByCondition", map); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } @Test public void dynamicUpdate(){ SqlSession session = sessionFactory.openSession(); Person p = new Person(); p.setPersonId(3); p.setName("陆虞候"); p.setGender("0"); //p.setPersonAddr("阳谷县"); //p.setBirthday(new Date()); try { session.update("com.rl.mapper.PersonMapper.dynamicUpdate", p); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } /** * foreach的用法 */ @Test public void selectPersonByIn() { //创建session对象 SqlSession session = sessionFactory.openSession(); try { Map<String, Object> map = new HashMap<String, Object>(); /*List list = new ArrayList(); list.add(1); list.add(2); list.add(3);*/ String [] list = {"1","2","3"}; map.put("ids", list); List<Person> pList = session.selectList("com.rl.mapper.PersonMapper.selectPersonByIn", map); for(Person p : pList){ System.out.println(p); } } finally{ session.close(); } } /** * 批量插入 */ @Test public void insertBatch(){ SqlSession session = sessionFactory.openSession(); Map<String,Object> map = new HashMap<String,Object>(); List<Person> pList= new ArrayList<Person>(); try { for(int i = 0; i < 1000009; i++){ Person p = new Person(); p.setName("武松"+i); p.setGender("0"); p.setPersonAddr("阳谷县"); p.setBirthday(new Date()); pList.add(p); if(i%100 == 0){ map.put("pList", pList); session.insert("com.rl.mapper.PersonMapper.insertBatch", map); pList.clear(); } } map.put("pList", pList); session.insert("com.rl.mapper.PersonMapper.insertBatch", map); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } @Test public void deleteBatch(){ SqlSession session = sessionFactory.openSession(); Map<String,Object> map = new HashMap<String,Object>(); List<Integer> ids= new ArrayList<Integer>(); try { for(int i = 106; i < 1000115; i++){ ids.add(i); if(i%100 == 0){ map.put("ids", ids); session.delete("com.rl.mapper.PersonMapper.deleteBatch", map); ids.clear(); } } map.put("ids", ids); session.insert("com.rl.mapper.PersonMapper.deleteBatch", map); //库表的变更都需要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally{ session.close(); } } } |
MybatisTest3.java的内容如下:
package com.rl.test; 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.junit.Before; import org.junit.Test; import com.rl.model1.Orders; import com.rl.model1.Person; import com.rl.model1.Role; /** * */ public SqlSessionFactory sessionFactory; @Before public InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); sessionFactory = } /** * 一对多关联查询 */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 Person person = session.selectOne("com.rl.mapper.PersonMapper.selectPersonAndOrderByPId", System.out.println(person); } finally{ session.close(); } } /** * 查询Person下的所有订单和订单下的明细 */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 Person person = session.selectOne("com.rl.mapper.PersonMapper.selectPersonOrderAndDetailByPId", System.out.println(person); } finally{ session.close(); } } /** * 多对多查询从Person端出发 */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 Person person = session.selectOne("com.rl.mapper.PersonMapper.selectPersonAndRoleByPId", System.out.println(person); } finally{ session.close(); } } /** * 多对多查询从角色端来看 */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { //第一个参数:指定要执行的sql语法是namespace.sql的id,第二个参数sql要接收的参数 Role role = session.selectOne("com.rl.mapper.RoleMapper.selectRoleAndPersonByRId", System.out.println(role); } finally{ session.close(); } } /** * 多对一的关联查询 *这里的mapper配置文件在后续的博文中定义。 */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { Orders order = session.selectOne("com.rl.mapper.OrdersMapper.selectPersonByOrderId", System.out.println(order); } finally{ session.close(); } } /** * 多对一和一对多混合查询 * */ @Test public //创建session对象 SqlSession session = sessionFactory.openSession(); try { Orders order = session.selectOne("com.rl.mapper.OrdersMapper.selectPersonAndDetailByOrderId", System.out.println(order); } finally{ session.close(); } } } |