@Mybatis注意事项
#1.1创建Mybatis-Config.xm,导入相应的jar包
slf4j-log4j12-1.7.2.jar
slf4j-api-1.7.2.jar
mysql-connector-java-5.1.26-bin.jar
mybatis-3.2.1.jar
log4j-1.2.17.jar
javassist-3.17.1-GA.jar
commons-logging-1.1.1.jar
cglib-2.2.2.jar
asm-3.3.1.jar
<?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>
<!--引入jdbc.propeties文件-->
<properties resource="jdbc.properties" />
<!-- 环境们 (很多环境的意思)
default:默认使用哪一个环境(必需对应一个环境的id)
-->
<!--给类或者包设置别名-->
<typeAliases>
<!--给类设置别名-->
<!--<typeAlias type="cn.itsource.domain.User" alias="User"></typeAlias>-->
<!--给包设置别名-->
<package name="cn.itsource.domain"></package>
<package name="cn.itsource.query"></package>
</typeAliases>
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 -->
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mappers>
<mapper resource="cn/itsource/domain/UserMapper.xml" />
</mappers>
</configuration>
1.2配置jdbc.properties`
1.3创建对应的mapper.xml
namespace的命名空间:持久层(dao)+接口名,dao层的实现类通过namespace和根据不同同条件命名的id唯一确认
```java
<?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的主要功能就是写sql
mapper:根
namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加 dao层+接口名
namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
-->
<mapper namespace="cn.itsource.dao.IUserDao">
<!--
select : 这里面写查询语句
id:用来确定这条sql语句的唯一
以后我们确定唯一,也就是找sql语句 : namespace +.+ id,实现类通过namespace+id唯一确定
例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
parameterType : 传入的参数类型 long:大Long _long:小long (具体的对应请参见文档)
resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名
-->
<!--传入的参数类型或者返回值可以通过别名来代替
<typeAliases>
<package name="cn.itsource.domain"></package>
</typeAliases>
-->
<!--查询所有数据-->
<select id="queryAll" resultType="User">
select * from t_user
</select>
<sql id="whereQuery">
<where>
<if test="name!=null">
and name like #{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
</where>
</sql>
<!--高级查询-->
<select id="queryList" parameterType="userQuery" resultType="User">
select * from t_user
<include refid="whereQuery"></include>
</select>
<!--查询单个数据-->
<select id="queryOne" parameterType="long" resultType="User">
select * from t_user where id=#{id}
</select>
<!--新增
获取主键,通过主键做其他一些操作
keyColumn:获取到数据库中主键id,
keyProperty:指对象中得字段id
useGeneratedKeys:生成主键
keyColumn获取到主键,然后传给对象中的id字段(keyProperty),最后通过useGeneratedKeys生成
-->
<insert id="save" parameterType="User"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into t_user(name) values(#{name})
</insert>
<!--
<!--修改-->
<update id="update" parameterType="User">
update t_user set name=#{name} where id=#{id}
</update>
<!--删除-->
<delete id="delete" parameterType="long">
delete from t_user where id=#{id}
</delete>
<!--
批量删除,传入的是一个list集合
collection:说明传入的是什么类型
open:以什么开始 separator:分隔符 close:以什么结束
item:每次循环获取到值
以“(”开始,循环一次获取一个id得值,在添加一个“,",以”)“结束,直到循环结束
-->
<delete id="deleteBatch" parameterType="list">
delete from t_user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!--
批量新增,传入得是对象
-->
<insert id="saveBatch" parameterType="list">
insert into t_user(name) values
<foreach collection="list" item="user" separator=",">
/*添加得是对象姓名,insert into t_user(name) values("xxx"),("yyy")*/
(#{user.name})
</foreach>
</insert>
<!--批量修改-->
<update id="updateBatch" parameterType="hashMap">
update t_user set name="曹操" where id in
<foreach collection="mapList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>
2.#和$的区别
${id}找的是类里面getId中是否存在id,如果存在则不会报错,不存在则报错
'#相当于占位符,${name}这相当于拼接
'#可以解决sql注入问题,相当于PreparedStatement ${id}相当于Statement
update t_user set name=${name} where id=#{id}
生成之后的效果
update t_user set name=豪哥 where id=?
-->
3.获取主键,解决一些后续操作,
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191126234049402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjOTYxNzM=,size_16,color_FFFFFF,t_70)
4.获取日志文件方式
4.1直接输出打印
4.2使用日志框架
导入相应的jar包
创建log4j.properties资源文件
```java
#OFF(什么都不输出关闭日志信息)< FATAL<ERROR<WARN<INFO<DEBUG<TRACE < ALL (最低级别 什么信息都要输出)
#可以直接从网上搜索
#日志级别,打印到控制台
log4j.rootLogger=error, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
#输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#输出到控制台的格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
5.mybatis自定义别名
<typeAliases>
<!--给类设置别名-->
<!--<typeAlias type="cn.itsource.domain.User" alias="User"></typeAlias>-->
<!--给包设置别名-->
<package name="cn.itsource.domain"></package>
<package name="cn.itsource.query"></package>
</typeAliases>
6.业务层的使用,需要sqlSesion调用相应的方法
6.1 通过获取reader,连接数据库,读取资源
Reader reader = Resources.getResourceAsReader(“Mybatis-Config.xml”);
6.2 获取到sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
6.3 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
6.4 通过sqlSession调用相应的方法操作数据库
6.5由于以上四句代码,具有重复性,因此我们可以将其抽取出来,写一个工具类,以后可以直接调用该工具类即可。这里使用的是枚举
public enum MybatisUtil {
//枚举
INSTANCE;
private static SqlSessionFactory sqlSessionFactory;
static {
Reader reader =null;
try {
//与数据库建立联系,读取配置文件
reader = Resources.getResourceAsReader("Mybatis-Config.xml");
sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
System.out.println("配置文件出错!!!"+e.getMessage());
}
}
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
6.6工具类的几种写法
工具类写法:
(1) 单例模式
一个类保证只有一个实例
懒汉 饿汉 枚举 线程安全单例
(2) 静态方法