mybatis與jdbc的比較、模糊查詢、數據條數查詢、if與where查詢、array、list、包裝類查詢、一對一查詢、一對多查詢

目錄

列:使用jdbc連接數據庫實現查詢數據庫

導入包

sql語句:創建訂單表和用戶表

jdbc方式代碼實現

結果

jdbc問題總結如下(缺點)

mybatis下載

mybatis api地址

列:mybatis項目練習:使用mapper動態代理方式實現各種查詢方式

模糊查詢、數據條數查詢、if與where查詢、array、list、包裝類查詢、一對一查詢、一對多查詢

導包

導入log4j文件 log4j.properties

數據庫連接參數JDBC.properties

SqlMapConfig.xml配置文件

創建po類

實現mapper接口

測試


列:使用jdbc連接數據庫實現查詢數據庫

導入包

sql語句:創建訂單表和用戶表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `orders`訂單表
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) NOT NULL COMMENT '下單用戶id',
  `number` VARCHAR(32) NOT NULL COMMENT '訂單號',
  `createtime` DATETIME NOT NULL COMMENT '創建訂單時間',
  `note` VARCHAR(100) DEFAULT NULL COMMENT '備註',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of orders 插入數據
-- ----------------------------
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', NULL);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', NULL);
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', NULL);

-- ----------------------------
-- Table structure for `user` 用戶表
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用戶名稱',
  `birthday` DATE DEFAULT NULL COMMENT '生日',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性別',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', NULL, '2', NULL);
INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '張小明', NULL, '1', '河南鄭州');
INSERT INTO `user` VALUES ('22', '陳小明', NULL, '1', '河南鄭州');
INSERT INTO `user` VALUES ('24', '張三丰', NULL, '1', '河南鄭州');
INSERT INTO `user` VALUES ('25', '陳小明', NULL, '1', '河南鄭州');
INSERT INTO `user` VALUES ('26', '王五', NULL, NULL, NULL);

jdbc方式代碼實現

寫代碼時導入jdbc的相關包

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcDemo {
	public static void main(String[] args) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			// 加載數據庫驅動
			Class.forName("com.mysql.jdbc.Driver");

			// 通過驅動管理類獲取數據庫鏈接
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "123");
			// 定義sql語句 ?表示佔位符
			String sql = "select * from user where username = ?";
			// 獲取預處理statement
			preparedStatement = connection.prepareStatement(sql);
			// 設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值
			preparedStatement.setString(1, "王五");
			// 向數據庫發出sql執行查詢,查詢出結果集
			resultSet = preparedStatement.executeQuery();
			// 遍歷查詢結果集
			while (resultSet.next()) {
				System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 釋放資源
			if (resultSet != null) {
				try {
					resultSet.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (preparedStatement != null) {
				try {
					preparedStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

結果

jdbc問題總結如下(缺點)

  1. 數據庫連接創建、釋放頻繁造成系統資源浪費,從而影響系統性能。如果使用數據庫連接池可解決此問題。
  2. Sql語句在代碼中硬編碼,造成代碼不易維護,實際應用中sql變化的可能較大,sql變動需要改變java代碼。
  3. 使用preparedStatement向佔有位符號傳參數存在硬編碼,因爲sql語句的where條件不一定,可能多也可能少,修改sql還要修改代碼,系統不易維護。
  4. 對結果集解析存在硬編碼(查詢列名),sql變化導致解析代碼變化,系統不易維護,如果能將數據庫記錄封裝成pojo對象解析比較方便。

mybatis下載

mybaits的代碼由github.com管理,下載地址:https://github.com/mybatis/mybatis-3/releases

下載後文件展示

mybatis api地址

列:mybatis項目練習:使用mapper動態代理方式實現各種查詢方式

模糊查詢、數據條數查詢、if與where查詢、array、list、包裝類查詢、一對一查詢、一對多查詢

導包

導入log4j文件 log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

數據庫連接參數JDBC.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.name=root
jdbc.password=123

SqlMapConfig.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>
	<!--加載資源文件 -->
	<properties resource="JDBC.properties">
	</properties>
	<!-- 別名 -->
	<typeAliases>
		<package name="com.lws.mybatis.po" />
	</typeAliases>
	<environments default="develompent">
		<environment id="develompent">
			<!-- 使用jdbc事務-->
			<transactionManager type="JDBC">
			</transactionManager>
			<!-- 數據庫連接池 -->
			<dataSource type="POOLED">
			   <property name="driver" value="${jdbc.driver}"/>
			   <property name="url" value="${jdbc.url}"/>
			   <property name="username" value="${jdbc.name}"/>
			   <property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>
	<!-- Mapper的位置  Mapper.xml 寫Sql語句的文件的位置 -->
	<mappers>
	<!--<package name="com.lws.user.userdao"/> -->
	 <package name="com.lws"/>

	</mappers>
</configuration>

創建po類

實現mapper接口

UserMapper.java

public interface UserMapper {
public User findUserById(Integer id);
public List<User> findUserByQueryVo(QueryVo vo);//2根據用戶名模糊查詢用戶信息,查詢條件放到QueryVo的user屬性中。
public Integer countUser();//3查詢數據條數
public List<User> selectUserBySexAndUserName(User user);//4 根據姓名或性別查詢用戶(動態sql語句 )
public List<User> selectUserByidsArray(Integer[] id);//5 通過id數組查詢用戶
public List<User> selectUserByidsList(List<Integer> id);//6 通過id列表查詢用戶
public List<User> selectUserByidsPo(QueryVo vo);//7 通過id包裝類查詢用戶
//-------------------------------------------
public List<Orders> selectOrder();//9查詢訂單表所有數據
//10  1對1查詢 根據訂單查詢用戶
public List<Orders> selectOrders();
//11 一對多查詢 根據用戶查詢訂單
public List<User> selectUserList();
}

UserMapper.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.lws.mybatis.mapper.UserMapper">
	<!-- 1 通過id查詢一個用戶 -->
	<select id="findUserById" resultType="User">
		select* from user where id=#{v}
	</select>

    <!-- 2模糊查詢user的生成對象 -->
	<select id="findUserByQueryVo" parameterType="QueryVo" resultType="User">
		select * from user where username like "%"#{user.username}"%"
	</select>
	
	<!-- 3查詢數據條數 -->
	<select id="countUser" resultType="Integer">
	 select count(1) from user
	</select>
	
	<!--4 根據姓名和性別查詢用戶(動態sql語句 )  -->
	<select id="selectUserBySexAndUserName" resultType="User">
	  select * from user
	  <where>
	    <if test="sex!=null and sex!=''">
	    and sex=#{sex}
	    </if>
	    <if test="username!=null and username!=''">
	    and username=#{username}
	    </if>
	  </where>
	</select>
	<!-- 5 通過id數組查詢用戶 -->
	<select id="selectUserByidsArray" resultType="User">
		select * from user
		<where>
			<foreach collection="array" item="id" open="id in(" close=")"
				separator=",">
				#{id}
			</foreach>
		</where>
	</select>
	<!-- 6 通過id列表查詢用戶 -->
	<select id="selectUserByidsList" resultType="User">
		select * from user
		<where>
			<foreach collection="list" item="id" open="id in (" close=")"
				separator=",">
				#{id}
			</foreach>
		</where>
	</select>
	<!--7 通過id包裝類查詢用戶  -->
	<select id="selectUserByidsPo" parameterType="QueryVo"  resultType="User">
		<include refid="mysql"></include>
		<where>
			<foreach collection="ids" item="id" open="id in (" close=")"
				separator=",">
				#{id}
			</foreach>
		</where>
	</select>
	<!--8 動態sql語句  -->
	<sql id="mysql">
	select * from user
	</sql>
		
	<!-- 9 查詢訂單表所有數據  表屬性與po屬性不同-->
<!-- 	<resultMap type="Orders" id="aa">
		<result column="user_id" property="userId" />
	</resultMap>
	<select id="selectOrder" resultType="aa">
		SELECT id, user_id, number, createtime, note FROM orders
	</select>  -->
	
	<!-- 10 一對一關聯 查詢  以訂單爲中心 關聯用戶 -->
	 <resultMap type="Orders" id="cc">
	 	<result column="id" property="id"/>
	 	<result column="user_id" property="userId"/>
	 	<result column="number" property="number"/>
	 	<association property="user" javaType="User">
	 		<id column="user_id" property="id"/>
	 		<result column="username" property="username"/>
	 	</association>
	 </resultMap>
	 <select id="selectOrders" resultMap="cc">
	 	SELECT 	o.id,o.user_id, o.number,o.createtime,u.username 
	 	FROM orders o 
	 	left join user u 
	 	on o.user_id = u.id
	 </select>
	 
	 <!--11 一對多查詢 根據用戶查詢訂單 可以使用左連接、left join: 左連接 on連接條件  -->
	 <resultMap type="User" id="bbb">
	    <id column="user_id" property="id"/>
	    <result column="username" property="username"/>
	    <result column="sex" property="sex"/>
	    <result column="birthday" property="birthday"/>
	    <result column="address" property="address"/>
	    <collection property="orders" ofType="Orders">
	        <id column="oid" property="id"/>
			<result column="number" property="number"/>
			<result column="createtime" property="createtime"/>
			<result column="note" property="note"/>
	    </collection> 
	 </resultMap>
	 <select id="selectUserList" resultMap="bbb">
	 SELECT o.id as oid,  o.user_id,  o.number,o.createtime,u.username
	 FROM user u
	 inner join orders o
	 on o.user_id = u.id
     </select>
	 
	 

</mapper>

測試

public class MybatisMapperTest {
	public SqlSessionFactory sqlSessionFactory;

	@Before
	public void Before() throws IOException {
		// 加載核心配置文件
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		// 創建sqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	}
    @Test
    public void findUserById() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	User u = mapper.findUserById(10);
    	System.err.println(u);
    }
    @Test
    public void findUserByQueryVo() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	QueryVo vo=new QueryVo();
    	User user=new User();
    	user.setUsername("五");
    	vo.setUser(user);
    	
		List<User> u = mapper.findUserByQueryVo(vo);
		for (User user2 : u) {
			System.err.println(user2);
		}
    	
    }
    
    @Test
    public void countUser() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	Integer countUser = mapper.countUser();
    	System.err.println(countUser);
    	
    }
    /**
     * 4 根據姓名或性別查詢用戶(動態sql語句 )
     */
    @Test
    public void selectUserBySexAndUserName() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
        User user=new User();
        user.setSex("1");
//        user.setUsername("張小明");
        List<User> users = mapper.selectUserBySexAndUserName(user);
        for (User user2 : users) {
			System.err.println(user2);
		}
    }
    /**
     * 5 通過id數組查詢用戶
     */
    @Test
    public void selectUserByidsArray() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	Integer[] ids=new Integer[3];
    	ids[0]=24;
    	ids[1]=25;
    	ids[2]=26;
    	List<User> users = mapper.selectUserByidsArray(ids);
    	for (User user2 : users) {
    		System.err.println(user2);
    	}
    }
    /**
     * 6 通過id列表查詢用戶
     */
    @Test
    public void selectUserByidsList() {
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	List<Integer> list=new ArrayList<>();
    	list.add(1);
    	list.add(10);
    	list.add(16);
    	List<User> users = mapper.selectUserByidsList(list);
    	for (User user2 : users) {
    		System.err.println(user2);
    	}
    }
    /**
     *7 通過id包裝類查詢用戶
     */
    @Test
    public void selectUserByidsPo() {
    	System.err.println("7 通過id包裝類查詢用戶");
    	SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    	UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    	QueryVo vo=new QueryVo();
    	List<Integer> ids  = new ArrayList<>();
		ids.add(16);
		ids.add(22);
		ids.add(24);
		vo.setIds(ids);
		List<User> users=mapper.selectUserByidsPo(vo);
    	for (User user2 : users) {
    		System.err.println(user2);
    	}
    }
    	/**
    	 *9查詢訂單表所有數據
    	 */
    	@Test
    	public void selectOrder() {
    		System.err.println("7 通過id包裝類查詢用戶");
    		SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    		UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion幫我生成一個實現類  (給接口)
    		List<Orders> orders = mapper.selectOrder();
            for (Orders o : orders) {
				System.err.println(o);
			}
    	}
      	/**
    	 *10一對一查詢:查詢訂單表所有數據
    	 */
    	@Test
    	public void selectOrders() {
    		System.err.println("7 通過id包裝類查詢用戶");
    		SqlSession sqlSession = sqlSessionFactory.openSession(); //創建SqlSession
    		UserMapper mapper = sqlSession.getMapper(UserMapper.class);//SqlSEssion生成一個實現類  (給接口)
    		List<Orders> orders = mapper.selectOrders();
            for (Orders o : orders) {
				System.err.println(o);
			}
    	}
    	/**
    	 * 11 一對多查詢
    	 */
    	@Test
    	public void selectUserList() {
    		System.err.println("一對多查詢");
    		 SqlSession sqlSession = sqlSessionFactory.openSession();//創建sqlsession
    		 UserMapper mapper = sqlSession.getMapper(UserMapper.class);//使用sqlSession生成mapper
    		 List<User> users= mapper.selectUserList();
    		 for (User user : users) {
				System.err.println(user);
			}
    	}
}

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章