在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
链接: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.
- 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。
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="mybatis.UserMapper">
- mapper>
7.创建一个包命名为test,用来存放测试类。
在 My Batis中,
1.编辑UserMapper.xml,在
- <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>
标签里的test内容就是判断条件
and jobs=#{jobs} 用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
list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user); - for(User u:list) {
- System.out.println(u);
- }
- }
- }
查找username=zyy并且jobs=teacher的User
List
list=session.selectList("mybatis.UserMapper.findUserByNameAndJobs",user); findUserByNameAndJobs就是前面说明的id
在使用
1.编辑UserMapper.xml,在
- <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
list=session.selectList("mybatis.UserMapper.findUserByNameOrJobs",user); - for(User u:list) {
- System.out.println(u);
- }
- }
- }
查找username=zyy或者jobs=teacher的user
在前两个小节的案例中,映射文件中编写的SQL后面都加入了“where1=1”的条件,是为了保证当条件不成立时,拼接起来的SQL语句在执行时不会报错,即使得SQL不出现语法错误。那么在 MyBatis中,有没有什么办法不用加入“1=1”这样的条件,也能使拼接后的SQL成立呢?针对这种情况, MyBatis提供了< where>元素来处理这样的
1.编辑UserMapper.xml,在
- <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>
- <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 1=1"条件进行了替换, 元素会自动判断组合条件下拼装的SQL语句,只有 元素内的条件成立时,才会拼装SQL中加入where关键字,否则将不会添加。同样使用 元素也对"where 1=1"条件进行了替换, 元素去除一些特殊字符,它的prefix属性代表的是语句的前缀,而prefixOverride属性代表的是需要去除的那些特殊字符串,写法是和 等效的。
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
list1=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs2",user); - for(User u:list1) {
- System.out.println(u);
- }
- List
list2=sqlSession.selectList("mybatis.UserMapper.findUserByNameAndJobs3",user); - for(User u:list2) {
- System.out.println(u);
- }
- }
- }
在Hibenate中,如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中存在只要更新某一个或几个字段。为了解决让程序只更新需要更新的字段,MyBatis中提供了
注意:在映射文件中使用
和 元素组合进行update语句动态SQL组装时,如果 元素内包含的内容都为空,则会出现SQL语法错误。所以在使用 元素进行字段信息更新时,要确保传入的更新字段不能都为空。
1.编辑UserMapper.xml,在
- <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("更新失败");
- }
- }
- }
MyBatis中已经提供了一种用于数组和集合循环遍历的方式,那就是使用< foreach>元素。假设在一个用户表中有1000条数据,现在需要将id值小于100的用户信息全部查询出来就可以通过< foreach>元素来解决。
1.编辑UserMapper.xml,在
- <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
list=new ArrayList(); - list.add(1);
- list.add(2);
- List
users=sqlSession.selectList("mybatis.UserMapper.findUserById",list); - for(User user:users) {
- System.out.println(user);
- }
- }
- }
MyBatis提供了
1.编辑UserMapper.xml,在
- <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>
说白了就是用
元素来替代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
list=sqlSession.selectList("mybatis.UserMapper.findUserByName2",user); - for(User u :list) {
- System.out.println(u);
- }
- }
- }