具体代码实现
基本操作:where>group by>having>order by>limit
增:
insert into 表名称(指定列1,指定列2)
INSERT INTO user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
删:
DELETE FROM user WHERE id = #{uid}
改:
UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id}
查:
模糊查询: SELECT * FROM user WHERE username LIKE #{name}
mapper.listUsersByName("%王%");传入的name需要加入模糊查询的通配符
聚合函数: SELECT count(id) FROM user
注意:
如果只是调用方法而没有sqlSession.commit(),那么提交失败事务自动回滚
因此,如果需要自动提交事务,只需factory.openSession(true);
同时,可以设置事务的隔离级别,是一个enum枚举类型
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)
映射配置文件:
类名+类的方法名——》存储类型+执行的SQl语句
类名:在getMapper时候定义
id:类的方法名的定义
parameterType:表示将会传入这条语句的参数类的完全限定名或别名完全限定名或者是基本类型引用类型
1:格式:#{username}=User.username
2:遵循OGNL原则:
Object Graphic Navigation Language
即若parameterType是实体类的包装类(POJO)QueryVo,则
#{user.username}=user.getUsername()
3:遵循单个参数自动匹配原则。即如果parameterType为一个基本类型或包装类,会自动匹配到SQL语句的参数中不需要名字对应
resultType:
如果有多个返回值User,会自动封装成List
为了解决实体类属性名与数据库表列名不一致,有以下解决方法:
1:在 SQL 语句中为所有列起别名,使别名与实体类属性名一致(执行效率相对高,开发效率低)
SELECT id AS userId, username AS userName, birthday AS userBirthday, sex AS userSex, address AS userAddress FROM user
2:
在映射文件中使用 resultMap 完成结果集到实体类的映射(执行效率相对低,开发效率高)
1:主配置文件:数据库连接的dataSource直接写入源码中,耦合度很强。
改进方法:利用properties
此时就可以读取外部的配置文件,读入键值对
2:同样的映射文件Mapper中
传入的参数resultType=“com.daniel.domain.User” 也需要全限定类名,耦合度高
解决方法:主配置文件中的typeAliases里的typeAlias或者package
1、连接池:
在实际开发中都会使用连接池
因为它可以减少我们获取连接所消耗的时间
2、mybatis中的连接池:
mybatis连接池提供了3种配置方式:
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的值:
POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
UNPOOLED 采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想
JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样的
java.sql.DataSource的接口UnpooledDataSource和PooledDataSource类来表示UNPOOLED和POOLED类型
UnpooledDataSource:利用getConnection,注册驱动获取链接Connection
PooledDataSource:getConnection
1:synchronized 线程安全
2:是否有空连接
3:活动线程数是否超过最大值,如果没有,则new PooledConnection
4:否则获取活动连接中最老的一个Connection
if:实现对SQl语句的条件编译。利用text=“判断条件”
where:实现省略where 1=1注意,不同IF之间仍然需要and连接
foreach:实现select * from where userId in (1,2,3)
具体内容