在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
链接:https://pan.baidu.com/s/1zkidEEFcbcdMCxdAAqjaFQ?pwd=ltyk
提取码:ltyk基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 请务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍!!!
前提准备
1.创建一个java项目,并导入依赖的jar包。
2.将配置文件中的数据库信息修改为外部引用的形式,在src目录下创建一个db.properties文件,并编辑代码。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/db_mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
3.创建一个MyBatis配置文件mybatis-config.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="db.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/UserMapper.xml" />
</mappers>
</configuration>
4.创建一个包命名为pojo,在pojo包下创建一个类命名为User。
package pojo;
public class User {
private Integer id;
private String username;
private String jobs;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String toString() {
return "User [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
}
}
5.创建一个包命名为util,在util包下创建一个类命名为MyBatisUtil。
package util;
import java.io.IOException;
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;
public class MyBatisUtil {
private static SqlSessionFactory sessionFactory=null;
static {
try {
String resourse="mybatis-config.xml";
InputStream inputStream=Resources.getResourceAsStream(resourse);
sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO: handle exception
}
}
public static SqlSession getSession() {
return sessionFactory.openSession();
}
}
6.创建一个映射文件命名为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="mybatis.UserMapper">
</mapper>
7.创建一个包命名为test,用来存放测试类。
具体用法
<if>元素
在 My Batis中,<if>元素是最常用的判断语句,主要用于实现某些简单的条件选择。在实际应用中,我们可能会通过多个条件来精确地查询某个数据。
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!--1. <if>元素使用 -->
<select id="findUserByNameAndJobs" parameterType="pojo.User" resultType="pojo.User">
select * from t_user where 1=1
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null">
and jobs=#{jobs}
</if>
</select>
<select>标签内的id属性是方法调用的唯一标识,在我们java代码中需要此id定位。parameterType是传入参数的的类型,resultType是返回结果集的类型。
<if>标签里的test内容就是判断条件
<if test="jobs != null">and jobs=#{jobs}</if> 用java写相当于 if(jobs!=null) and job=#{jobs}
2.在test包下创建一个类命名为test_if进行测试
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_if {
public static void main(String[] args) throws Exception{
SqlSession session=MyBatisUtil.getSession();
User user=new User();
//注释掉下面两行代码,则查找全部的User
user.setUsername("zyy");
user.setJobs("teacher");
//查找username=zyy并且jobs=teacher的User
List<User> list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user);
for(User u:list) {
System.out.println(u);
}
}
}
查找username=zyy并且jobs=teacher的User
List<User> list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user);
findUserByNameAndJobs就是前面说明的id
<choose>.<when>和<otherwise>元素
在使用<if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。< choose>、<when>、< otherwise>元素类似于Java语言中使用 switch...case…default语句。
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!--2. <choose>,(<when>,<otherwise>元素使用 -->
<select id="findUserByNameOrJobs" parameterType="pojo.User" resultType="pojo.User">
select * from t_user where 1=1
<choose>
<when test="username != null and username!='' ">
and username like concat('%',#{username},'%')
</when>
<when test="jobs != null and jobs !='' ">
and jobs =#{jobs}
</when>
<otherwise>
and phone is not null
</otherwise>
</choose>
</select>
concat()函数就是把里面的参数连接起来,例如concat('%',#{username},'%')结果为:
%#{username}%
2.在test包下创建一个类命名为test_choose进行测试
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_choose {
public static void main(String[] args) throws Exception{
SqlSession session=MyBatisUtil.getSession();
User user=new User();
user.setUsername("zyy");
user.setJobs("student");
List<User> list=session.selectList("mybatis.UserMapper.findUserByNameOrJobs",user);
for(User u:list) {
System.out.println(u);
}
}
}
查找username=zyy或者jobs=teacher的user
<where>.<trim>元素
在前两个小节的案例中,映射文件中编写的SQL后面都加入了“where1=1”的条件,是为了保证当条件不成立时,拼接起来的SQL语句在执行时不会报错,即使得SQL不出现语法错误。那么在 MyBatis中,有没有什么办法不用加入“1=1”这样的条件,也能使拼接后的SQL成立呢?针对这种情况, MyBatis提供了< where>元素来处理这样的
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!--3. <if>.<where>元素使用 -->
<select id="findUserByNameAndJobs2" resultType="pojo.User" parameterType="pojo.User">
select * from t_user
<where>
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null and jobs !=''">
and jobs =#{jobs}
</if>
</where>
</select>
<!-- <if><trim>元素使用 -->
<select id="findUserByNameAndJobs3" resultType="pojo.User" parameterType="pojo.User">
select * from t_user
<trim prefix="where" prefixOverrides="and">
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="jobs != null and jobs !=''">
and jobs =#{jobs}
</if>
</trim>
</select>
使用<where>元素对"where 1=1"条件进行了替换,<where>元素会自动判断组合条件下拼装的SQL语句,只有<where>元素内的条件成立时,才会拼装SQL中加入where关键字,否则将不会添加。同样使用<trim>元素也对"where 1=1"条件进行了替换,<trim>元素去除一些特殊字符,它的prefix属性代表的是语句的前缀,而prefixOverride属性代表的是需要去除的那些特殊字符串,写法是和<where>等效的。
2.在test包下创建一个类命名为test_where_trim进行测试
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_where_trim {
public static void main(String[] args) throws Exception{
SqlSession sqlSession=MyBatisUtil.getSession();
User user =new User();
user.setUsername("zyy");
user.setJobs("teacher");
List<User> list1=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs2",user);
for(User u:list1) {
System.out.println(u);
}
List<User> list2=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs3",user);
for(User u:list2) {
System.out.println(u);
}
}
}
<set>元素
在Hibenate中,如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中存在只要更新某一个或几个字段。为了解决让程序只更新需要更新的字段,MyBatis中提供了<set>元素来完成这一工作。<set>元素主要用于更新操作,其主要作用是在动态包含的SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。
注意:在映射文件中使用<set>和<if>元素组合进行update语句动态SQL组装时,如果<set>元素内包含的内容都为空,则会出现SQL语法错误。所以在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空。
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!-- 4.<set>元素使用 -->
<update id="updateUser" parameterType="pojo.User">
update t_user
<set>
<if test="username !=null and username !=''">
username=#{username},
</if>
<if test="jobs !=null and jobs !=''">
jobs=#{jobs},
</if>
<if test="phone !=null and phone !=''">
phone=#{phone},
</if>
</set>
where id=#{id}
</update>
2.在test包下创建一个类命名为test_set进行测试
package test;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_set {
public static void main(String[] args) throws Exception{
SqlSession sqlSession =MyBatisUtil.getSession();
User user=new User();
user.setId(6);
user.setJobs("teacher");
user.setPhone("1233213214");
user.setUsername("daming");
int row=sqlSession.update("mybatis.UserMapper.updateUser",user);
if (row>0) {
System.out.println("更新成功");
}else {
System.out.println("更新失败");
}
}
}
<foreach>元素
MyBatis中已经提供了一种用于数组和集合循环遍历的方式,那就是使用< foreach>元素。假设在一个用户表中有1000条数据,现在需要将id值小于100的用户信息全部查询出来就可以通过< foreach>元素来解决。
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!--5.<foreach>元素使用 -->
<select id="findUserById" parameterType="List" resultType="pojo.User">
select * from t_user where id in
<foreach collection="list" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</select>
collection属性:配置的list是传递过来的参数类型。
item属性:配置的是循环中的当前的元素。
index属性:配置的是当前元素在集合中的位置下标。
open和close属性:配置的是以什么符号将这些集合元素包装起来。
separator属性:配置的是各个元素的间隔符。
2.在test包下创建一个类命名为test_foreach进行测试
package test;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_foreach {
public static void main(String[] args) throws Exception{
SqlSession sqlSession =MyBatisUtil.getSession();
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
List<User> users=sqlSession.selectList("mybatis.UserMapper.findUserById",list);
for(User user:users) {
System.out.println(user);
}
}
}
<bind>元素
MyBatis提供了<bind>元素来解决映射文件中的SQL就要根据不同的情况提供不同形式的实现这一问题,只要使用 My Batis的语言即可与所需参数连接。
1.编辑UserMapper.xml,在<mapper>标签内添加以下代码:
<!-- 6.<bind>元素的使用:根据用户姓名模糊查询用户信息 -->
<select id="findUserByName2" parameterType="pojo.User" resultType="pojo.User">
<bind name="p_username" value="'%'+_parameter.getUsername()+'%'"/>
select * from t_user where username like #{p_username}
</select>
说白了就是用<bind>元素来替代concat()函数
2.在test包下创建一个类命名为test_bind进行测试
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import pojo.User;
import util.MyBatisUtil;
public class test_bind {
public static void main(String[] args) throws Exception{
SqlSession sqlSession=MyBatisUtil.getSession();
User user=new User();
user.setUsername("t");
List<User> list=sqlSession.selectList("mybatis.UserMapper.findUserByName2",user);
for(User u :list) {
System.out.println(u);
}
}
}