使用Mybaits进行开发时,常见的有这几种开发方式——注释开发,原始dao开发方式及Mapper代理开发模式。
关于注解开发,虽然挺常见的,但是使用注解开发有非常致命的缺点——开发后会导致维护升级变得相对困难且为了实现一对一的映射与一对多的映射还是会用到XML文件,那为什么不直接用xml开发,还把接口写的乱七八糟的,而且使用xml比用注释更加容易实现条件不定的查询,最后就是使用xml的话不觉得更加容易管理么,所以个人不对注解开发做过多讲解,不过如果你对注释开发感兴趣的话,点这里。
原始dao开发方式和mapper代理开发模式个人感觉很像,但是代码上却更加的臃肿繁杂,也懒地做过多讲解,所以我还是直接讲Mapper代理开发模式。
使用Mapper代理开发模式,需要遵循以下的开发规范(看起来很烦,用起来就超级简单):
1、mapper接口的全限定名要和mapper映射文件的namespace的值相同。
2、mapper接口的方法名称要和mapper映射文件中的statement的id相同
3、mapper接口的方法参数只能有一个,且类型要和mapper映射文件中的statement的parameterType的值保持一致。
4、mapper接口的返回值类型要和mapper映射文件中的statement的resultType值或resultMap中的type值一致。
编程步骤如下:
1、根据需求创建pojo类
2、编写全局配置文件
3、根据需求编写映射文件
4、加载映射文件
5、编写mapper接口
6、编写测试代码
以一个对用户信息的增删查改操作具体的例子说明:
1、POJO类代码如下(get、set方法和toString不再写出,自己加上):
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String username;
private Date birthday;
private char sex;
private String address;
public User() {
// TODO Auto-generated constructor stub
}
/**
* @param username
* @param birthday
* @param sex
* @param address
*/
public User(String username, Date birthday, char sex, String address) {
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
2、创建全局配置文件SQLMapConfig.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>
<!-- <properties resource=""></properties>
-->
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true" />
<!--是否开启积极懒加载,false 按需加载 ,默认是true-->
<setting name="aggressiveLazyLoading" value="false" />
<!--开启二级缓存 总开关-->
<setting name="cacheEnabled" value="true" />
</settings>
<typeAliases>
<!-- <typeAlias type="net.seehope.mybatis.pojo.User" alias="user" /> -->
<!--批量别名 首字母大小写都行-->
<package name="net.seehope.mybatis.pojo" />
</typeAliases>
<environments default="development">
<environment id="development">
<!--配置JDBC事务控制,由mybatis 管理-->
<transactionManager type="JDBC"></transactionManager>
<!--默认使用dbcp连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
<!-- <environment id="development1">
配置JDBC事务控制,由mybatis 管理
<transactionManager type="JDBC"></transactionManager>
默认使用dbcp连接池
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring_jdbc" />
<property name="username" value="root" />
<property name="password" value="qhxj,YRAN941211" />
</dataSource>
</environment>
-->
</environments>
</configuration>
3、编写mapper映射文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:此时用mapper代理方式,它的值必须等于对应mapper接口的全限定名 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!-- 根据用户ID,查询用户信息 -->
<!--
[id]:statement的id,要求在命名空间内唯一
[parameterType]:入参的java类型,可是是简单类型、POJO、HashMap
[resultType]:查询出的单条结果集对应的java类型
[#{}]:表示一个占位符?
[#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id = #{id}
</select>
<!-- 根据用户名称模糊查询用户信息列表 -->
<!--
[${}]:表示拼接SQL字符串,即不加解释的原样输出
[${value}]:表示要拼接的是简单类型参数。
注意:
1、如果参数为简单类型时,${}里面的参数名称必须为value
2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
-->
<select id="findUsersByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- 添加用户之自增主键返回(selectKey方式) -->
<!--
[selectKey标签]:通过select查询来生成主键
[keyProperty]:指定存放生成主键的属性
[resultType]:生成主键所对应的Java类型
[order]:指定该查询主键SQL语句的执行顺序,相对于insert语句,此时选用AFTER
[last_insert_id]:MySQL的函数,要配合insert语句一起使用
-->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
</insert>
</mapper>
4、加载映射文件
在全局配置文件内添加以下内容:
<!-- 加载mapper -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
5、编写mapper接口
public interface UserMapper {
//根据用户ID来查询用户信息
public User findUserById(int id);
//根据用户名称来模糊查询用户信息列表
public List<User> findUsersByName(String username);
//添加用户
public void insertUser(User user);
}
6、编写测试代码:
public class UserMapperTest {
// 声明全局的SqlSessionFactory
private SqlSessionFactory sqlSessionFactory;
@Before
publicvoid setUp() throws Exception {
// 1、读取配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2、根据配置文件创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
publicvoid testFindUserById() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper对象的方法
User user = userMapper.findUserById(1);
System.out.println(user);
// 关闭SqlSession
sqlSession.close();
}
@Test
publicvoid testFindUsersByName() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper对象的方法
List<User> list = userMapper.findUsersByName("小明");
System.out.println(list);
// 关闭SqlSession
sqlSession.close();
}
@Test
publicvoidtestInsertUser() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//构造User对象
User user = new User();
user.setUsername("东哥4");
user.setAddress("清河宝盛西里4");
// 调用mapper对象的方法
userMapper.insertUser(user);
System.out.println(user.getId());
//执行SqlSession的commit操作
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}
}
以上就是mybait使用Mapper代理开发模式,需要注意的是mapper映射文件的书写方式,在这里推荐一个eclipse的插件,可以直接选择生成mybaits的mapper映射文件,选定namespace后,statement的id就可以通过"Alt"+"\"快捷键联想出来,不仅如果很多属性的选择都可以直接联系出来,十分便捷。
安装步骤点这里