一 Mybatis入门案列
1.1环境搭建
1.1.1 引路依赖
<dependencies>
<!--myubatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- log4j日志包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
配置环境变量在SqlMapConfig.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>
<!--配置环境-->
<environments default="mysql">
<environment id="mysql">
<!--事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
1.1.2 创建Mybatis核心配置文件SqlMapConfig.xml
1 导入sql文件
2.导入log4j文件
3.创建实体类
package com.itbaizhan.pojo;
public class User {
private int id;
private String username;
private String sex;
private String address;
构造方法(有参和无参),get和set,tostring方法
1.2 创建持久层接口和映射文件
1.2.1 创建持久层接口
public interface UserMapper {
List<User> findAll();
}
1.2.2 在 resources目录下创建映射文件(和接口路径得一样)
mapper是映射器,namespace是接口路径
id是方法名, resultType是实体类,下面写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">
<mapper namespace="com.itbaizhan.mapper.UserMapper">
<select id="findAll" resultType="com.itbaizhan.pojo.User">
select * from user
</select>
</mapper>
1.2.3 将映射文件配置到核心文件中SqlMapConfig.xml
<!--告诉Mybatis加载映射文件-->
<mappers>
<mapper resource="com/itbaizhan/mapper/UserMapper.xml"></mapper>
</mappers>
注意事项
- 映射文件要和接口名称相同。
- 映射文件要和接口的目录结构相同。
- 映射文件中namespace属性要写接口的全名。
- 映射文件中标签的id属性是接口方法的方法名。
- 映射文件中标签的resultType属性是接口方法的返回值类型。
- 映射文件中标签的parameterType属性是接口方法的参数类型。
- 映射文件中resultType、parameterType属性要写全类名,如果是集合类型,则写其泛型的全类名。
1.3 测试持久层接口方法
public class TestUserMapper {
@Test
public void testFindAll() throws Exception {
//1.读取核心配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2)创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3)SqlSessionFactoryBuilder对象获取SqlsessionFactory对象
SqlSessionFactory build = builder.build(is);
//4) SqlSessionFactory对象获取sqlSession对象
SqlSession session = build.openSession();
//5)sqlSession对象获取代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
//6)代理对象执行方法
List<User> all = mapper.findAll();
all.forEach(System.out::println);
//7释放资源
session.close();
is.close();
二Mybatis核心对象以及工作流程
MyBatis核心对象
SqlSession工厂构建者对象,使用构造者模式创建SqlSession
工厂对象。
SqlSessionFactorySqlSession 工厂,使用工厂模式创建SqlSession对象。
SqlSession 该对象可以操作数据库,也可以使用动态代理模式创建持久层接口的代理对象操作数据库。
Mapper 持久层接口的代理对象,他具体实现了持久层接口,用来操作数据库。
工作流程
- 创建SqlSessionFactoryBuilder对象
- SqlSessionFactoryBuilder对象构建了SqlSessionFactory对象:构造者模式
- SqlSessionFactory对象生产了SqlSession对象:工厂模式
- SqlSession对象创建了持久层接口的代理对象:动态代理模式
- 代理对象操作数据库
使用SQLSession操作数据库
Mapper动态代理原理
二 Mybatis增删改查
sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’
2.1 新增方法
先写接口方法
//添加
void add(User user);
在文件添加查找方法
<insert id="add" parameterType="com.itbaizhan.pojo.User">
insert into user(username, sex,address)values(#{username},#{sex},#{address})
</insert>
测试
@Test
public void testAdd() throws Exception {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User("程序员","男","上海");
mapper.add(user);
//手动提交事务
session.commit();
session.close();
is.close();
}
注意:
当接口方法的参数类型为POJO类型时,SQL语句中绑定参数时使用#{POJO的属性名}即可。
MyBatis事务默认手动提交,所以在执行完增删改方法后,需要手动调用SqlSession对象的事务提交方法,否则数据库将不发生改变。
2.2 修改方法
接口里写方法
//修改
void updater(User user) ;
配置文件写实现方法
<update id="updater" parameterType="com.itbaizhan.pojo.User">
update user
set username=#{username},
sex = #{sex},
address = #{address}
where id = #{id}
</update>
优化代码加测试修改方法
public class TestUserMapper2 {
InputStream is=null;
SqlSession session=null;
UserMapper userMapper=null;
@Before
public void before() throws Exception {
//1.读取核心配置文件
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2)创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3)SqlSessionFactoryBuilder对象获取SqlsessionFactory对象
SqlSessionFactory factory = builder.build(is);
//4) SqlSessionFactory对象获取sqlSession对象
session = factory.openSession();
//5)sqlSession对象获取代理对象
userMapper = session.getMapper(UserMapper.class);
}
@After
public void after() throws IOException {
//释放资源
session.close();
is.close();
}
@Test
public void testUpadte(){
User user=new User(7,"程序员2","女","深圳");
userMapper.updater(user);
session.commit();
}
2.3删除方法
//删除
void delete(int userId);
<!--删除标签-->
<delete id="delete" parameterType="int">
delete from user when id = #{id}
</delete>
public void testDelete(){
userMapper.delete(7);
session.commit();
}
2.4 根据id查询用户
//根据id查询
User findById(int userId);
<select id="findById" parameterType="int" resultType="com.itbaizhan.pojo.User">
select * from user where id = #{userId}
</select>
public void testFindByIdt(){
User user = userMapper.findById(1);
System.out.println(user);
}
二 Mybatis模糊查询
查找:select * from table1 where field1 like ’%value1%’ 查找别忘了加%占位符
第一种写法
接口写
//模糊查询
//like
List<User> findByUsernameLike(String username);
配置文件写查询语句
<!--模糊查询-->
<select id="findByUsernameLike" resultType="com.itbaizhan.pojo.User" parameterType="String">
select * from user where username like #{username}
</select>
写查询·
@Test
public void TestFindByUsernameLike(){
List<User> users = userMapper.findByUsernameLike("%尚学堂%");
users.forEach(System.out::println);
}
第二种写法
配置文件写查询语句
<select id="findByUsernameLike" resultType="com.itbaizhan.pojo.User" parameterType="String">
select * from user where username like'%${value}%'
</select>
#和$的区别:
1 # 表示sql模板的占位符,KaTeX parse error: Expected 'EOF', got '#' at position 23: …接到sql模板中。 2 #̲可以防止sql注入,一般能用#…。
3 ${}内部的参数名必须写value。
三 Mybatis分页查询
方法一
limit 标签
接口
/**
* 分页查询
* @param startIndex 开始索引
* @param pageSize 每页条数
* @return
*/
List<User> findPage(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
映射文件
<select id="findPage" resultType="com.itbaizhan.pojo.User" >
select * from user limit #{startIndex},#{pageSize}
</select>
测试
@Test
public void TestfindPage(){
List<User> page = userMapper.findPage(3,3);
page.forEach(System.out::println);
}
方法二 pojo方式
定义一个pojo类
package com.itbaizhan.pojo;
public class PageQuery {
private int startIndex;
private int pageSize;
映射
<select id="findPage1" resultType="com.itbaizhan.pojo.User" parameterType="com.itbaizhan.pojo.PageQuery" >
select * from user limit #{startIndex},#{pageSize}
</select>
测试
@Test
public void TestfindPage1() {
PageQuery pageQuery = new PageQuery(3, 3);
List<User> page = userMapper.findPage1(pageQuery);
page.forEach(System.out::println);
}
聚合查询&主键回填
聚合查询
接口
//查询用户总数
int findCount();
映射
<select id="findCount" resultType="int">
select count(id) from user
</select>
测试
@Test
public void testFindCount() {
System.out.println(userMapper.findCount());
}
主键回填
作用:有时我们需要获取新插入数据的主键值。
如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。
接口
void add(User user);
映射
<insert id="add2" parameterType="com.itbaizhan.pojo.User">
<!-- keyProperty:主键属性名,keyColumn:主键列名,resultType:主键类型,order:执行时机 -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey>
insert into user(username,sex,address)
values(#{username},#{sex},#{address})
</insert>
SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行。
测试
@Test
public void testAdd2(){
User user = new User("程序员", "男", "北京");
System.out.println(user);
userMapper.add2(user);
session.commit();
System.out.println(user);
}