添加依賴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>