基础
首先这次学习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() {
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
<?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>
<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 mapper
PUBLIC "-//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 {
@Test
public 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;
}
@Override
public 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 configuration
PUBLIC "-//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 mapper
PUBLIC "-//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;
@Test
public 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);
}
@Test
public void getByIdsStudent(){
StudentMapper studentMapper = DataUtil.getStudentMapper();
List<Student> byIds = studentMapper.getByIds(1, 2, 3);
System.out.println(byIds);
}
@Test
public void getByNameStu(){
StudentMapper studentMapper = DataUtil.getStudentMapper();
List<Student> a = studentMapper.getByName("a");
System.out.println(a);
}
@Test
public void getMapperAll(){
StudentMapper sqlSession = DataUtil.getStudentMapper();
List<Student> all = sqlSession.getAll();
System.out.print(all.toString());
}
/**
* mybatis代理模式
*/
@Test
public void getMapperMybatis(){
StudentMapper sqlSession = DataUtil.getStudentMapper();
Student student = sqlSession.get(1);
System.out.print(student);
}
@Test
public 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开发
*/
@Test
public 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);
}
}