目錄
列:mybatis項目練習:使用mapper動態代理方式實現各種查詢方式
模糊查詢、數據條數查詢、if與where查詢、array、list、包裝類查詢、一對一查詢、一對多查詢
列:使用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問題總結如下(缺點)
- 數據庫連接創建、釋放頻繁造成系統資源浪費,從而影響系統性能。如果使用數據庫連接池可解決此問題。
- Sql語句在代碼中硬編碼,造成代碼不易維護,實際應用中sql變化的可能較大,sql變動需要改變java代碼。
- 使用preparedStatement向佔有位符號傳參數存在硬編碼,因爲sql語句的where條件不一定,可能多也可能少,修改sql還要修改代碼,系統不易維護。
- 對結果集解析存在硬編碼(查詢列名),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);
}
}
}