新建的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
感谢您的支持与鼓励,望能获得您的关注与点赞,写博客容易,坚持不易!!!加油。。。
复制代码