Mybatis
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>
<!--导入配置文件jdbcConfig.properties,<property>可以直接用${}调用配置文件内的属性-->
<properties resource="jdbcConfig.properties"></properties>
<settings>
<!--设置支持二级缓存(默认是true)-->
<setting name="cacheEnabled" value="true"/>
<!--设置延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
<!--给domain包内所有类设置了别名。引用domain包内所有类时,不用再写全限定类名,可以直接写类名-->
<package name="cn.domain"></package>
</typeAliases>
<!--设置环境变量-->
<environments default="mysql">
<environment id="mysql">
<!--设置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--设置连接数据库的信息-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property> <!--${}内写配置文件对于的属性-->
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!--告知mybatis接口配置文件位置-->
<mappers>
<!-- <mapper resource="cn/dao/UserDao.xml"></mapper> -->
<!--导入cn.dao包内所有接口对于的配置文件-->
<package name="cn.dao"></package>
</mappers>
</configuration>
UserDao.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="cn.dao.UserDao">
<!--设置二级缓存支持-->
<cache></cache>
<!-- 建立User实体与数据库表的对应关系 -->
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
<result column="address" property="address"></result>
<collection property="accounts" column="id" ofType="Account" select="cn.dao.AccountDao.findById">
</collection>
</resultMap>
<select id="findAll" resultMap="userMap" useCache="true"> <!--设置了缓存支持-->
select * from user
</select>
<insert id="save" parameterType="cn.domain.User">
<selectKey order="AFTER" resultType="int" keyColumn="id" keyProperty="id"> <!-- 获取保存该数据后,数据库自动获得的id -->
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<update id="update" parameterType="cn.domain.User">
update user set sex=#{sex} where id=#{id}
</update>
<delete id="deleteById" parameterType="Integer">
delete from user where id=#{id}
</delete>
<select id="findOneByName" parameterType="String" resultType="cn.domain.User">
select * from user where username=#{s}
</select>
<select id="find" parameterType="String" resultType="User">
select * from user where username like #{aa}
</select>
<select id="getCount" resultType="Integer">
select count(*) from user
</select>
<select id="findByCondition" resultType="User" parameterType="user">
select * from user
<where> <!-- where的使用 -->
<if test="sex!=null and sex!=''"> <!-- if的使用 -->
and sex like #{sex}
</if>
<if test="id!=null and id!=''">
and id like #{id}
</if>
<if test="username!=null and username!=''">
and username like #{username}
</if>
</where>
</select>
<select id="findByIds" parameterType="queryvo" resultType="user">
select * from user
<where>
<if test="ids!=null and ids.size>0">
<foreach collection="ids" open="id in (" close=")" item="id" separator=","> <!-- foreach的使用 -->
<!----> #{id}
</foreach>
</if>
</where>
</select>
</mapper>
oracle
1. oracle会为每一个用户,默认创建数据库,在下面可以创建表
2. Oracle不会自动提交,执行后要按commit.
3. 在本地,通过客户端远程连接Oracle 报:error , 15241,not lisenner
原因:监听服务没有启动(假启动)
Oracle的核心服务有两个:
* 监听服务 OracleOraDb10g_home1TNSListener
* 服务器核心 OracleServiceORCL
解决步骤:
步骤一:找到监听对应的配置文件,修改一下即可
C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN:
listener.ora: 修改配置文件的ip 和 windowsserver2003的ip一样
tnsnames.ora:修改配置文件的ip 和 windowsserver2003的ip一样
步骤二:查找 windowsserver2003的ip: 在cmd--dos命令行:ipconfig/all
步骤三:找到步骤二说的两个服务,重启服务即可 鼠标右键点 电脑图标-------管理---服务和应用程序---服务 :点击重启
【打开服务管理dos命令: services.msc】
4. 报错误:连接到空闲列程
原因:之前使用oracle没有正常关闭
解决步骤:
步骤一: sqlplus sys/root as sysdba
步骤二: shutdown abort
步骤三: startup
mybtis插件:PageHelper的使用
1. 介绍
PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。
2. 所需jar包目标
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
3. 配置注意事项
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor 。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
4. mybatis.xml配置 [ssm可在applicationContext.xml中配置,见第5点]
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="参数名称" value="参数值"/>
</plugin>
</plugins>
5. 在 ApplicationContext.xml配置文件中配置拦截器插件 [ssm项目中使用]
* 使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<props>
<prop key="helperDialect">oracle</prop>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
6. 分页插件参数介绍
1. helperDialect :分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect 属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle , mysql , mariadb , sqlite , hsqldb ,postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012 ,否则会使用 SqlServer2005 的方式进行分页。你也可以实现 AbstractHelperDialect ,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
2. offsetAsPageNum :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
3. rowBoundsWithCount :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,使用 RowBounds 分页会进行 count 查询。
4. pageSizeZero :默认值为 false ,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit =0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
5. reasonable :分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages (超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。
6. params :为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
7. supportMethodsArguments :支持通过 Mapper 接口参数来传递分页参数,默认值 false ,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和ArgumentsObjTest 。
8. autoRuntimeDialect :默认值为 false 。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择 sqlserver2012 ,只能使用 sqlserver ),用法和注意事项参考下面的场景五。
9. closeConn :默认值为 true 。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认 true 关闭,设置为false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
7. PageHelper.startPage 静态方法调用
* 使用方法
这种方式是我们要掌握的 在你需要进行分页的 MyBatis 查询方法前调用PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
* 代码 :
//参数pageNum是页码值 参数pageSize代表是每页显示条数
PageHelper.startPage(1,5);
return ordersDao.findAll();
8. PageInfo类使用
作用: 类中包含页面所需的分页的详细信息,如总页数,总记录数等等。
构造方法 : PageInfo pageInfo = new PageInfo(List<数据类>) 【可以将查询到的数据集合封装到pageInfo,一起传到页面】
注解的使用
1. @Insert:实现新增
2. @Update:实现更新
3. @Delete:实现删除
4. @Select:实现查询
5. @Result:实现结果集封装
6. @Results:可以与@Result 一起使用,封装多个结果集
7. @ResultMap:实现引用@Results 定义的封装
8. @One:实现一对一结果集封装
9. @Many:实现一对多结果集封装
@Results({
@Result(id=true,property = "id",column = "id"),
@Result(property="username",column = "username"),
@Result(property="email",column = "email"),
@Result(property="phoneNum",column = "phoneNum"),
@Result(property="status",column = "status"),
@Result(property="roles",column = "id",javaType =List.class,many =
@Many(select = "cn.itheima.dao.RoleDao.findRoleByUserId"))
})
10. @CacheNamespace:实现注解二级缓存的使用
11. @Param 多个参数时,用于指定参数对应引用
@Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);