Java - 框架之 MyBites
一. 开发步骤:
1. 创建 PO (model) 类,根据需求创建。
2. 创建全局配置文件 sqlMapConfig.xml。
3. 编写映射文件。
4. 加载映射文件, 在 SqlMapConfig.xml 中进行加载。
5. 编写测试程序,连接并操纵数据库。
- 读取配置文件。
- 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 会话工厂。
- 通过 SqlSessionFactory 创建 SqlSession
- 通过 SqlSession 的操作数据库方法。
- 关闭 SqlSession。
二. 创建项目
代码获取
1. Dao创建
2. Dao创建并整合到 Spring
4. mapper创建并整合到 Spring
三. 参数信息
parameterType : 指定输入参数䣌 java 类型。
resultType : 指定输出结果的 java 类型。
#{} : 相当于预处理中的占位符 -> ? ,可以接收 HashMap, POJO 类型参数,简单类型时参数可以是 value 或其它。(可防止 sql 注入)
${} : 相当于拼接 SQL 串,对传入的值不做任何解释,原样输出,可接受 HashMap, POJO 类型参数,接收简单类型参数时只能时 value。(有sql注入)
selectOne : 只能查询 0 或 1 条记录,大于一条记录会报错。
selectList : 可以查询 0 或 n 条记录
四. mybatis 的 Dao 编写 【通过 mapper 代理方式实现】
1. 创建 接口类 (UserMapper)
package com.q.mybatis.mapper; import com.q.mybatis.model.User; public interface UserMapper { public int save(User user); public User getUserById(int id); }
2. 创建 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"> <mapper namespace="com.q.mybatis.mapper.UserMapper"> <insert id="save" parameterType="user"> insert into user(username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address}) </insert> <!-- namespace : 接口映射地址 id : 方法名 parameterType : 方法参数类型 (如果是一个类,可直接放上类的路径, 可在 SqlMapConfig.xml 文件中设置别名) resultType : 模型地址 ( 可以在 SqlMapConfig.xml 文件中设置别名 ) --> <select id="getUserById" parameterType="int" resultType="user"> select * from user where id = #{id} </select> </mapper>
3. 加载映射文件
<!-- 加载映射文件 --> <mappers> <mapper resource="com/q/mybatis/mapper/UserMapper.xml"></mapper> </mappers>
4. 编写测试代码
import com.q.mybatis.mapper.UserMapper; import com.q.mybatis.model.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; public class t4 { SqlSession session; @Before public void before() throws IOException { System.out.println("insert Before"); // 1. 读取配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 会话工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); session = sessionFactory.openSession(); } @After public void after(){ session.close(); } @Test public void test1(){ UserMapper userMapper = session.getMapper(UserMapper.class); // 获取数据 System.out.println(userMapper.getUserById(16)); // 添加数据 User user1 = new User("t4_5","1",new Date(), "addr"); userMapper.save(user1); session.commit(); } }
五. resultType / resultMap
1. resultType (表字段必须和类属性对应,如果不对应则返回 Null):
模型地址 ( 可以在 SqlMapConfig.xml 文件中设置别名 )
<select id="getUserById" parameterType="int" resultType="com.q.mybatis.model.User"> select * from user where id = #{id} </select>
2. resultMap: 当类属性字段和数据库字段不对应时,可以使用这个方法查询
<resultMap id="userResultMap" type="user"> <id property="id" column="id_"></id> <result property="username" column="username_"></result> <result property="sex" column="sex_"></result> <result property="birthday" column="birthday_"></result> <result property="address" column="address_"></result> </resultMap> <select id="getUserById" parameterType="int" resultMap="userResultMap"> select id id_, username username_, sex sex_, birthday birthday_ , address address_ from user where id = #{id} </select>
六. if where 使用
1. 配置文件 XML
<select id="findUserList" parameterType="com.q.mybatis.vo.UserQueryVO" resultType="user"> select * from user <where> <if test="user.sex != null and user.sex != ''"> sex = #{user.sex} </if> <if test="user.username != null and user.username != ''"> and username like '%${user.username}%' </if> </where> </select>
2. 测试方法
@Test public void test2(){ UserMapper userMapper = session.getMapper(UserMapper.class); UserQueryVO query = new UserQueryVO(); User user = new User(); user.setSex("1"); query.setUser(user); List<User> users = userMapper.findUserList(query); System.out.println(users); }
七. 一对一
1. XML 配置
<!-- 如果一个表中关联着其它表,就使用 resultMap --> <resultMap id="orderRslMap" type="orders"> <!-- 往 orders 的模型匹配数据 --> <id column="id" property="id"/> <id column="note" property="note"/> <id column="number" property="number"/> <id column="createtime" property="createtime"/> <!-- 往 orders 的关联表 user 匹配数据 --> <!-- 注意: 这里使用 javaType --> <association property="user" javaType="user"> <id column="user_id" property="id" /> <id column="username" property="username" /> <id column="address" property="address" /> </association> </resultMap> <select id="findOrderById" parameterType="int" resultType="orderRslMap"> select a.username, b.* from user a, orders b where a.id = b.id </select>
2. 查询
orderMapper mapper = session.getMapper(OrderMapper.class); Orders order = mapper.findOrderById(3); System.out.println(order); System.out.println(order.getUser());
八. 一对多
<resultMap id="orderRslMap" type="orders"> <!-- 往 orders 的模型匹配数据 --> <id column="id" property="id"/> <id column="note" property="note"/> <id column="number" property="number"/> <id column="createtime" property="createtime"/> <!-- 往 orders 的 orderdetail 匹配数据 一对多 --> <!-- 注意:集合中的类型使用 ofType --> <collection property="orderDetails" ofType="orderDetail"> <id column="detail_id" property="id"/> <id column="item_id" property="itemsId"/> <id column="item_num" property="itemsNum"/> </collection> </resultMap>
九. 多对多 : 上面的 <collection> 中继续嵌套 <collection> ..文档。。。
十. 设置允许懒加载
<settings> <setting name="lazyLoadingEnabled" value="true" /> </settings>
十一. 开启二级缓存
1. SqlMapCOnfig.xml 文件中
<settings> <setting name="cacheEnabled" value="true" /> </settings>
2. UserMapper.xml 文件中
// type 默认不写用的是 mybatis 自带的缓存( perpetualCache )
<cache></cache>
3. 注意:当 session 关闭后,才会提交到 二级缓存 : session.close();
当执行 update, delete, save 等操作时会清空缓存。