Log4j
添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加log4j.properties文件
log4j.rootCategory=DEBUG, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=E:\\tool\\logs\\dpb.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
传入参数
#和$的区别
由于MyBatis底层还是Jdbc,而Jdbc在操作数据库传递参数时,有两种方式,一种是使用Statement,还有一种是使用PreparedStatement: 使用statement时,存在SQL注入问题,PreparedStatement则通过预编译解决了SQL注入问题。 在MyBatis中,引入参数有两种方式,一种是使用#,还有一种是使用$,其中,使用#对应了Jdbc种的PreparedStatement,而使用$则对应了Jdbc种的Statement,因此在MyBatis种,推荐使用#。
#使用
$的使用
加入可以使用$替换#,注意,如果使用$,需要在Mapper种指定参数名字
添加@Param注解之后 $和#的区别:一个是预编译的,一个是直接赋值的的, #是预编译也就是通过 也就是通过PreparedStatement方式实现的 $ 直接赋值 也就是通过Statement方式实现的 而且在接口中需要通过@Param接口指定key
多个参数
<mapper namespace="com.sxt.dao.IUserDao">
<delete id="detele" parameterType="int">
delete from t_user where id=${id}
</delete>
<insert id="insert1">
insert into t_user(username,password)values(#{arg0},#{arg1})
</insert>
<insert id="insert2">
insert into t_user(username,password)values(#{param1},#{param2 })
</insert>
<insert id="insert3">
insert into t_user(username,password)values(#{name},#{password})
</insert>
</mapper>
public int detele(@Param("id") Integer id);
public int insert1(String username,String password);
public int insert2(String username,String password);
public int insert3(@Param("name") String username,@Param("password")String password);
包装对象
bean类对象
package com.sxt.bean;
public class UserDto {
private User user;
private int age;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
映射文件
<insert id="addUser" parameterType="UserDto">
insert into t_user
(
username
,password
,age
)values(
#{user.username}
,#{user.password}
,#{age}
)
</insert>
测试
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
IUserDao dao = session.getMapper(IUserDao.class);
User user=new User();
user.setUsername("admin23");
user.setPassword("345");
UserDto dto=new UserDto();
dto.setUser(user);
dto.setAge(19);
dao.addUser(dto);
session.commit();
session.close();
.返回数据
ResultType
对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型即可。 如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。
ResultMap
resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先可以通过取别名解决,例如Bean的定义如下:
user对象
private Integer id;
//该类型和字段不一致
private String name;
private String password;
映射文件
<select id="query3" resultType="user">
select * from t_user
</select>
测试
解决方式一
<select id="query1" resultType="user">
select
id
,username name
,password
from t_user
</select>
解决方式二
<!-- 定义一个ResultMap -->
<resultMap type="user" id="BaseResultMap">
<!-- 定义成员变量和字段的映射关系 -->
<id property="id" column="id"/>
<result property="name" column="username"/>
<result property="password" column="password"/>
</resultMap>
<select id="query2" resultMap="BaseResultMap">
select
*
from t_user
</select>
主键的回写
一般情况下,主键有两种生成方式:
- 主键自增长
- 自定义主键(一般可以使用UUID) 如果是第二种,主键一般是在Java代码中生成,然后传入数据库执行,如果是第一个主键自增长,此时,Java可能需要知道数据添加成功后的主键。 在MyBatis中,可以通过主键回填来解决这个问题(推荐)。
主键回填
<insert id="insert1" parameterType="user"
useGeneratedKeys="true" keyProperty="id">
insert into t_user(username,password)values(#{name},#{password})
</insert>
测试
selectKey
另外,可以利用MySQL自带的==last_insert_id()==函数查询刚刚插入的id
<insert id="insert2" parameterType="user">
<selectKey keyProperty="id" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into t_user(id,username,password)values(#{id},#{name},#{password})
</insert>