mybatis学习(一)不使用 XML 构建 SqlSessionFactory
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
配置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> <!-- 别名 1.类型别名 typeAlias type属性值为全类名 alias为别名 2.根据包 name属性值为包名 别名为包内类名的小写 --> <typeAliases> <!-- <typeAlias type="com.tzh.bean.Clazz" alias="clazz"/> <typeAlias type="com.tzh.bean.Student" alias="student"/> --> <package name="com.tzh.bean"/> </typeAliases> <environments default="default"> <environment id="default"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///1606a" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/tzh/mapper/*.xml" /> </mappers> </configuration>
创建beanSession工厂
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。package com.tzh.test; 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 SqlSessionUtils { public static SqlSession getSqlSession() { SqlSession sqlSession = null; try { InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); sqlSession = sqlSessionFactory.openSession(); } catch (Exception e) { e.printStackTrace(); } return sqlSession; }
创建mapper接口
package com.tzh.mapper; import java.util.List; import com.tzh.bean.Student; public interface StuMapperDao { List<Student> getStuList(Student student); List<Student> getStuListChoose(Student student); int updateStu(Student student); int addStu(List<Student> stuList ); int delStu(int [] arr); }
sql语句
<?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"> <!-- namespace 对应的是接口的全名 --> <mapper namespace="namespace"> <!-- student为别名 在核心配置文件设置 --> <select id="getStuList" resultType="student" parameterType="student"> select * from 0802_stu <!-- where 1 = 1 --> <!-- 如果内部的判断条件成立,会自动加上where关键字,并且会把多余的and或者or去掉 --> <where> <if test="sname !=null and sname!='' "> and sname like concat('%',#{sname},'%') </if> <if test="sex!=null and sex!=''"> and sex =#{sex} </if> <if test="age >0 "> and age < #{age} </if> </where> </select> <select id="getStuListChoose" resultType="student" parameterType="student"> select * from 0802_stu <!-- where 1 = 1 --> <!-- 如果内部的判断条件成立,会自动加上where关键字,并且会把多余的and或者or去掉 --> <!-- <where> --> <trim prefix="where" prefixOverrides="and |or "> <!-- 条件成立在前面加上WHER关键词 并 prefixOverrides前缀覆盖 条件成立去挑前缀add|or--> <!-- choose when otherwise 用法和switch case break 类似 只运行一个条件都符合时运行第一个 --> <choose> <when test="sname !=null and sname!='' "> and sname like concat('%',#{sname},'%') </when> <when test="sex!=null and sex!=''"> and sex =#{sex} </when> <otherwise><!-- 其他相当于else --> and age < #{age} </otherwise> </choose> </trim> <!-- </where> --> </select> <update id="updateStu" parameterType="student"> update 0802_stu <!-- SET 在内部的条件成立,就会加上set关键字,并且会把多余的逗号去掉 --> <!-- <set> --> <trim prefix="set" suffixOverrides=","> <!-- suffixOverrides 去掉多余的 , --> <if test="sname != null and sname !=''"> sname = #{sname}, </if> <if test="sex !=null and sex != ''"> sex = #{sex}, </if> <if test="age>0"> age = #{age} </if> </trim> <!-- </set> --> where sid= #{sid} </update> <insert id="addStu" parameterType="list"> INSERT into 0802_stu (sname,sex,age,cid) VALUES <!-- 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。 当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。 List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。 --> <foreach collection="list" item="stu" separator=","> (#{stu.sname},#{stu.sex},#{stu.age},#{stu.cid}) </foreach> <!-- ('隆多','男',20,2), ('隆多','男',20,2), ('隆多','男',20,2), ('隆多','男',20,2), ('隆多','男',20,2), ('隆多','男',20,2) --> </insert> <delete id="delStu" parameterType="java.lang.reflect.Array"> DELETE FROM 0802_stu WHERE sid in <foreach collection="array" item="sid" open="(" separator="," close=")" > #{sid} </foreach> </delete> </mapper>
测试
package com.tzh.test; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import com.tzh.bean.Student; import com.tzh.mapper.StuMapperDao; public class TestDemo { @Test public void testListLike() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); StuMapperDao mapper = sqlSession.getMapper(StuMapperDao.class); Student student = new Student(); student.setSname("k"); student.setSex("男"); student.setAge(34); //List<Student> stuList = mapper.getStuList(student); List<Student> stuList = mapper.getStuListChoose(student); for (Student student2 : stuList) { System.out.println(student2); } } @Test public void testUpdate() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); StuMapperDao mapper = sqlSession.getMapper(StuMapperDao.class); Student student = new Student(); student.setSname("k"); student.setSex("男"); //student.setAge(34); student.setSid(1); int updateStu = mapper.updateStu(student); sqlSession.commit(); } @Test public void testAdd() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); StuMapperDao mapper = sqlSession.getMapper(StuMapperDao.class); Student student = new Student(); student.setSname("k"); student.setSex("男"); student.setAge(34); student.setCid(1); Student student1 = new Student(); student1.setSname("k"); student1.setSex("男"); student1.setAge(34); student1.setCid(1); Student student2 = new Student(); student2.setSname("k"); student2.setSex("男"); student2.setAge(34); student2.setCid(1); List<Student> stuList = new ArrayList<Student>(); stuList.add(student); stuList.add(student1); stuList.add(student2); int addStu = mapper.addStu(stuList); sqlSession.commit(); } @Test public void testDel() { SqlSession sqlSession = SqlSessionUtils.getSqlSession(); StuMapperDao mapper = sqlSession.getMapper(StuMapperDao.class); int [] arr = {1,2,3,4,5}; int delStu = mapper.delStu(arr); sqlSession.commit(); } }
作 者:一支会记忆的笔
---------------------
个性 签名:真正的学习不是记住知识,而是学会如何提出问题,研究问题,解决问题。
如果觉得这篇文章对你有小小的帮助的话,记得在下方“关注”哦,博主在此感谢!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!