1、数据库连接,使用时就创建,不适用时就立即释放,对数据库进行频繁的开启和关闭,
造成数据库资源浪费,影响数据库性能
2、将 sql 语句硬编码到 java 代码中,如果 sql 语句修改,还需要重写编译 java 代码,不
便于系统维护
3、从查询的 resultSet 中遍历结果集数据时,将获取表的字段进行硬编码,不利于系统维
护
解决:
1、使用连接池关联数据库里连接
2、将 sql 语句存入到 xml 配置文件中,sql 语句修改无需重写编译
3、将查询的结果集 自动映射成 Java 对象
mybatis 是一个持久层框架,使程序员依靠mybatis的映射方式,专注于sql语句,自动完成输入输出映射。
示例:
1、工程目录:
2、在 config 资源目录下添加 sqlMapConfig..xml 文件,配置数据源和事物,并加载 Mapper.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yspweb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="sqlMap/User.xml"/>
mappers>
configuration>
延伸:尽量不使用${}
,${}
表示一个拼接符, 有 sql 注入的风险。
where id=${value} sql解析后变成id=value
where id=#{value} sql解析后变成id="value"
,多了双引号。
mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{};
4、创建Java具体类
5、先加载 SqlMapConfig 资源文件,再通过 SqlSessionFactoryBuilder 根据资源文件创建会话工厂,有了会话工厂就可以通过 SessionFactory 的 openSession()方法获取到会话 SqlSession 对象。
SqlSession 是线程不安全的(即多个线程访问不能使用同一个对象),在 SqlSession
实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession 的最佳使用场合是在方法体内,定义成局部变量使用;执行完了数据库的操作后,记得要释放资源,执行更新操作时还要先提交事物。
6、输出映射
1)resultType 为基本类型
Integer,String,map
2)resultMap 自定义类型,一般为pojo
id="mybatisId" type="包名.pojo名"
<result property="funcId" column="func_id" javaType="String" jdbcType="VARCHAR" />
。。。。
1.
标签
第一种,精确查询
<if test="name !=null and name !=''">
and name = #{name}
if>
第二种,模糊查询
<if test="fileName != null and fileName !=''">
"fileName_l" value="'%'+fileName+'%'"/>
AND file_name like #{fileName_l}
if>
2.for each标签
1) 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2) 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名。
传入参数为list,要用size()
<if test="func_ids != null and func_ids.size()>0">
and fmr.func_id in
"func_ids" index="index" item="item"
open="(" separator="," close=")">
#{item}
if>
3.and or 混用需要加括号,因为and的优先级高于or,不加括号会得到不正确的结果
<if test="reviseStatus != null and reviseStatus!=''">
and
<if test="reviseStatus==2">
( revise_status='3'
if>
<if test="reviseStatus==2">
or
if>
revise_status = #{reviseStatus, jdbcType=INTEGER}
<if test="reviseStatus==2">
)
if>
if>