MyBatis基于代理机制,可以让我们无需再编写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。
注意事项:
① :接口必须Mapper结尾,名字是DomainMapper
② :mapper.xml文件要和Mapper接口建立关系,通过namespace:要能连接到Mapper接口
③ : User get(Long id)返回值,方法,参数类型等必须使:Mapper接口和mapper.xml保持一致
具体步骤代码如下:
1. 核心配置文件:mybatis-config.xml 及 db.properties
<?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> <!-- 引入db.properties --> <properties resource="db.properties"></properties> <!-- 环境们的配置 --> <environments default="development"> <!--环境的配置: --> <environment id="development"> <!--使用jdbc方式管理事务 --> <transactionManager type="JDBC" /> <!-- 数据源的四大配置 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 注册对象关系映射文件 --> <mappers> <mapper resource="com/gs/domain/UserMapper.xml"/> </mappers> </configuration>
db.properties 文件
jdbc.driverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8 jdbc.username = root jdbc.password = root
2. 创建sqlSession 对象的工具类:MyBatisUtils.java
package com.gs.tools; import java.io.IOException; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtils { private static SqlSessionFactory factory= null; static { try { factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSession(){ return factory.openSession(); } }
3. User.java 三个字段。
public class User { private Long id; private String username; private String password; ......getter setter 无参 有参,toString() }
4. UserMapper 接口
public interface UserMapper { //得到一个用户 User get(Long id); // 得到所有用户 List<User> getAll(); //批量删除用户 void deleteBatch(List<Long> list); //批量插入用户 void insertBatch(List<User> lists); }
5.UserMapper.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的值 是 对应接口的全限定名称 --> <mapper namespace="com.gs.mapper.UserMapper"> <!-- 得到一个用户 --> <select id="get" parameterType="long" resultType="com.gs.domain.User"> select * from user where id = #{?} </select> <!--得到所有用户 --> <select id="getAll" resultType="com.gs.domain.User"> select * from user </select> <!--批量删除用户 --> <delete id="deleteBatch" parameterType="list"> delete from user where id in <foreach collection="list" index="index" open="(" separator="," close=")" item="ids"> #{ids} </foreach> </delete> <!-- 批量插入用户 --> <insert id="insertBatch" parameterType="list"> insert into user(id,username,password) values <foreach collection="list" item="item" index="index" separator=","> (#{item.id},#{item.username},#{item.password}) </foreach> </insert> </mapper>
6.测试类 testMybatis.java
package com.gs.test; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import com.gs.domain.User; import com.gs.mapper.UserMapper; import com.gs.tools.MyBatisUtils; public class testMybatis{ @Test public void getuser(){ SqlSession session = MyBatisUtils.getSession(); //获取UserMapper接口的对象 UserMapper userMapper = session.getMapper(UserMapper.class); //namespace = 接口全限定名称 +.+ 方法名 User user = userMapper.get(1L); System.out.println(user); } @Test public void getAllUser(){ SqlSession session = MyBatisUtils.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.getAll(); System.out.println(users); } @Test public void deleteBatchUser(){ SqlSession session = MyBatisUtils.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<Long> lists = new ArrayList<>(); lists.add(2L); lists.add(3L); userMapper.deleteBatch(lists); session.commit();//提交事务 session.close(); } @Test public void insertBatchUser(){ SqlSession session = MyBatisUtils.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> lists = new ArrayList<>(); lists.add(new User(null,"樊俊杰","456")); lists.add(new User(null,"樊太快了","789")); userMapper.insertBatch(lists); session.commit();//提交事务 session.close(); } }
1. User 和 Dept 实体类
public class User { private Long id; private String name; private String password; private Dept dept; } public class Dept { private Long id; private String name; }
2. DomainMapper.xml
<!-- 单向多对一嵌套结果(发一条左外连接sql解决问题,映射文件Mapper结果的手动封装ResultMap) 使用嵌套结果映射来处理重复的联合(association)结果的子集。 --> <select id="getUser1" resultMap="many2oneMap"> select u.id, u.name, u.password, d.id did, d.name dname from t_user u left join t_dept d on u.dept_id=d.id; </select> <!-- 封装查询的User结果 --> <resultMap type="com.gs.manytoone.User" id="many2oneMap"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="password" property="password"/> <!--user的dept属性是一个对象Dept,使用联合查询关键字来封装 association:联合查询--> <association property="dept" javaType="com.gs.manytoone.Dept"> <id column="did" property="id"/> <result column="dname" property="name"/> </association> </resultMap> <!-- 单向多对一嵌套查询(先查询多方User,使用ResultMap来封装结果,在结果里,再通过User的dept属性,再查一次Dept对象.) --> <select id="getUser2" resultMap="many2oneList"> select id,name,password,dept_id from t_user; </select> <select id="getDeptById" parameterType="long" resultType="com.gs.manytoone.Dept"> select id,name from t_dept where id= #{id} </select> <resultMap type="com.gs.manytoone.User" id="many2oneList"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="password" property="password"/> <association property="dept" column="dept_id" select="com.gs.manytoone.DomainMapper.getDeptById"> </association> </resultMap>
3. 测试类
@Test public void getUser1() { SqlSession session = MyBatisUtils.getSession(); List<User> users = session.selectList("com.gs.manytoone.DomainMapper.getUser1"); for (User user : users) { System.out.println(user); } session.commit(); session.close(); } @Test public void getUser2() { SqlSession session = MyBatisUtils.getSession(); List<User> users = session.selectList("com.gs.manytoone.DomainMapper.getUser2"); for (User user : users) { System.out.println(user); } session.commit(); session.close(); }
4.查询的结果:
User [id=1, name=张三, password=123456, dept=Department [id=1, name=财务部]]
User [id=2, name=李四, password=111, dept=Department [id=1, name=财务部]]
User [id=3, name=五五, password=123, dept=Department [id=2, name=后勤部]]
User [id=4, name=周六, password=122, dept=Department [id=3, name=经理部]]
User [id=5, name=周七, password=12332, dept=Department [id=3, name=经理部]]
员工和部门:
在部门方,需要查询到当前部门下的所有员工。----集合查询
1. User 和 Dept 实体类
public class User { private Long id; private String name; private String password; } public class Dept { private Long id; private String name; private Set<User> users = new HashSet<>(); }
2. DomainMapper.xml
<!-- 单向一对多嵌套结果(一条sql语句) --> <select id="getDept1" resultMap="one2manyMap"> select d.id did, d.name dname, u.id, u.name, u.password from t_dept d left join t_user u on d.id=u.dept_id order by d.id </select> <resultMap type="com.gs.onetomany.Dept" id="one2manyMap"> <id column="did" property="id"/> <result column="dname" property="name"/> <collection property="users" ofType="com.gs.onetomany.User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="password" property="password"/> </collection> </resultMap> <!-- 单向一对多嵌套查询(先查询多个Dept,使用ResultMap来封装结果,在结果里,再通过Dept的users属性,再查一次User对象.) --> <select id="getDept2" resultMap="one2manyList"> select d.id did , d.name dname from t_dept d </select> <select id="getUserById" parameterType="long" resultType="com.gs.onetomany.User"> select id,name,password from t_user where dept_id=#{?} </select> <resultMap type="com.gs.onetomany.Dept" id="one2manyList"> <id column="did" property="id"/> <result column="dname" property="name"/> <collection property="users" column="did" select="com.gs.onetomany.DomainMapper.getUserById"> </collection> </resultMap>
3. 测试类
@Test public void getUser1() { SqlSession session = MyBatisUtils.getSession(); List<Dept> allDept = session.selectList("com.gs.onetomany.DomainMapper.getDept1"); for (Dept dept : allDept) { System.out.println(dept); } session.commit(); session.close(); } @Test public void getUser2() { SqlSession session = MyBatisUtils.getSession(); List<Dept> allDept = session.selectList("com.gs.onetomany.DomainMapper.getDept2"); for (Dept dept : allDept) { System.out.println(dept); } session.commit(); session.close(); }
4.查询的结果:
Dept [id=1, name=财务部, users=[User [id=2, name=李四, password=111], User [id=1, name=张三, password=123456]]]
Dept [id=2, name=后勤部, users=[User [id=3, name=五五, password=123]]]
Dept [id=3, name=经理部, users=[User [id=5, name=周七, password=12332], User [id=4, name=周六, password=122]]]
原文:https://www.cnblogs.com/gshao/p/10473866.html