文章目录
单表CRUD操作
实现流程
- 在Dao接口类中定义操作方法
- 在Dao接口类的对应映射配置文件中的相应标签内添加并写入对应的 sql 语句
- 在使用类中调用Dao接口类的方法使用(https://gitee.com/RaceK/Learn)
IUserDao.java 接口类
/**
* 查询所有操作
* @return 返回user列表
**/
List<User> findAll();
IUserDao.xml 映射配置文件
<mapper namespace="com.learn.dao.IUserDao">
<!-- 配置查询所有 -->
<!-- resultType 表示指定返回的是哪一种对象 -->
<select id="findAll" resultType="com.learn.domain.User">
select * from user;
</select>
test.java 测试类
/**
* 测试查找所有
* 使用传统方法
* @throws IOException 异常
*/
@Test
public void testFindAll() throws IOException {
// 1 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2 创建SqlSessionFactory工厂
// Mybatis把工厂的创建细节封装在SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 4 使用SqlSession创建dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 5 使用代理对象的执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 6 释放资源
session.close();
in.close();
}
使用细节
- 增删改查的对应 xml 标签:
insert
delete
update
select
- 若要在保存了数据之后获取其id值,要在映射配置文件的增加标签中添加
selectKey
标签
<!-- 在保存完成后获取当前保存的id值 -->
<!-- keyProperty属性名,对应实体类 order取值为AFTER代表插入后的行为 keyColumn列名,对应数据库表中的列 -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
mybatis 参数传递
参数传递方法类型
- 通过 parameterType 传入参数类型为自定义类或
int
整形和String
类型
SQL语句传入参数
- 在配置文件中表示传入参数的类型,后面使用参数的时候名称要与传入对象的属性名一致
- 使用
#{}
和${}
均可将参数传入到sql语句中,前者使用preparedStatement
的参数占位符方式,后者使用语句拼接的方式,通常使用#{}
${}
外面要用单引号括住,然后大括号里面的值必须是名为value,即'%${value}%'
,在模糊查询中就可以不再传入带%
的字符串
传递pojo对象
- pojo对象就是
JavaBean
对象(实体类对象) - Mybatis 使用
ognl
表达式解析对象字段的值,#{}或者${}括号中的至为pojo
属性名称 OGNL
表达式(Object Graphic Navigation Language 对象 图 导航 语言)它是通过对象中的取值方法获取数据,在写法上把get给省略了,比如获取用户的名称,一般是user.getUserName()
,ONGL 表达式写法:user.userName
- 为什么在Mybatis中可以直接写
userName
而不用user
呢?是因为在parameterType
中已经提示了属性所属的类,所以此时不需要写对象名,直接写属性名 - 开发过程中查询条件是综合的查询条件,可能会包括多方的查询条件,这时就可以组成一个我们自己定义的称为查询条件的对象
- 使用过程
(1)自定义一个类,包含了需要的查询条件
(2)在Dao接口类中定义方法
(3)在映射配置文件中配置
(4)在方法中将要查询的条件放入到pojo对象中
(5)调用查询方法查询用户 - 具体代码可在仓库中的
text.java
中查看
输出结果封装 resultType
- 可以是一个简单类型,可以是pojo对象,还可以是pojo对象列表
- 封装结果时要求实体类属性名和数据库表列名一致,如果不一致,封装时会不匹配,数据封装不进去
- 如果要解决不匹配的问题
(1)最简单的是在 sql 语句中起别名select id as userId from user
,由于直接在sql语句上操作,所以效率也是最高的
(2)在映射配置文件中配置查询结果列名和实体类的属性名的对应关系
<!-- 如果数据库表列名和实体类属性名不一致时需要配置对应关系 -->
<!-- 配置 查询结果列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="com.learn.domain.User">
<!-- 主键字段的对应 -->
<id property="userId" column="id"/>
<!-- 非主键字段的对应 -->
<result property="userName" column="name"/>
<result property="userSex" column="sex" />
<!-- 因为是java语言,因此严格区分大小写 -->
<!-- property:实体类中的属性名 column:数据库表的列名 -->
<!-- javaType:java中的属性类型 jdbcType:数据库中的列表类型 -->
</resultMap>
<!-- 下面的CRUd操作中的resultType就不能用了,要用resultMap属性 resultMap="userMap" -->
mybatis Dao编写
实现流程
- 新建一个接口实现类
UserDaoImpl
- 实现接口
- 调用执行
// 1 创建类并实现接口
public class UserDaoImpl implements IUserDao {
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory) {
this.factory = factory;
}
@Override
public List<User> findAll() {
//1 根据factory 获取SqlSession对象
SqlSession session = factory.openSession();
//2 调用SqlSession中的方法,实现查询列表
//参数就是能获取配置信息的key 配置文件中的 namespace + id
List<User> users = session.selectList("com.learn.dao.IUserDao.findAll");
//3 释放资源
session.close();
return users;
}
}
// 2 调用执行
public class testDao {
private InputStream in;
private IUserDao userDao;
@Before//用于在测试方法之前执行
public void init() throws IOException {
// 1 读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2 创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 3 使用工厂对象创建dao对象
userDao = new UserDaoImpl(factory);
}
@After//用于在测试方法之后执行
public void close() throws IOException {
in.close();
}
/**
* 测试查找所有
*/
@Test
public void testFindAll() {
// 5 使用代理对象的执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
}
- 查询用
select
方法,查询一个用selectOne
方法,查询多个用selectList
方法,插入,删除,更新分别用insert delete update
方法 - 增删改的方法最后调用的都是 update 方法
mybatis 的配置(SqlMapConfig.xml)
- properties标签
(1)配置数据库连接信息
(2)可以在标签内部配置,也可以通过 resource 属性引用外部配置信息
# SqlMapConfig.xml 文件
## 内部配置
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/user"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</properties>
<!-- 下面的environment标签中配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本属性 -->
<!-- 有了这些便能创建Connection对象 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
## 外部引用
<properties resource="jdbcConfig.properties">
</properties>
<!-- 下面的environment标签中配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本属性 -->
<!-- 有了这些便能创建Connection对象 -->
<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>
# jdbcConfig.properties 文件
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/user
jdbc.username = root
jdbc.password = 123
typeAliases
标签
(1)当映射配置文件中的parameterType的值如果是简单类型,可以直接使用int
或String
,这是因为自立用了别名,Mybatis已经设置了一些简单类型的别名方便使用,那么我们自定义的实体类就可以通过在主配置文件中使用typeAliases
配置
(2)typeAlias
用于配置别名 type属性指定的是实体类的全限定类名 alias属性指定别名,当指定了别名就不再区分大小写
(3)package
用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写
<!-- 使用typeAliases 配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<typeAlias type="com.learn.domain.User" alias="user"/>
<package name="com.learn.domain"/>
</typeAliases>
- mappers标签
(1)用于指定映射配置文件的位置,通过mapper设置,可以知道映射配置文件的位置和信息,有mapper和package两个标签
(2)mapper标签用于指定单个映射配置文件,有class、resource和url三个属性,用于标识文件路径,如果使用注解则用class,使用传统方法用resource和url(区别在于路径的形式)
(3)package标签用于指定dao接口所在的包,指定了之后就不用再写mapper以及resource或class了,可用于多个配置文件的指定