MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发送变化。
动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>
<if>是判断条件的,
语法<if test=”判断java对象的属性值”> 语法 </if>
接口
List<User> selectStudentIf(User user);
Mapper文件
<!--if
<if test="使用参数java对象的属性值作为判断条件,语法规则 属性=xx">
-->
<select id="selectStudentIf" resultType="org.example.daomain.User">
SELECT * FROM TEST1
WHERE
<if test="p_name !=null and p_name!=''">
p_name =#{p_name}
</if>
<if test="address !='SS'">
and address = #{address}
</if>
</select>
测试类
@Test
public void testSelectStudents(){
/**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)
* getMapper能够获得dao接口的实现类对象
**/
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user =new User();
user.setP_name("小红");
user.setAddress("北京");
//调用dao的方法,执行数据库的操作
List<User> users =dao.selectStudentIf(user);
users.forEach(u-> System.out.println("用户:"+u));
}执行顺序,从上往下
小问题
当第一个if不成立,第二if成立时,会造成语法错误
小技巧

解决小技巧:

<where>用来包含 多个<if>的,当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉if中多余的and ,or等。
接口
//where
List<User> selectStudentWhere(User user);
Mapper
<select id="selectStudentWhere" resultType="org.example.daomain.User">
SELECT * FROM TEST1
<where>
<if test="p_name !=null and p_name!=''">
p_name =#{p_name}
</if>
<if test="address !='SS'">
and address = #{address}
</if>
</where>
</select>
测试类
//where
@Test
public void selectStudentWhere(){
/**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)
* getMapper能够获得dao接口的实现类对象
**/
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user =new User();
user.setP_name("小红");
user.setAddress("北京");
//调用dao的方法,执行数据库的操作
List<User> users =dao.selectStudentWhere(user);
users.forEach(u-> System.out.println("用户:"+u));
}
<foreach>循环java中的数组,list集合的。主要用在sql的in语句中。
学生id是 1 2 3的三个学生
SELECT * FROM TEST1 WHERE p_id in (1,2,3)
<foreach collection="" item="" open="" close="" separator=""></foreach>
Collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
Item:自定义的,表示数组和集合成员的变量
Open:循环开始时的字符
Close:循环结束时的字符
Separator:集合成员之间的分隔符
接口
//foreach用法1
List<User> selectFor(List<Integer> idlist);
Mapper
<select id="selectFor" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id IN
<foreach collection="list" item="p_id" open="(" close=")" separator=",">
#{p_id}
</foreach>
</select>
测试类
@Test
public void selectFor(){
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<Integer> list =new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<User> users =dao.selectFor(list);
users.forEach(u -> System.out.println(u));
}接口
//foreach用法2 使用User对象
List<User> selectForTwo(List<User> userlist);
Mapper
<!--//foreach用法2使用对象-->
<select id="selectForTwo" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id IN
<foreach collection="list" item="User" open="(" close=")" separator=",">
#{User.p_id}
</foreach>
</select>
测试类
@Test
public void selectForTwo(){
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<User> userslist =new ArrayList<>();
User u1 =new User();
u1.setP_id(1);
User u2 =new User();
u2.setP_id(2);
userslist.add(u1);
userslist.add(u2);
List<User> users = dao.selectForTwo(userslist);
users.forEach(u-> System.out.println(u));
}

Sql代码片段,就是多次复用的sql语法
步骤
定义:<sql id=”自定义名称唯一”>sql语句</sql>
使用:<include refid=”id的值”/>
案例
<sql id="SELCETSQL">
SELECT * FROM TEST1 WHERE p_id IN
</sql>
<select id="selectForTwo" resultType="org.example.daomain.User">
<include refid="SELCETSQL"/>
<foreach collection="list" item="User" open="(" close=")" separator=",">
#{User.p_id}
</foreach>
</select>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。