添加依赖java
<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种,推荐使用#。apache
加入可使用$替换#,注意,若是使用$,须要在Mapper种指定参数名字
api
添加@Param注解以后
$和#的区别:一个是预编译的,一个是直接赋值的的, #是预编译也就是经过 也就是经过PreparedStatement方式实现的 $ 直接赋值 也就是经过Statement方式实现的 并且在接口中须要经过@Param接口指定keysession
<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类对象mybatis
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; } }
映射文件app
<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();
对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本数据类型便可。 若是返回的是一个对象或者集合,而且对象中的属性和查询的字段名是一一对应的,那么resultType也能够直接写一个对象。测试
resultMap主要用来解决属性名和字段名不一致以及一对多、一对一查询等问题 字段名不一致时,首先能够经过取别名解决,例如Bean的定义以下:ui
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>
通常状况下,主键有两种生成方式:
<insert id="insert1" parameterType="user" useGeneratedKeys="true" keyProperty="id"> insert into t_user(username,password)values(#{name},#{password}) </insert>
测试
另外,能够利用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>