新建的maven項目中pom.xml文件中配置所須要jar包的以來座標java
具體代碼以下:
複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis_01</artifactId>
<groupId>com.baoji.mybatis</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>mybatis_04_CRUD_insert</artifactId>
<!-- 導入mybatis相關jar包-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
複製代碼
按具體需求建目錄結構mysql
編寫實體類和接口並建立對應數據庫的表git
一、編寫實體類:User.java
複製代碼
package com.baoji.mybatis.entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' + ", userBirthday=" + userBirthday + ", userSex='" + userSex + '\'' + ", userAddress='" + userAddress + '\'' +
'}';
}
}
複製代碼
二、編寫封裝將實體類做爲查詢條件的類 QueryVo.java
複製代碼
package com.baoji.mybatis.entity;
/**
* QueryVo 做爲參數查詢,其實是將對象做爲屬性。將對象包裝起來做爲查詢條件
*/
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
複製代碼
編寫接口類
複製代碼
package com.baoji.mybatis.dao;
import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.User;
import java.util.List;
public interface IUserDao {
//保存方法
public void saveUser(User user);
//修改方法
public void updateUser(User user);
//刪除方法
public void deleteUser(Integer userId);
//根據id查詢一個user對象
public User selectOne(Integer id);
//根據姓名模糊查詢
public List<User> selectByName(String name);
//根據query evo條件查詢
public List<User> findUserByVo(QueryVo vo);
//查詢全部信息
public List<User> findAll();
}
複製代碼
在resources資源文件中配置mybatis主配置文件並導入log4j的配置文件github
具體代碼以下:config.xml
複製代碼
<!-- mybatis 主配置文件 -->
<?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>
<!-- 配置properties
能夠在標籤內部配置鏈接數據庫的信息,也能夠經過屬性引用外部配置信息
resource 屬性: 經常使用的 (resource="jdbcConfig.properties")
用於指定配置文件的位置,是按照類路徑的寫法來寫,而且必須存在於類路徑下。
url屬性:
是要求按照url的屬性來寫地址
URL: 統一資源定位符,能夠惟一標識一個資源的位置
例如 http://localhost:8080/mybatis/servlet
協議 主機 端口號 uri
uri: 統一資源標識符 ,在應用中能夠惟必定位一個資源的
-->
<properties url="file:///H:/JDBC_config/">
<!--配置鏈接數據庫的四個基本信息-->
<!--
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_user?characterEncoding=gbk"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
-->
</properties>
<!-- 使用typeAliases起別名,它只能配置entity中類的別名-->
<typeAliases>
<!-- typeAlias用於配置別名,type屬性指的是實體類全限定類名,alias屬性指定別名,當指定了別名就再也不區分大小寫-->
<!-- <typeAlias type="com.baoji.mybatis.entity.User" alias="user"></typeAlias> -->
<!-- 用於要配置起別名的包,當指定以後,該包下的實體類都會註冊別名,而且類名就是別名,不區分大小寫-->
<package name="com.baoji.mybatis.entity"/>
</typeAliases>
<!-- 配置環境 -->
<environments default="mysql">
<!-- 配置mysql的配置環境 -->
<environment id="mysql">
<!--配置事務的類型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置數據源(鏈接池)-->
<dataSource type="POOLED">
<!--配置鏈接數據庫的四個基本信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
複製代碼
<!-- 指定映射配置文件的位置,映射配置文件指的是每一個dao獨立的配置文件 -->
<!-- mybatis的映射配置文件位置必須和dao接口的文件位置相同,包名相同時,不須要實現dao接口 -->
複製代碼
<mappers>
<!-- <mapper resource="com/baoji/mybatis/dao/IUserDao.xml"></mapper> -->
<!-- package用於指定dao接口所在的包,當指定了以後就不須要再寫mapper和resource以及class了-->
<package name="com/baoji/mybatis/dao"/>
</mappers>
</configuration>
複製代碼
JDBCconfig.properties jdbc配置文件sql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/eesy_mybatis
username=root
password=root
複製代碼
log4j.properties 配置文件(瞭解便可)數據庫
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
複製代碼
配置位於resources資源文件下的映射文件mapper.xml(映射文件所放的目錄位置要與接口所在位置一致,放在同一種包名下,能夠不用寫接口的實現類,使用代理對象自動實現代理類)apache
此處應注意:安全
當數據庫中字段名與實體類中屬性名一致時: 不須要配置resultMap,在resultType屬性中填寫須要返回類型所在的全路徑名便可bash
當數據庫中字段名與實體類中屬性名一致時: 兩種解決辦法session
第一種:在sql語句中起別名,將數據庫的別名和實體類的屬性名一致便可,執行效率高,很是推薦,可是太麻煩,開發效率低。
select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;
複製代碼
第二種:在配置中添加以下代碼便可(最後將之前的resultType改成resultMap,值爲上面定義的id值)
<!-- 配置查詢結果的列名和實體類的屬性名的對應關係 -->
<resultMap id="userMap" type="com.baoji.mybatis.entity.User">
<!-- 主鍵字段的對應 -->
<id property="userId" column="id"></id>
<!-- 非主鍵字段的對應 -->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
複製代碼
編寫映射配置文件 IUserDao.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="com.baoji.mybatis.dao.IUserDao">
<!-- 配置查詢結果的列名和實體類的屬性名的對應關係 -->
<resultMap id="userMap" type="com.baoji.mybatis.entity.User">
<!-- 主鍵字段的對應 -->
<id property="userId" column="id"></id>
<!-- 非主鍵字段的對應 -->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- parameterType爲實體類的全路徑 -->
<!-- 查詢全部 -->
<insert id="saveUser" parameterType="com.baoji.mybatis.entity.User">
<!-- 配置插入操做後,獲取插入操做的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
</insert>
<!-- 修改操做 -->
<update id="updateUser" parameterType="com.baoji.mybatis.entity.User">
update user set username = #{username}, address=#{address},sex = #{sex},birthday = #{birthday} where id = #{id};
</update>
<!-- 刪除操做 -->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id};
</delete>
<!-- 根據id查詢一個對象信息 -->
<select id="selectOne" parameterType="int" resultMap="userMap">
select * from user where id = #{id};
</select>
<!-- 根據姓名模糊查詢 -->
<select id="selectByName" parameterType="String" resultMap="userMap">
<!-- 方式一:底層經過佔位符來賦值,使用preparestatement對象,更安全。推薦使用-->
<!-- select * from user where username like #{name}; -->
<!-- 方式二:底層經過字符串拼接來賦值,使用statement對象,瞭解便可-->
select * from user where username like '%${value}%';
</select>
<!-- 根據query vo條件模糊查詢 -->
<select id="findUserByVo" parameterType="com.baoji.mybatis.entity.QueryVo" resultType="com.baoji.mybatis.entity.User">
select * from user where username like #{user.username};
</select>
<!-- 查詢全部信息-->
<select id="findAll" resultType="com.baoji.mybatis.entity.User">
select * from user;
</select>
</mapper>
複製代碼
(使用註解的方式配置映射文件)
在dao接口方法前加@servlet(sql語句)
便可實現和xml一樣的效果(簡單開發效率高)
public interface IUserDao {
/**
* 查詢全部操做
* @return
*/
@Select("select * from user")
List<User> findAll();
}
複製代碼
編寫測試類
測試類: IUserDaoTest.java
複製代碼
package com.baoji.mybatis.test;
import com.baoji.mybatis.dao.IUserDao;
import com.baoji.mybatis.entity.QueryVo;
import com.baoji.mybatis.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class IUserDaoTest {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private IUserDao dao;
//編寫初始化方法(將重複代碼封裝至此)
@Before //此註解是在測試方法以前執行
public void init() throws IOException {
//一、讀取配置文件
in = Resources.getResourceAsStream("Config.xml");
//二、建立sqlSessionFactory工廠
factory = new SqlSessionFactoryBuilder().build(in);
//三、使用工廠建立sqlSession對象
sqlSession = factory.openSession();
//四、使用sqlSession獲取dao的代理對象
dao = sqlSession.getMapper(IUserDao.class);
}
@After //此註解實在測試方法以後執行
//建立關閉資源方法
public void destory() throws IOException {
//提交事務兩種方式(只有提交事務,數據庫才能插入成功)
//方式一:關閉資源前添加提交事務(sqlSession.commit();)
//方式二:在建立sqlSession時事務參數設置爲true
sqlSession.commit();
sqlSession.close();
in.close();
}
//添加操做
@Test
public void saveTest(){
//建立user對象
User user = new User();
user.setUserName("張三");
user.setUserAddress("北京海淀區");
user.setUserSex("男");
user.setUserBirthday(new Date());
//執行添加操做
dao.saveUser(user);
}
//修改操做
@Test
public void updateTest(){
//建立user對象
User user = new User();
user.setUserId(50);
user.setUserName("李四");
user.setUserAddress("上海長虹區");
user.setUserSex("女");
user.setUserBirthday(new Date());
//執行添加操做
dao.updateUser(user);
}
//刪除操做
@Test
public void deleteTest(){
//執行刪除操做
dao.deleteUser(50);
}
//根據id查詢一個對象信息
@Test
public void selectOneTest(){
//執行根據id查詢操做
User user = dao.selectOne(51);
System.out.println(user);
}
//根據姓名模糊查詢對象信息
@Test
public void selectByNameTest(){
//執行模糊查詢操做
List<User> list = dao.selectByName("%王%"); //方式一
//List<User> list = dao.selectByName("王");
for(User users:list){
System.out.println(users);
}
}
//QueryVo 做爲參數查詢,其實是將對象做爲屬性。將對象包裝起來做爲查詢條件
@Test
public void findUserByVoTest(){
User user = new User();
user.setUserName("王五");
QueryVo vo = new QueryVo();
vo.setUser(user);
//執行按照query條件查詢操做
List<User> list = dao.selectByName("%王%");
for(User users:list){
System.out.println(users);
}
}
//查詢全部信息
public void findAllTest(){
List<User> list = dao.findAll();
for (User users : list) {
System.out.println(users);
}
}
}
複製代碼
到此就介紹完如何使用經過搭建mybatis環境完成CRUD操做了,驚不驚喜,意不意外,就是這麼簡單,用起來真的很爽!!!
推薦做者的Github地址:github.com/Lmobject
感謝您的支持與鼓勵,望能獲得您的關注與點贊,寫博客容易,堅持不易!!!加油。。。
複製代碼