基础
首先这次学习mybatis,得先下载idea软件。maven在idea上好操作点,破解方案自行百度。这里暂不详细介绍。
这是最初的练习,可能注释有问题,但是后面的代码就纠正过来了。
为了更好的xml分离,就创建了一个文件夹,然后转成编译包,在再下面创建相同的mapper包。
下面是代码
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency></dependencies>
数据库DAO层
package org.lisonglin.entity;public class Student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><!-- 对数据库与属性不一致,自动转换 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/stus?createDatabaseIfNotExist=true&useSSL=false"/><property name="username" value="root"/><property name="password" value="123"/></dataSource></environment></environments><mappers><!-- 调用dao层 --><mapper resource="org/lisonglin/mapper/StudentMapper.xml"/></mappers></configuration>
package org.lisonglin.mapper;import org.apache.ibatis.annotations.Param;import org.lisonglin.entity.Student;public interface StudentMapper {Student get(int id);void insert(Student stu);void insertInfo(@Param("name") String name, @Param("age") int age);}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.lisonglin.mapper.StudentMapper"><select id="get" resultType="org.lisonglin.entity.Student">select * from student where id=#{id}</select><insert id="insert">insert into student values(null,#{name},#{age})</insert><insert id="insertInfo">insert into student values(null,#{name},#{age})</insert></mapper>
测试
package org.lisonglin.test;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import org.lisonglin.entity.Student;import org.lisonglin.mapper.StudentMapper;import java.io.IOException;import java.io.InputStream;public class TestMyBatis {@Testpublic void test(){InputStream is=null;try {//获取src下全局配置文件的输入流is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactory对象SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = factory.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);// Student student = mapper.get(1);// System.out.print(student);// Student s=new Student();// s.setName("bb");// s.setAge(12);// mapper.insert(s);mapper.insertInfo("cc",13);//手动提交sqlSession.commit();} catch (IOException e) {e.printStackTrace();}}}
进阶
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency></dependencies>
package org.lisonglin.entity;public class Student {private int id;private String sName;private int age;public final static String MYBATIS_CONFIG_FILE="mybatis-config2.xml";public int getId() {return id;}public void setId(int id) {this.id = id;}public String getsName() {return sName;}public void setsName(String sName) {this.sName = sName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", sName='" + sName + '\'' +", age=" + age +'}';}public Student(int id, String sName, int age) {this.id = id;this.sName = sName;this.age = age;}public Student() {}}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 读取配置文件信息 --><properties resource="jdbc.properties"></properties><settings><!--把数据中的下划线改为驼峰命名法--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!-- 别名 --><!--<typeAlias type="org.lisonglin.entity.Student" alias="Student"></typeAlias>--><!-- 直接导包 --><package name="org.lisonglin.entity"></package></typeAliases><!-- 配置坏境变量,可以配置多个,默认值与id一致 --><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><!--事务--><dataSource type="POOLED"><!-- 数据源 连接池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><!--基于XML配置文件--><!--<mapper resource="org/lisonglin/mapper/StudentMapper.xml"/>--><package name="org.lisonglin.mapper"></package></mappers></configuration>
package org.lisonglin.mapper;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.lisonglin.entity.Student;import java.util.List;public interface StudentMapper {/*** XML配置方式* @param id* @return*/Student get(int id);void insert(Student stu);void insertInfo(@Param("name") String name, @Param("age") int age);List<Student> getAll();int insertStudentCacheId(Student stu);List<Student> getByName(@Param("key") String key);List<Student> getByIds(@Param("ids") int ... ids);List<Student> getStudents(Student stu);/*** 注解方式(代码耦合性不高,不推荐)* @param stu* @return*/@Select("insert into stu(id,s_name,age) values(null,#{name},#{age})")public int add(Student stu);}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.lisonglin.mapper.StudentMapper"><!-- 通用sql --><sql id="selectInfo">select * from stu</sql><select id="getById" resultType="Student" parameterType="int"><!-- 引入通用sql --><include refid="selectInfo"></include>where id=#{id}</select><select id="getStudents" resultType="Student"><include refid="selectInfo"></include><!-- 条件查询,如果没有符合条件,那么sql中的and会自动去掉 --><where><!-- 判断中属性是bean中的命名 --><if test="sName != null">and s_name = #{sName}</if><if test="age!=0">and age = #{age}</if></where></select><select id="getByIds" resultType="Student"><include refid="selectInfo"></include><where><!--<foreach collection="ids" open="id in (" close=")" separator="," item="id">--><!--id=#{id}--><!--</foreach>--><foreach collection="ids" item="id" separator="or">id=#{id}</foreach></where></select><select id="get" resultType="Student" parameterType="int">select * from stu where id=#{id}</select><insert id="insert">insert into stu values(null,#{name},#{age})</insert><insert id="insertInfo">insert into stu values(null,#{name},#{age})</insert><select id="getAll" resultType="Student">select * from stu</select><!-- 查询出增加的主键(方法一) --><insert id="insertStudentCacheId" keyColumn="id" keyProperty="id" useGeneratedKeys="true">insert into stu values(null,#{sName},#{age})</insert><!-- 方法二 --><insert id="insertStudentId"><selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int"><!-- 查询自增id (方法一) -->select last_insert_id()<!--方法二--><!--select @@identity--></selectKey>insert into stu values(null,#{sName},#{age})</insert><select id="getByName" resultType="Student"><!-- ${} 拼接sql #{} 占位符 --><!-- 推荐使用这种 --><!-- select * from stu where s_name like '%' #{key} '%' --><bind name="new_key" value="'%'+key+'%'"></bind><include refid="selectInfo"></include>where s_name like #{new_key}<!-- select * from stu where s_name like concat('%',#{key},'%') --><!-- 这种不建议使用,这种使用statement查询方式,有sql注入风险 --><!-- select * from stu where s_name like '%${key}%' --></select></mapper>
package org.lisonglin.servlet;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.lisonglin.entity.Student;import org.lisonglin.mapper.StudentMapper;import java.io.IOException;import java.io.InputStream;public class DataUtil {private static SqlSessionFactory sqlSessionFactory;public static StudentMapper getStudentMapper(){InputStream is=null;try {is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = build.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);return mapper;} catch (IOException e) {e.printStackTrace();}return null;}public static SqlSessionFactory getSqlSessionFactory(){InputStream is=DataUtil.class.getClassLoader().getResourceAsStream(Student.MYBATIS_CONFIG_FILE);return new SqlSessionFactoryBuilder().build(is);}/*** @param autoCommit* true:表示创建的SqlSession对象在执行完SQL之后自动提交事务* false:表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用SqlSession.commit()提交事务* @return*/public static SqlSession getSqlSession(boolean autoCommit){return getSqlSessionFactory().openSession(autoCommit);}public static SqlSession getSqlSession(){return getSqlSessionFactory().openSession();}}
package org.lisonglin.test;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import org.lisonglin.dao.StudentImpl;import org.lisonglin.entity.Student;import org.lisonglin.mapper.StudentMapper;import org.lisonglin.servlet.DataUtil;import java.io.IOException;import java.io.Reader;import java.util.List;public class MyTest {private SqlSessionFactory sqlSessionFactory;@Testpublic void getStudentByAgeOrNames(){StudentMapper studentMapper = DataUtil.getStudentMapper();Student student=new Student();student.setAge(20);System.out.println(student.toString());List<Student> studentByAgeOrName = studentMapper.getStudents(student);System.out.println(studentByAgeOrName);}@Testpublic void getByIdsStudent(){StudentMapper studentMapper = DataUtil.getStudentMapper();List<Student> byIds = studentMapper.getByIds(1, 2, 3);System.out.println(byIds);}@Testpublic void getByNameStu(){StudentMapper studentMapper = DataUtil.getStudentMapper();List<Student> a = studentMapper.getByName("a");System.out.println(a);}@Testpublic void getMapperAll(){StudentMapper sqlSession = DataUtil.getStudentMapper();List<Student> all = sqlSession.getAll();System.out.print(all.toString());}/*** mybatis代理模式*/@Testpublic void getMapperMybatis(){StudentMapper sqlSession = DataUtil.getStudentMapper();Student student = sqlSession.get(1);System.out.print(student);}@Testpublic void insertGetId(){StudentMapper studentMapper = DataUtil.getStudentMapper();Student stu=new Student();stu.setAge(12);stu.setsName("aaa");int i = studentMapper.insertStudentCacheId(stu);System.out.println(i);System.out.println(stu.getId());}/*** 原生Dao开发*/@Testpublic void getDaoMyBatis(){String resource = "mybatis-config.xml";Reader reader = null;try {reader = Resources.getResourceAsReader(resource);} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);StudentMapper studentMapper=new StudentImpl(sqlSessionFactory);Student student = studentMapper.get(2);System.out.print(student);}}

