沿用上文Spring中的小项目
一 配置文件和连接数据库
添加依赖 mysql 和 mybatis
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
核心配置类:resource中新建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>
<typeAliases>
<package name="org.example.model"/>
</typeAliases>
<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://127.0.0.1:3306/test1"/>
<property name="username" value="root"/>
<property name="password" value="666666"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/EmployeeMapper.xml"/>
</mappers>
</configuration>
新增一个model文件夹,映射的主体类;准备好数据库表;
按数据库需求写出对应属性,并生成构造函数,toString get set方法
public class Employee {
private Integer id;
private String name;
private String gender;
private Date birthday;
//.....................
}
新建dao和一个新的Java类Mapper,类型为interface
package org.example.dao;
import org.example.model.Employee;
public interface EmployeeMapper {
Employee selectEmployeeById(Integer id);
}
在resource下创建Mapper的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="org.example.dao.EmployeeMapper">
<select id="selectEmployeeById" parameterType="int" resultType="org.example.model.Employee">
SELECT *
FROM employee
WHERE id = #{id}
</select>
</mapper>
配置完毕,创建一个MybatisDemo,用来运行
package org.example.demos;
import org.example.dao.EmployeeMapper;
import org.example.model.Employee;
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 java.io.IOException;
import java.io.InputStream;
public class MybatisDemo {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.selectEmployeeById(1);
System.out.println(employee);
}
}
运行成功
二 Mybatis和spring集成
核心就是 通过spring框架接管mybatis框架中核心对象的创建(SqlSessionFactory)。
1.配置
引入依赖(链接池减小性能压力)
<!--mybatisspring&druid-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
beans.xml新增
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test1?allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="666666"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" >
<array>
<value>mybatis/EmployeeMapper.xml</value>
</array>
</property>
</bean>
<bean id="employeeMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="mapperInterface" value="org.example.dao.EmployeeMapper"/>
</bean>
上个部分其实以及写出来了查的操作,下面是增删改查全操作,
Mapp.xml里新增删改查的SQL语句
<insert id="insertEmployee">
INSERT INTO test1.employee
(name, gender, birthday)
VALUES (#{name}, #{gender}, #{birthday});
</insert>
<update id="updateEmployeeById">
UPDATE employee
SET name = #{name}
WHERE id = #{id}
</update>
<delete id="deleteEmployeeById">
DELETE
FROM employee
WHERE id = #{id}
</delete>
Mapper里新增三个增改查方法
package org.example.dao;
import org.example.model.Employee;
public interface EmployeeMapper {
Employee selectEmployeeById(Integer id);
int insertEmployee(Employee employee);
int updateEmployeeById(Employee employee);
int deleteEmployeeById(Employee employee);
}
2.简单增删改
最后app里准备运行,增操作
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
EmployeeMapper employeeMapper = (EmployeeMapper) context.getBean("employeeMapper");
// Employee employee = employeeMapper.selectEmployeeById(1);
//CURD
Employee employee1 = new Employee("Tom","男",new Date());
int res = employeeMapper.insertEmployee(employee1);
System.out.println(res);
System.out.println(employee1);
运行成功
运行改操作
Employee employee2 = new Employee(11,"Tom","男",new Date());
int res2 = employeeMapper.updateEmployeeById(employee2);
System.out.println(res2);
System.out.println(employee2);
成功11的张三改成Tom(13位置那个Tom忽略,搞错了,刚好下一步删掉操作)
按ID删操作
Employee employee2 = new Employee(13);
int res2 = employeeMapper.deleteEmployeeById(employee2);
System.out.println(res2);
3.增删改查进阶
不按照ID进行添加
新增一种无生日增
<insert id="insertEmployeeV2">
INSERT INTO test1.employee
(name, gender)
VALUES (#{name}, #{gender});
</insert>
对应的方法 1.1
int insertEmployeeV2(String name,String gender);
准备添加一个运行一下
int res = employeeMapper.insertEmployeeV2("Alex","男");
System.out.println(res);
结果一定会报错
因为MyBatis不认识上面那个 1.1 里的参数,应该改成
int insertEmployeeV2(@Param("name") String name,@Param("g") String gender);
为什么最后gender改成了g呢,因为是什么无所谓,它不管是什么,
都代表后面的东西
所以前面Mapper.xml里代码改成
<insert id="insertEmployeeV2">
INSERT INTO test1.employee
(name, gender)
VALUES (#{name}, #{g});
</insert>
最后再次运行,成功
再换一种
分别是这样
int insertEmployeeV3(@Param("e") Employee employee);
和这样,加个 e. 前缀
<insert id="insertEmployeeV3">
INSERT INTO test1.employee
(name, gender, birthday)
VALUES (#{e.name}, #{e.gender}, #{e.birthday});
</insert>
运行一下
Employee employee1 = new Employee("BlackGirl","女",new Date());
int res = employeeMapper.insertEmployeeV3(employee1);
System.out.println(res);
自增id
添加后面即可
<insert id="insertEmployeeV2" useGeneratedKeys="true" keyProperty="id">
修改参数名
比如现在要求将类里的name改为username,
public class Employee {
private Integer id;
private String username;
private String gender;
private Date birthday;
//..................
}
那么在Mapper.xml中添加resultMap即可
<resultMap id="employeeMap" type="org.example.model.Employee">
<id column="id" property="id"></id>
<result column="name" property="userName"></result>
<result column="gender" property="gender"></result>
<result column="birthday" property="birthday"></result>
</resultMap>
或者在要使用的sql里加as
<select id="selectEmployeeById" parameterType="int" resultType="org.example.model.Employee">
SELECT id,name as username,gender,birthday
FROM employee
WHERE id = #{id}
</select>
小知识
这里用 #{ } ,那么输出就是带双引号的,如果用 ${ } 那本来是什么就是什么
WHERE id = #{id}
三 动态SQL
待更新。。。