#MybatisPuls基础入门:

MybatisPuls基础入门:

介绍:使用maven搭建

一、环境搭建---配置文件(存放在resources 文件夹下)

1).applicationConetext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
	
	
	<!-- 数据源 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 事务管理器 -->
	<bean id="dataSourceTransactionManager" 
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 基于注解的事务管理 -->
	<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
	
	
	<!--  配置SqlSessionFactoryBean 
		Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean
		MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
	 -->
	<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<!-- 别名处理  修改地方1 实体类路径-->
		<property name="typeAliasesPackage" value="com.web.pojo"></property>
		
		<!--
		   注入全局MP策略配置
		   mp 本身存在 globalConfig ,但我们也需要自己引入
		-->
		<property name="globalConfig" ref="globalConfiguration"></property>
	</bean>
	
	<!--
	   定义MybatisPlus的全局策略配置
	   需要注入到 bean 中才能起作用
	-->
	<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
		<!--
		  在2.3版本以后,dbColumnUnderline 默认值就是true
		    mp 给出了 下划线和驼峰命名 的解决方法
		    例如 : 数据库 : list_name  实体类 listName
		-->
		<property name="dbColumnUnderline" value="true"></property>
		
		<!--
		    全局的主键策略
		    相当于所有的实体类的自增策略是 Type.Auto
		-->
		<property name="idType" value="0"></property>
		
		<!--
		     全局的表前缀策略配置 修改地方三  数据库表名前缀
		      默认访问的数据库的表示 该前缀 + 实体类名称  = 数据库表名

		-->
		<property name="tablePrefix" value="tbl_"></property>

		
		
	
	</bean>
	
	
	<!-- 
		配置mybatis 扫描mapper接口的路径
	 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 修改地方二 mapper接口 -->
		<property name="basePackage" value="com.web.mapper"></property>
	</bean>
	
</beans>

2)jdbc.properties

	jdbc.driver=com.mysql.jdbc.Driver
	jdbc.url=jdbc:mysql://localhost:3306/fenbushi
	jdbc.username=root
	jdbc.password=520

3)log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

4).mybatis-config.xml

<?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>
	
</configuration>

二、环境搭建---所需要依赖

	<dependencies>
    <!-- mp依赖
		 mybatisPlus 会自动的维护Mybatis 以及MyBatis-spring相关的依赖
	 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>2.3</version>
    </dependency>
    <!--junit  测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
    </dependency>
    <!-- log4j 日志记录 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!-- c3p0  数据库连接池-->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.37</version>
    </dependency>
    <!-- spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>

</dependencies>

二、创建数据库表和实体类

1.tbl_user表

注:配置文件中添加了全局前缀策略,使用的好处是使用MP的CRUD 实体类可以不用指定对应的操作的表

操作的表 = 前缀 + 实体类名 

<property name="tablePrefix" value="tbl_"></property>

2.实体类

 public class User {
    /**
     * TableId
     *    value:表示 主键的列名,如果数据库表中的列名等于实体类的名称可以省略
     *    type:主键自增
     *
     * */
    @TableId(value = "uid",type = IdType.AUTO)
    private Integer uid;
    private String username;
    private String userAge;
    private String usersex;
    private String password;
}

注:该配置文件开启了 下划线转驼峰命名的配置,所以该实体类中的 userAge 对应数据库表名中的 user_age,(如果操作的mp依赖是2.3版本以上的则自动默认是开启的);

<property name="dbColumnUnderline" value="true"></property>

3.创建mapper接口并实现 BaseMapper<>

BaseMapper中提供了大部分该对象的CRUD的方法

 public interface UserMapper  extends BaseMapper<User> {}

三、操作

1.在测试类中设置成员属性

// 读取配置文
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean容器中的 userMapper接口
private UserMapper userMapper = ioc.getBean("userMapper",UserMapper.class);

2.查看是否连接上数据库

 @Test
public void testDataScoure(){
    // 获取配置文件中的datasource
    DataSource ds = ioc.getBean("dataSource",DataSource.class);

    // 查看时否连接上
    System.out.println(ds);

    try {
        // 连接信息
        Connection connection = ds.getConnection();
        System.out.println(connection);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

1.添加:insert

// 添加一个 班级信息
@Test
public void insertClazz(){
    User user = new User();
    user.setUsername("土豆");
    user.setPassword("123");
    user.setUserAge("23");
    Integer insert = usermapperMapper.insert(user);
    System.out.println("影响条数:"+ insert);
	System.out.println("主键id:"+ user.getUid());
}

2.添加:insertAllColumn

   // 添加一个 班级信息
@Test
public void insertClazz(){
    User user = new User();
    user.setUsername("黄瓜");
    user.setPassword("123");
    user.setUserAge("23");
    Integer insert = usermapperMapper.insertAllColumn(user);
    System.out.println("影响条数:"+ insert);
}

总结一:

  • insert:方法中自带非空判断,没有属性的属性不会添加。且如果数据不全,能添加到数据库但是没有返回值。
  • insertAllColumn:添加的时候没有非空半段,会将所有的属性都添加到数据库。
  • 除了查询每个方法都会返回数据库中影响的条数,添加还会放回出添加到数据库的字段并将该值赋值到添加的类中。

3.修改 updateById通过id进行修改

@Test
public void update(){
    User user =new User();
    user.setUid(1);
    user.setPassword("123");
    user.setUsername("小花");
    Integer update = userMapper.updateById(user);
    System.out.println("影响条数:" + update);
}

该方法具有非空判断,只会修改属性不为空的字段

4.修改 updateAllColumnById 覆盖式修改

  @Test
public void updateColumn(){
    User user =new User();
    user.setId(1);
    user.setPassword("123");
    user.setUsername("土豆");
    Integer update = userMapper.updateAllColumnById(user);
    System.out.println("影响条数:" + update);
}

这个方法相当于覆盖,如果部分属性没有值,这个方法执行后数据库的这些属性将会变为空值

5.通过id 查询数据

 /**
 * 查询方法 selectById
 * */
@Test
public void selectById(){
    User user = userMapper.selectById(1);
    System.out.println("id为1 的记录 :" + user);
}

6. selectOne :通过实体类中非空属性进行查询

/**
 * 查询 selectOne
 *
 * */
@Test
public void selectOne(){
    User user1 = new User();
    user1.setUsername("赵小花");
    User user2 = userMapper.selectOne(user1);
    System.out.println("id为1 的记录 :" + user2);
}

注:如果实体类中的属性不为空,则会默认为查询的一个条件
坑:如果查询的时候某些属性都是有许多相同的,查询的时候会报错。因为该方法只能返回条数据

7. selectBatchIds :通过id集合查询数据(参数为集合类型)

 /**
 * 查询 selectBatchIds
 *
 *    通过id 集合查询数据
 * */
@Test
public void selectByIds(){
    List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    ids.add(2);
    List<User> users = userMapper.selectBatchIds(ids);
    System.out.println("id为1 的记录 :" + users);
}

8. selectByMap :map集合封装的数据查询数据(参数为map集合)

/**
 *map集合封装的数据查询数据(参数为map集合)	
 *    
 * */
@Test
public void selectMap(){
   Map<String,Object> map = new HashMap<String,Object>();
   map.put("username","赵小花");
   map.put("user_age","25");
   map.put("password","123");
   List<User> users = userMapper.selectByMap(map);

    System.out.println("查询结果:" + users);
}

注:map中的主键对应的数据库表中的字段,不是实体类中的属性

Wrapper的实现了类有 EntityMapper 和 Condition

9.selectList 条件构造器查询数据

/**
 * 条件构造器 条件查询
 *
 *  降序查询数据
 *
 * */
@Test
public void selectByWrapper1(){

    List<User> users = userMapper.selectList(
            new EntityWrapper<User>().eq("password", "123")
                                     // 两者存起一就好好 推荐使用第一个
                                     // .orderDesc(Arrays.asList(new String[] {"user_age"})) // orderDesc 和 orderAsc 的参数都是 集合可以借助Arrays完成数据操作
                                      .orderBy("user_age") // 默认的是升序 不是降序 可以使用 last 注入自定义的sql 语句
                                      .last("desc limit 1,3")// last 表示 在sql后面拼接sql语句 这样就无法防止sql注入
    );

    System.out.println(users);
}

10.selectList: Condition条件构造

/**
 * 条件构造器 条件查询
 *
 *  降序查询数据
 *
 * */
@Test
public void selectByWrapper1(){

    List<User> users = userMapper.selectList(
            Condition.create().eq("password", "123")
                                     // 两者存起一就好好 推荐使用第一个
                                     // .orderDesc(Arrays.asList(new String[] {"user_age"})) // orderDesc 和 orderAsc 的参数都是 集合可以借助Arrays完成数据操作
                                      .orderBy("user_age") // 默认的是升序 不是降序 可以使用 last 注入自定义的sql 语句
                                      .last("desc limit 1,3")// last 表示 在sql后面拼接sql语句 这样就无法防止sql注入
    );

    System.out.println(users);
}

总结 :Condition 和EntityWarpper 的不同之处在于

  • Condition是通过 create()方法创建出来的
  • EntityWarpper是需要new出来的

11.selectPage: 条件+分页查询

/**
 * 条件构造器 分页条件查询
 *
 *  需求 性别为男  姓名为 xxx的用户  年龄在 11   到 25之间的用户信息
 *  每页显示 2条数据
 *
 * */
@Test
public void selectByWrapper2(){
    List<User> users = userMapper.selectPage(new Page<User>(1, 2),
            new EntityWrapper<User>().between("user_age", "11","25")
                    .eq("usersex", "男")
                    .eq("username", "张三"));

    System.out.println(users);
}

12.update: 条件构造器记性修改

  	/**
     * 条件构造器 条件查询
     * 修改密码为 123,姓名为张三 或 姓名包含五的人的密码为6666
     * 
     * */
    @Test
    public void updateWrapper(){
        User user =  new User();
        user.setPassword("6666");

        Integer update = userMapper.update(user, new EntityWrapper<User>().eq("password", "123")
                .eq("username", "张三")
                .or() // 后面又是 条件组合
                .like("username", "五"));

        System.out.println("影响条数:" + update);
    }

13.update: 条件构造器记性修改

  	/**
     * 条件构造器 条件查询
     * (修改密码为 123,姓名为张三 )或 (姓名包含五密码为111得人),人的密码为6666
     * 
     * */
    @Test
    public void updateWrapper(){
        User user =  new User();
        user.setPassword("6666");

        Integer update = userMapper.update(user, new EntityWrapper<User>().eq("password", "123")
                .eq("username", "张三")
                .orNew() // 后面又是 条件组合
                .like("username", "五")
                .eq("username","111"));
        System.out.println("影响条数:" + update);
    }

小结:

  • or()表示的是这个条件和前面的条件是平级关系
  • orNew()表示的是后面的是后者的另一个条件(条件组合)

14.deleteById:通过id删除信息

/**
     * 删除 deleteById(Id)
     *
     * */
    @Test
    public void deleteById(){
        Integer integer = userMapper.deleteById(1);
        System.out.println("影响条数:" + integer);
    }   

15. deleteBatchIds:通过id的集合删除数据(查询相似)

 /**
 * 删除 deleteBatchIds(List supper)
 *   ids 的集合
 * */
@Test
public void deleteBatchIds(){
   List<Integer> list = new ArrayList<Integer>();
   list.add(2);
   list.add(4);
   Integer integer = userMapper.deleteBatchIds(list);
   System.out.println("影响条数:" + integer);
}

16.deleteMap删除 (和selectMap使用相似)

/**
 * 删除 deleteByMap(Map supper)
 *   map中的主键仍然是数据库表的字段
 * */
@Test
public void deleteByMap(){
    Map<String,Object> map = new HashMap<String, Object>();
    map.put("usernmame","张三");
    map.put("password","123");
    Integer integer = userMapper.deleteByMap(map);
    System.out.println("影响条数:" + integer);
}

17.delete:条件构造删除

/**
 * 条件构造器 条件删除
 *删除年龄等于 23 或姓名包含五的数据
 *
 * */
@Test
public void deleteWrapper(){
    Integer delete = userMapper.delete( new EntityWrapper<User>().eq("password", "123")
            .eq("user_age", "23")
            .orNew() // 后面又是 条件组合
            .like("username", "五"));

    System.out.println("影响条数:" + delete);
}
posted @ 2019-11-22 21:04  落叶尘纷  阅读(340)  评论(0编辑  收藏  举报